Yacc(Bison)语法解析报错:输入=却提示期待=符号求助
问题根源与解决方法
核心问题
你的Flex词法分析器没有将=符号返回给Yacc解析器,导致解析器从未接收到=这个关键token,因此一直报错"expecting ="。
具体看Flex代码中的assign规则:
{assign} {printf("Assignment Operator\n");}
这里只打印了日志,但没有返回任何token给Yacc。Yacc的语法规则S : id "=" E期望接收到'='字符token,但Flex根本没传递这个信号,解析器自然认为=从未出现。
另外,你的arith规则同样存在这个问题:匹配到+、-等运算符时,只打印日志不返回对应token,后续测试a=5+6这类带加减的表达式也会失败。
修复步骤
1. 修复Flex的运算符返回逻辑
修改Flex中assign和arith的处理块,添加对应的token返回语句:
{assign} { printf("Assignment Operator\n"); // 对于单纯的=,直接返回'=';如果需要支持复合赋值(如+=),需在Yacc中扩展语法 if (strcmp(yytext, "=") == 0) { return '='; } // 其他复合赋值可根据需求处理,暂时忽略或报错 } {arith} { printf("Arithmetic Operator\n"); // 返回对应的运算符字符 return yytext[0]; }
2. 修正INT的正则匹配(可选但重要)
当前Flex中INT的正则是[-]?[0-9]+,会直接匹配带负号的整数(如-4),但Yacc语法中已经定义了一元负号UMINUS规则,应该让Flex只匹配非负整数,负号交给Yacc处理:
INT [0-9]+
这样输入-4时,Flex会先返回'-' token,再返回INT token,Yacc就能正确匹配"-" E %prec UMINUS规则。
3. 验证修改效果
修复后,测试a=0时,Flex会依次返回:
idtoken(对应a)'='tokenINTtoken(对应0)
Yacc解析器就能正确匹配S : id "=" E规则,不会再报错。
额外注意点
- 你的Yacc代码中定义了
IDtoken但从未使用,建议清理冗余定义,避免混淆。 - 确保
strdup的内存后续正确释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Stack Overflow
相关产品推荐
相关产品推荐

