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

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

 2008-11-13 08:32:06 来源:WEB开发网   
核心提示: 您已经了解了基本的语法规范,那么还需要了解如何组合多个序列以及它们的优先级,使用 yacc 和 lex 编写文本分析器(8),语法序列和优先级在大多数语言中,无论是文本型、数学运算型,依此类推,直到该表达式被解析,还是编程型的语言,通常对于不同的短语都有某种优先级或重要性

您已经了解了基本的语法规范,那么还需要了解如何组合多个序列以及它们的优先级。

语法序列和优先级

在大多数语言中,无论是文本型、数学运算型,还是编程型的语言,通常对于不同的短语都有某种优先级或重要性,这将使得它们与类似的但不同的组合相比具有相应的优先权。

例如,在大多数编程语言的数学运算表达式中,乘法具有比加法或减法更高的优先级。例如,表达式:4+5*6 将计算为: 4+30。

这将得到最终的计算结果 34。其原因是首先进行乘法操作(5 乘以 6 等于 30),然后将其结果用于最后的计算过程,即加上 4 后得到结果 34。

在 yacc 中,通过定义多个语法序列组并将它们连接在一起,就可以定义相应的优先级,不同表达式在组中的顺序可以帮助定义其优先级。在清单 8 中,您可以看到用于定义上述行为的代码。

清单 8. 连接语法并提供优先级

add_expr: mul_expr
    | add_expr PLUS mul_expr { $$ = $1 + $3; }
    | add_expr MINUS mul_expr { $$ = $1 - $3; }
    ;
mul_expr: primary
    | mul_expr MUL primary { $$ = $1 * $3; }
    | mul_expr DIV primary { $$ = $1 / $3; }
    ;
primary: NUMBER { $$ = $1; }
    ;

yacc 执行所有表达式计算都是从左到右进行处理的,所以对于与原始示例类似的复合表达式(例如,4+5*6),yacc 将根据相应的规则查找最佳匹配,即与表达式中的一部分匹配。

根据规则所定义的顺序,自上而下进行匹配处理。所以,该处理过程首先试图匹配 add_expr 中的语法规则。然而,因为乘法具有更高的优先级,所以这些规则表明 yacc 应该首先尝试 mul_expr。这将迫使 yacc 首先根据乘法语句进行匹配(在 mul_expr 中进行定义)。如果匹配失败,然后它将尝试 add_expr 块中的下一条规则,依此类推,直到该表达式被解析,或者没能找到任何匹配并生成一个错误。

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

Tags:使用 yacc lex

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