ANTLR出现mismatched input错误 如何支持标识符与关键字同名?
问题原因
你遇到的报错本质是ANTLR词法规则的优先级匹配逻辑导致的:ANTLR词法分析器处理相同长度的文本匹配时,定义位置更靠后的规则优先级更高。你当前把TABLE、MODEL这类关键字的词法规则放在了IDENTIFIER之后,所以table这类和关键字拼写完全一致的文本会被优先识别为关键字Token,而不是标识符Token,当解析到表名位置需要标识符时就会出现Token类型不匹配的报错。
解决方案
你可以通过配置非保留关键字的方式实现需求,让关键字文本在标识符允许出现的位置可以正常解析:
- 首先保持关键字词法规则的定义顺序在
IDENTIFIER之前,保证对应文本可以被正确识别为关键字Token - 其次修改允许出现标识符的语法规则,将需要支持作为标识符的关键字加入可选分支,示例如下:
any_name : IDENTIFIER | STRING_LITERAL | '(' any_name ')' | NULL | TABLE | MODEL | ML // 其他需要支持作为标识符的关键字都可以补充到这里 ;
修改完成后,当any_name匹配位置出现table文本时,即使被识别为TABLE关键字Token,也能匹配对应分支,不会抛出语法错误。
额外语法问题修复
你当前贴出的语法文件还有两处明显错误需要先修复:
from_model规则末尾的括号没有配对,语法不完整any_name规则的第一个分支是空分支,会导致解析歧义,建议直接删除
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

