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转义的")
用修正后的语法解析你的目标输入,即可正确识别(...) OR (...)的嵌套逻辑结构,不会再出现extraneous input '('的错误。
内容的提问来源于stack exchange,提问作者Karijma
相关产品推荐
相关产品推荐

