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

ANTLR简单表达式语法解析负数场景报错求助

问题原因

你当前的ANTLR语法触发错误的核心是一元负号的结合性未明确声明,ANTLR4处理带直接左递归的表达式规则时,未指定右结合的一元运算符会被优先级规则误判,导致-开头的表达式无法被正确匹配。另外你当前语法里MOD运算符的优先级设置错误,被放在了加减运算符之后,不符合常规运算逻辑。

修复方案

仅需要调整expr规则的分支顺序,同时给一元负号明确右结合属性即可:

expr:
    <assoc=right> MIN expr  // 明确一元负号右结合,保持最高优先级
    | expr ( MUL | DIV | MOD ) expr // 把MOD调整到和乘除同优先级
    | expr ( ADD | MIN) expr
    | NUM
    | ID
    | STRING
    | function
    | '(' expr ')'
;

验证效果

修改后:

  • 单个负数-1.344会被正确解析为一元负号作用于数字1.344
  • 函数调用abs(-1.324)内的负数参数会被识别为合法的expr表达式,不再抛出匹配错误

额外注意你贴出的代码中STRING规则里的&quot;是HTML转义后的内容,实际编写语法时要替换为普通双引号"。

内容的提问来源于stack exchange,提问作者Veryon890

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:42:03