为何基于该语法无法解析`return 1`语句?
语法解析器数字解析失败的问题排查与解决思路
看起来你遇到的问题核心是语法规则和词法token不匹配,咱们一步步拆解:
首先看你代码里的关键矛盾点:
- 词法分析器里,十进制数字
{decNum}返回的是DECtoken,并且打印"dec" - 但语法分析器里的
Num产生式写的是:Num : HEX | INT
这里的INT是你定义的关键字token(对应代码里的int关键字),而不是十进制数字的token!
这就直接导致:当词法返回DEC(数字1)时,语法规则里根本没有对应的规则来接收它——Num只认HEX和INT(关键字),Term里的Num分支自然匹配失败,进而整个Expr→Stat的规则链断裂,直接触发语法错误。
而输入1里的ho1是ID token,Term里有明确的ID分支,所以规则链能正常走通,这就是为什么标识符没问题但数字不行。
具体解决步骤
1. 修正Num产生式(核心修复)
把语法解析器里的Num规则改成:
Num : HEX | DEC ;
这样就能匹配词法返回的DEC(十进制数字)和HEX(十六进制数字)了。
2. 排查其他潜在小问题
- 你词法里定义了
{number}规则但没用到,可以删掉,避免混淆 - 词法里的
{newline}处理放在了<INITIAL>块外面,这会导致在InComment状态下换行也会增加line_number,如果需要准确统计代码行号,建议把{newline}移到<INITIAL>块内,或者在InComment里单独处理(如果不需要统计注释行的话) - 关于你尝试加
error规则导致移进-归约冲突:Bison的错误恢复规则需要谨慎放置,建议先解决核心的token匹配问题后,再考虑在合适的位置(比如Stats、Expr的末尾)添加错误恢复,避免破坏原有规则的优先级。
验证方法
修改后重新编译:
make clean && make
然后测试输入2:
echo "class x implements x: method hi() return 1 /* hi*/; end; end;" | ./parser
应该就能正常解析了。
内容的提问来源于stack exchange,提问作者Fabian Schneider
相关产品推荐
相关产品推荐

