ANTLR skip规则生效时机及TEST token匹配异常问题咨询
ANTLR匹配规则分析及问题解决
核心规则说明
ANTLR遵循最长匹配原则(Maximal Munch):匹配token时,会优先选择能匹配最长输入序列的规则;若多个规则匹配的序列长度相同,则先定义的规则优先生效。带-> skip的规则匹配到的token会被直接丢弃,不参与后续语法分析。
问题原因分析
1. 最长匹配原则导致WS优先匹配
你的输入为\n+4个空格+|:
- WS规则
[ \t\r\n]+可匹配从\n到最后一个空格的全部5个字符(长度5),匹配后直接跳过。 - 原TEST规则仅能匹配
\n+1个空格+|(长度3),远短于WS的匹配长度。
根据最长匹配原则,ANTLR会优先用WS处理前5个字符,剩下的|无规则可匹配,因此触发token recognition error。
2. TEST规则写法错误
你试图用[\t | ' ']匹配“制表符或四个空格”,但字符类[]仅能匹配单个字符,该写法实际是匹配制表符、竖线、单引号、空格这些单个字符,完全无法实现“匹配四个空格”的需求。
解决方法
方案一:修正TEST规则结构并利用长度优先级
将TEST规则改为匹配完整的目标序列(换行+制表符/四个空格+|),此时TEST的匹配长度(6)长于WS可能匹配的前5个字符,会被优先识别:
TEST: '\n' ( '\t' | ' ' ) '|' ; WS : [ \t\r\n]+ -> skip ;
若要更灵活匹配空格数量,也可写成'\n' ( '\t' | ' ' {4} ) '|'。
方案二:修改WS规则避免误匹配目标序列
通过否定预测让WS规则不匹配紧跟|的换行和空格,确保TEST规则能捕获目标内容:
WS : [ \t\r\n]+ (?! '|' ) -> skip ; TEST: '\n' ( '\t' | ' ' ) '|' ;
内容的提问来源于stack exchange,提问作者Ali Hamzehpour
相关产品推荐
相关产品推荐

