ANTLR4学习咨询:为何"..."无法匹配ID词法规则
ANTLR4 中"..."无法匹配ID规则的核心原因
ANTLR4的词法分析和语法分析是完全解耦的两个阶段,词法分析会先扫描完所有输入、按固定规则切分出完整token流之后,才会把token交给语法分析器处理,切分过程不会因为语法规则当前需要匹配ID就主动把对应输入归为ID类型。
词法匹配有两个固定优先级规则,所有匹配逻辑都严格遵循:
- 最长匹配优先:能匹配更长连续字符序列的规则,优先级高于匹配短序列的规则
- 同长度匹配优先:如果多个规则能匹配的字符长度完全一致,在.g4文件中书写位置更靠前的规则优先级更高
"..."匹配不到ID,基本都是以下两类原因:
1. ID规则的字符集本身不包含点号
绝大多数默认的ID规则写法如下:
ID: [a-zA-Z_][a-zA-Z0-9_]*;
这个规则要求ID的首字符只能是大小写字母、下划线,后续字符只能是字母、数字、下划线,.根本不在允许匹配的字符范围内,自然不可能识别连续三个点。这种情况下三个点要么会被切为3个独立的DOT类型token(如果你定义了DOT: '.';规则),要么会直接抛出无法识别字符的词法错误。
2. 点相关规则优先级高于ID,提前截胡了匹配
如果你写的ID规则本身包含点号(比如为了省事写了ID: ~[ \t\r\n]+;这类匹配所有非空白字符的规则),还是匹配不到三个点,大概率是你在ID规则的前面定义了和点相关的词法规则:
// 写在ID前面的规则 DOT: '.'; ELLIPSIS: '...'; // 位置靠后的ID规则 ID: ~[ \t\r\n]+;
如果定义了ELLIPSIS: '...';规则,它和ID匹配三个点时长度相同,但因为写在ID前面,三个点会直接被识别为ELLIPSIS类型token;如果只定义了DOT: '.';没有定义ELLIPSIS规则,单个DOT规则每次只能匹配1个点,连续三个点就会被切为三个独立的DOT token,不会走到ID的匹配逻辑。
常见误区:不要觉得语法规则里某个位置标注了需要ID,词法分析器就会“配合”把对应位置的输入识别成ID,词法切分阶段完全感知不到后续语法分析的匹配需求。
内容的提问来源于stack exchange,提问作者Lson
相关产品推荐
相关产品推荐

