Flex&Bison计算器解析器取模运算输出异常问题求助
解决Flex/Bison取模运算输出异常的问题
看起来你在取模运算的语义动作处理上出了个小疏漏——毕竟其他运算和复杂表达式都正常,唯独取模时输出缺了右操作数,还把运算符放前面了,我帮你梳理下最可能的原因和修复办法:
最可能的问题:Bison规则里的操作数顺序/取值错误
你现在的输出比如% 10,明显是只把运算符和左操作数拼了进去,完全没处理右操作数。这大概率是你在Bison中定义取模运算的规则时,语义动作里没用到右操作数的$3,或者把操作数顺序搞反了。
举个例子,假设你原来的Bison规则是这样的(错误版):
expr: expr '%' NUMBER { // 错误:只取了运算符$2和左操作数$1,丢了右操作数$3 $$ = create_expr_node($2, $1); // 或者如果是直接输出字符串:sprintf($$, " %s %d", $2, $1); };
那正确的写法应该把右操作数$3也加进去,比如:
expr: expr '%' NUMBER { // 正确:同时传入左操作数$1、运算符$2、右操作数$3 $$ = create_expr_node($1, $2, $3); // 直接输出字符串的话:sprintf($$, "%d %s %d", $1, $2, $3); };
这里要注意Bison的规则符号对应:expr '%' NUMBER里,$1是左边的expr(也就是第一个操作数,比如10),$2是%运算符,$3是右边的NUMBER(比如5)。你的错误写法里只用到了$1和$2,自然输出就缺了右操作数,还可能因为拼接顺序导致运算符跑到前面。
其他可以排查的小点
虽然其他运算正常,但可以快速排除这两个可能性:
- Flex的数字语义值传递:检查Flex里数字的规则,比如
[0-9]+ { yylval.num = atoi(yytext); return NUMBER; },确保yylval的赋值是正确的(不过其他运算正常的话,这个大概率没问题)。 - 取模的优先级设置:在Bison的
%left/%right声明里,要把%和*//放在同一优先级组,比如%left '*' '/' '%',优先级不对只会影响运算顺序,不会导致输出结构异常,但顺手确认下更稳妥。
总结
因为你复杂表达式能得到正确结果,说明整体的语法分析框架是没问题的,核心就是取模运算对应的Bison规则语义动作里,没有正确处理右操作数$3。调整这个部分,把右操作数加入到你的输出结构或者AST构建里,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Siech0
相关产品推荐
相关产品推荐

