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

ANTLR G4语法输入验证报错,请求技术支持

问题排查与修正

你的语法报错核心原因是expr规则定义错误,尤其是'(' expr ')' expr这条规则——它要求括号包裹的表达式必须直接紧跟另一个表达式,不允许中间出现AND/OR这类逻辑运算符,完全不符合你输入的带括号逻辑表达式结构。同时原语法未明确逻辑运算符优先级,会导致解析歧义。

修正后的Exp.g4语法

grammar Exp;

options {
  language = Java;
}

start
  :  expr EOF
  ;

// 按优先级从低到高:OR > AND > NOT > 括号/原子表达式
expr
  :  expr OR expr          # OrExpr
  |  expr AND expr         # AndExpr
  |  NOT expr              # NotExpr
  |  '(' expr ')'          # ParenExpr
  |  entity                # EntityExpr
  |  VALUE                 # ValueExpr
  ;

entity
  :  KEY comp VALUE
  |  KEY list_op list
  |  KEY exists_op
  ;

list
  :  '(' (VALUE (',' VALUE)*)? ')'
  ;

list_op
  :  BETWEEN
  |  NOT_BETWEEN
  |  IN
  |  NOT_IN
  |  CONTAINS
  |  NOT_CONTAINS
  ;

exists_op
  :  EXISTS
  |  NOT_EXISTS
  ;

comp
  :  EQ
  |  NEQ
  |  GT
  |  LET
  |  GTE
  |  LETE
  ;

VALUE        :  '"' .*? '"';
KEY          :  '[' .*? ']';
OR           : 'OR';
AND          : 'AND';
NOT          : 'NOT';
ENTITY       : 'ENTITY';
NOT_CONTAINS : 'NOT_CONTAINS';
CONTAINS     : 'CONTAINS';
NOT_IN       : 'NOT_IN';
IN           : 'IN';
NOT_BETWEEN  : 'NOT_BETWEEN';
BETWEEN      : 'BETWEEN';
NOT_EXISTS   : 'NOT_EXISTS';
EXISTS       : 'EXISTS';
LETE         : '<=';
GTE          : '>=';
LET          : '<';
GT           : '>';
NEQ          : '!=';
EQ           : '=';
WS           :  [\t\r\n ]+ -> channel(HIDDEN);

关键修改说明

  • 移除原expr规则中错误的'(' expr ')' expr和expr ENTITY expr(若你的场景需要ENTITY运算符,请补充具体使用逻辑后再调整),按优先级分层重构表达式结构,确保AND/OR能正确连接括号表达式
  • 为每个表达式分支添加标签(如# OrExpr),方便后续生成AST时识别节点类型
  • 修正VALUE规则的引号写法(ANTLR中直接用"即可,无需HTML转义的&quot;)

用修正后的语法解析你的目标输入,即可正确识别(...) OR (...)的嵌套逻辑结构,不会再出现extraneous input '('的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:05:24