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

如何在Bison/Yacc中调整运算优先级?%left配置不生效问题排查

问题排查:Bison配置优先级后四则运算结果仍错误

问题背景

自研简易计算器语言过程中,已配置四则运算优先级声明,但1 + 2 * 3计算结果仍为9,不符合预期的7。

已配置优先级规则

%left ADD SUB
%left MUL DIV

问题根因

  • 未在Bison中声明四则运算符对应的token:Bison的%token声明段中没有将ADD、SUB、MUL、DIV声明为token,优先级声明无法绑定到对应运算符,因此配置不生效。
  • Flex未处理赋值符号=:赋值规则中用到了=符号,但Flex词法规则里没有匹配=的规则,遇到=会返回UNKNOWN token,会导致赋值逻辑无法正常触发。

修复方案

1. 修改Bison的token声明

在Bison文件的%token段补充四则运算符的声明:

%token EXIT UNKNOWN NEWLINE
%token <data> PRINT
%token <name> ID
%token <data> NUMBER
+ %token ADD SUB MUL DIV

2. 修改Flex的词法规则

在Flex规则段补充=的处理逻辑:

[ \t]       {;}
"+"         {return ADD;}
"-"         {return SUB;}
"*"         {return MUL;}
"/"         {return DIV;}
"="         {return '=';}
.           {return UNKNOWN;}

3. 重新编译项目

重新执行bison、flex命令生成对应解析代码后,再编译整个项目即可生效。

内容的提问来源于stack exchange,提问作者Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:09:02