剛剛解決了一個問題,在 StackOverFlow 上的提問被標注為重復,有人給了一個答案:antlr4 - ANTLR 4.5 - Mismatched Input 'x' expecting 'x' - Stack Overflow
來總結(jié)記錄一下。
ANTLR 生成的 lexer 和 parser 是幾乎獨立工作的,parser 無法影響 lexer 的行為(這里不考慮內(nèi)嵌動作和 setmode 之類)。
因此 ANTLR 生成的 lexer 將簡單的按照最長匹配的原則,如果兩條詞法規(guī)則都可以最長匹配,那么按照在 grammar 文件中出現(xiàn)的順序匹配。
所以如果一條詞法規(guī)則是另一條詞法規(guī)則的子集,應盡量放到前面,如果這不能解決問題(或者引入可其他問題),那就只能另尋方案了,通??梢允褂脙?nèi)嵌動作的辦法解決。