背景
项目中要使用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