刚刚解决了一个问题,在 StackOverFlow 上的提问被标注为重复,有人给了一个答案:antlr4 - ANTLR 4.5 - Mismatched Input 'x' expecting 'x' - Stack Overflow
来总结记录一下。
ANTLR 生成的 lexer 和 parser 是几乎独立工作的,parser 无法影响 lexer 的行为(这里不考虑内嵌动作和 setmode
之类)。
因此 ANTLR 生成的 lexer 将简单的按照最长匹配的原则,如果两条词法规则都可以最长匹配,那么按照在 grammar 文件中出现的顺序匹配。
所以如果一条词法规则是另一条词法规则的子集,应尽量放到前面,如果这不能解决问题(或者引入可其他问题),那就只能另寻方案了,通常可以使用内嵌动作的办法解决。