Bison产生式规则问题:CASE分支缺失必填OTHERS子句未触发语法错误
语法配置问题排查及解决方案
核心原因:前置语法错误触发了解析器错误恢复逻辑
你提供的测试用例中,第11行when => 2;本身存在语法错误(缺少INT_LITERAL),Yacc/Bison 解析到该错误时会触发默认的错误恢复机制:持续丢弃后续 token 直到找到能匹配当前解析状态的同步记号,本次恢复过程直接跳过了所有内容直到匹配到ENDCASE,因此根本没有执行到OTHERS分支的存在性检查,自然不会报缺失默认分支的错误。
你可以编写仅缺失OTHERS分支、其余语法完全正确的最小测试用例验证,示例如下:
function main : integer returns integer; begin case 1 is when 1 => 2; when 2 => 3; endcase; end;
此时运行编译就会触发unexpected ENDCASE, expecting OTHERS的语法错误,符合你预期的校验逻辑。
可选优化及排查点
- 如果你的语法设计要求
CASE语句至少包含一个WHEN分支,可以调整cases规则,移除空产生式的右递归写法,避免出现0个WHEN分支的合法匹配:
cases: case | case cases ;
- 排查词法分析器(.l文件)中
OTHERS关键字的识别逻辑,确认token拼写、大小写和.y文件中的定义完全一致,避免关键字被误识别为普通标识符导致匹配失效。
内容的提问来源于stack exchange,提问作者ryanwaite28
相关产品推荐
相关产品推荐

