如何消除ANTLR文法规则中的相互左递归问题
解决方案
你遇到的是ANTLR不支持的间接(相互)左递归问题,通过规则分层拆解就能解决,不需要穷举所有组合,调整后的文法结构如下:
// 原子数值项:无运算逻辑的基础数值单元 number_atom : number_column | number_function | digit_constant ; // 前缀运算/括号表达式层:处理前缀运算符、括号包裹逻辑 number_unary : prefix_operator number_unary | LEFT_PAREN number_expression RIGHT_PAREN | number_atom ; // 中缀运算层:处理多操作数的中缀运算逻辑 number_expression : number_unary (number_operator number_unary)* ; // 保留原有的数值函数规则 number_function : COUNT LEFT_PAREN number_expression RIGHT_PAREN ;
规则说明
- 所有规则统一按照「基础原子 -> 单目运算 -> 多目运算」的层级从低到高定义,只会出现高层引用低层,完全消除了跨规则的相互引用
- 天然符合常规运算优先级:括号 > 前缀运算符 > 中缀运算符,后续如果需要拆分中缀运算优先级(比如区分加减、乘除),只需要在
number_expression和number_unary之间新增对应层级的规则即可,扩展性很高 - 原来所有需要用到
number_argument的位置,直接替换为number_expression即可,原有语法的匹配能力完全不会受影响
内容的提问来源于stack exchange,提问作者KVM
相关产品推荐
相关产品推荐

