如何在LALR(1)语法分析器中调整运算符优先级修改算术表达式运算顺序
你现有的语法规则默认是*//优先级高于+/-,因为乘法运算绑定在更接近终结符的T产生式层级,语法分析时会先归约下层产生式,对应更高的运算优先级。如果要让+/-优先级高于*//,只需要把两类运算符的产生式层级调换即可。
修改后的语法规则
// 乘法、除法移到上层产生式E E -> E ('*' | '/') T E -> T // 加法、减法移到中层产生式T T -> T ('+' | '-') F T -> F F -> '(' E ')' F -> int
原理解释
- 调整后
+/-所在的T层级比*//所在的E层级更接近底层的F,分析时会先归约加法、减法的产生式,自然获得更高的优先级 - 以
1 * 1 + 2为例,分析过程会先把1 + 2归约为T,再和前面的1做乘法运算,完全符合你的需求 - 如果你使用Yacc/Bison这类LALR分析器生成工具,也可以不修改语法结构,直接通过优先级声明调整,添加如下声明即可(优先级声明从上到下优先级逐行升高):
%left '*' '/' %left '+' '-'
内容的提问来源于stack exchange,提问作者ishaangupte
相关产品推荐
相关产品推荐

