使用 yacc 和 lex 编写文本分析器
2008-11-13 08:32:06 来源:WEB开发网当使用上述的规则集对公式 4+5*6 进行计算时,yacc 首先尝试 add_expr,然后被重定向到 mul_expr(作为匹配的第一条规则),并且又被重定向到 primary。primary 规则设置了表达式中相应数字的值。$$ 有效地设置了那部分表达式的返回值。
在匹配了这些数字之后,yacc 根据下面这行定义识别了一个乘法表达式:| mul_expr MUL primary { $$ = $1 * $3; },它设置了原始表达式中的 5*6 部分的返回值。Yacc 生成代码以执行相应的计算(提取前面由 primary 规则设置的值),并使用计算的结果值替换输入表达式的原始部分。这就意味着 yacc 现在需要匹配下面的表达式: 4+30。
它可以使用下面的规则匹配这个表达式:| add_expr PLUS mul_expr { $$ = $1 + $3; },这将最终计算出最后的结果 34。
彻底地研究语法定义
语法定义设置了相应的规则,用于分析输入标记及其格式和布局,并将其转换为可以使用的信息。在任何时候都请记住,这里定义的规则集是告诉 yacc 如何识别输入并执行一段 C 代码。yacc 工具生成所需的 C 代码来分析该信息,而并不是由 yacc 来完成分析工作。
大括号中的代码是 quasi-C 源代码。Yacc 根据您给出的定义将原始文件转换为相应的 C 源代码以及分析具体内容所需的其他的代码。
除了定义如何分析输入内容的规则集之外,还有一些附加函数和选项用以帮助定义其他的 C 源代码。完整的 yacc 定义文件的基本格式类似与 lex/flex 所使用的格式,如下面的清单 9 所示。
清单 9. Yacc 文件格式
%{
/* Global and header definitions required */
%}
/* Declarations (Optional token definitions) */
%%
/* Parsing ruleset definitions
%%
/* Additional C source code */
更多精彩
赞助商链接