如何在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词法规则里没有匹配=的规则,遇到=会返回UNKNOWNtoken,会导致赋值逻辑无法正常触发。
修复方案
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
相关产品推荐
相关产品推荐

