WEB开发网
开发学院操作系统Linux/Unix 使用 yacc 和 lex 编写文本分析器 阅读

使用 yacc 和 lex 编写文本分析器

 2008-11-13 08:32:06 来源:WEB开发网   
核心提示: 当使用上述的规则集对公式 4+5*6 进行计算时,yacc 首先尝试 add_expr,使用 yacc 和 lex 编写文本分析器(9),然后被重定向到 mul_expr(作为匹配的第一条规则),并且又被重定向到 primary,还有一些附加函数和选项用以帮助定义其他的 C 源代码,完整的

当使用上述的规则集对公式 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 */

上一页  4 5 6 7 8 9 10  下一页

Tags:使用 yacc lex

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接