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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:32:07