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

ANTLR 4.4中实现非贪婪匹配的语法解析问题

解决ANTLR 4.4中操作符被操作数贪婪匹配的问题

你遇到的核心问题是ANTLR词法分析的最长匹配原则和规则优先级导致的——你的ALPHA_NUMERIC_WS规则太宽泛,且定义在操作符规则之后,导致本该属于operator的"in"被leftOperand一并吞掉了。下面给你具体的修复方案:

问题根源

ANTLR词法分析器遵循两个核心规则:

  1. 最长匹配:多个规则都能匹配当前输入时,会选匹配长度最长的那个。
  2. 规则优先级:匹配长度相同时,优先选择先定义的规则。

你的ALPHA_NUMERIC_WS允许空格、字母、数字的任意组合,"Active Indicator in"整个字符串都能被它匹配,且长度远大于单独的"in"。再加上ALPHA_NUMERIC_WS定义在IN规则之后,词法分析器自然会优先把整个序列识别成leftOperand,让operator规则完全没机会触发。

修复方案

核心思路是让操作符规则拥有更高优先级,同时限制ALPHA_NUMERIC_WS的匹配范围,避免它误吞操作符。调整后的语法如下:

grammar Test;

condition: leftOperand WHITESPACE* operator;
leftOperand: ALPHA_NUMERIC_WS ;
operator: EQUALS | NOT_EQUALS | IN | NOT_IN;

// 操作符规则前置,确保优先匹配
IN : 'in';
NOT_IN : 'not' WHITESPACE 'in';
EQUALS : '=';
NOT_EQUALS : '!=';

// 优化规则,确保只匹配空格分隔的单词/数字,不会包含操作符
ALPHA_NUMERIC_WS: WORD (WHITESPACE WORD | DIGIT)*;
WORD: (LOWERCASE | UPPERCASE )+ ;
WHITESPACE : (' ' | '\t')+ -> skip; // 跳过空格,简化语法处理

fragment DIGIT: '0'..'9' ;
LOWERCASE : [a-z] ;
UPPERCASE : [A-Z] ;

关键修改说明

  1. 调整规则顺序:把IN、NOT_IN等操作符移到最前面,输入中出现"in"时,词法分析器会优先匹配IN规则,而非把它作为ALPHA_NUMERIC_WS的一部分。
  2. 优化ALPHA_NUMERIC_WS:修改为WORD (WHITESPACE WORD | DIGIT)*,确保它只能匹配空格分隔的单词或数字组合,从语法层面避免吞掉操作符。
  3. 处理空格:给WHITESPACE加上-> skip,语法分析阶段无需手动处理空格,让规则更简洁(如果需要保留空格在leftOperand中,可去掉该配置)。

测试效果

当输入Active Indicator in ("A", "D", "S")时,词法分析器会正确识别:

  • leftOperand:ALPHA_NUMERIC_WS类型,值为Active Indicator
  • operator:IN类型,值为in

完全符合你的预期,解决了贪婪匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:38:03