ANTLR4如何匹配标识符同时排除特定关键字
问题根因
ANTLR4的词法分析遵循两个核心规则,你的两次写法都踩了对应的坑:
- 显式词法规则优先级高于语法规则中字符串字面量生成的隐式词法规则。你最初的写法把
'at'直接写在语法规则里,生成的隐式at规则优先级低于显式定义的IDENTIFIER,所以at会被识别为IDENTIFIER,导致匹配失败。 - 多个词法规则匹配长度相同时,定义位置更靠前的规则优先级更高。你修改后的写法把
NAME规则放在AT规则前面,at字符串同时匹配两个规则、长度相同,会被优先识别为NAME,因此还是报错。同时你新增的identifier: NAME | ~AT是错误规则,~AT在语法规则中代表「除AT外的任意单个token」,完全不符合你对标识符格式的要求,属于多余逻辑。
正确解决方案
只需要调整词法规则的定义顺序,把关键字规则放在通用标识符规则之前即可,不需要额外定义语法层的identifier规则:
// 语法规则 access: IDENTIFIER AT INT; // 词法规则:关键字必须放在通用标识符规则前面 AT: 'at'; IDENTIFIER: [A-Za-z]+; INT: '-'? ([1-9][0-9]* | [0-9]);
规则说明
- 词法分析时遇到
at字符串,AT和IDENTIFIER匹配长度相同,AT规则定义更靠前,会被优先识别为关键字token。 - 其余符合
[A-Za-z]+格式的字符串会被识别为IDENTIFIER,完全满足你的需求。
内容的提问来源于stack exchange,提问作者bigyihsuan
相关产品推荐
相关产品推荐

