背景
项目中要使用C++或C语言解析JSON格式的数据,把解析的结果放到一个通用的数据结构。作为web服务层(这一层大家可以认为是类似于PHP服务器或webpy的服务器容器)到web页面层(这一层是语法类似PHP脚本或者tornardo模板)的数据传输的协议。如果使用类似rapidJson或者是jsoncpp之类的Json解析器,相当于我们要做:
JSON文档 -> json DOM -> 通用数据结构。
而如果手写解析器,只需要做:
JSON文档 -> 通用数据结构。
少一层转换能换来很多效率的提升。
解释一下什么是DOM,这是Data Object Model的缩写。
注意Lex/Yacc已经被flex和bison取代了。
词法分析器flex:把字符解析成token;
语法分析器bison:把token解析成语法树。
甜点
先看看flex+bison组合如何处理4则计算。
此例子来自flex和bison的入门教程,写得很好。
flex一般用.l作后缀。例如calc.l。它标准格式是3段。第1段写注释以及包含预处理头文件,第2段描述解析token的规则,第3段实现具体处理代码;
%{
#define YYSTYPE double
#include "calc.tab.h"
#ifdef CALC_LEX
YYSTYPE yylval;
#endif
%}
%%
"

本文探讨了在C++或C项目中,为优化JSON数据解析效率,选择手动编写解析器而非使用现成库的方法。通过直接将JSON转换为通用数据结构,减少了一层DOM转换,提升了性能。介绍了词法分析器flex和语法分析器bison的使用,并提供了简单的四则运算处理示例。作者还承诺在未来补充关于编译原理的深入学习心得。
最低0.47元/天 解锁文章
6150

被折叠的 条评论
为什么被折叠?



