You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何消除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:09:02