ANTLR3中IDENT规则匹配异常问题求助
ANTLR IDENT规则匹配异常问题解决
问题根源
你的LETTER片段定义存在错误:
fragment LETTER: (UPPER | LOWER)+;
这里的+表示一个或多个连续字母的组合,而非单个字母。这导致IDENT规则展开后变成:
IDENT : ((UPPER | LOWER)+ | DIGIT | '_')+ ;
该规则的逻辑是匹配「一串连续字母」「单个数字」或「单个下划线」的任意组合(至少一次)。这种嵌套的重复定义会让词法分析器的匹配逻辑出现混乱,从而导致你遇到的各种非预期结果:
Table[A]:单个大写字母本应匹配(UPPER | LOWER)+,但嵌套重复规则让词法分析器无法正确识别为IDENT;Table[AAA]:三个连续字母能被(UPPER | LOWER)+完整匹配,进而被IDENT规则接收;Table[A1]:大写字母匹配(UPPER | LOWER)+,数字匹配DIGIT,二者组合符合嵌套重复的规则,所以能成功;Table[AA]:两个连续字母虽能匹配(UPPER | LOWER)+,但嵌套重复触发了匹配歧义,导致失败。
修正方案
将LETTER片段改为单个字母的定义,去掉多余的+:
fragment LOWER: 'a'..'z'; fragment UPPER: 'A'..'Z'; fragment LETTER: UPPER | LOWER; // 定义为单个字母,移除+ fragment DIGIT : '0'..'9'; IDENT : (LETTER | DIGIT | '_')+ ; // 逻辑变为:任意字母/数字/下划线的组合,至少一次 table : IDENT '['! '@'? IDENT ']'! ;
修正后,IDENT规则会正确匹配1次及以上的大小写字母、数字与下划线的任意组合,所有你测试过的用例都能正常匹配。
内容的提问来源于stack exchange,提问作者OleksandrYu
相关产品推荐
相关产品推荐

