You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:06:08