ANTLR词法规则定义顺序不同触发语法错误的问题咨询
问题根因
ANTLR 词法分析器遵循两个固定匹配规则:
- 优先匹配最长的连续输入字符串
- 相同匹配长度下,定义顺序更靠前的词法规则优先级更高
你将Atom规则放到Or规则前面之后,Atom的匹配规则是~('{' | '}')+,也就是匹配所有不包含大括号的连续字符,Or字符串本身也满足Atom的匹配条件,且词法分析器会优先匹配优先级更高的Atom规则,不会将Or单独识别为运算符 token。语法分析器在解析完第一个大括号内的内容后,期望匹配Or运算符,实际拿到的却是Atom类型的 token,因此抛出匹配失败错误。
修复方案
两种可行的修复方式,优先选第一种:
- 调整词法规则顺序,将
Or、And、Not这类运算符/关键字规则全部放在Atom规则前面,保证关键字优先被正确识别 - 如果你有特殊需求必须把
Atom放在前面,可以修改Atom规则增加排除逻辑,避免它匹配到关键字,示例如下:
Atom: (~('{' | '}' | 'O' | 'o' | 'A' | 'a' | 'N' | 'n') | ( 'O' ~'r' | 'o' ~'r' | 'A' ~'n' | 'a' ~'n' | 'N' ~'o' | 'n' ~'o') )+;
排查小技巧
遇到类似语法匹配报错时,可以开启 ANTLR 的词法调试功能,打印所有识别到的 token 列表,对比调整规则前后的 token 类型差异,就能快速定位是词法匹配问题还是语法规则问题。
内容的提问来源于stack exchange,提问作者SPMP
相关产品推荐
相关产品推荐

