我一直在开始使用ANTLR,并注意到它对其词法分析规则非常挑剔。一个极其令人沮丧的例子如下:
grammar output;
test: FILEPATH NEWLINE TITLE ;
FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
这个语法将不会匹配像这样的内容:
c:\test.txt
x
奇怪的是,如果我将 TITLE
改为 TITLE: 'x' ;
,它仍然失败了,但这次会给出一个错误消息,说“mismatched input 'x' expecting 'x'”,这让人非常困惑。更奇怪的是,如果我在 test
中用 FILEPATH
替换 TITLE
,整个事情就能正常工作(尽管 FILEPATH
匹配的内容比我要匹配的要多,所以通常对我来说,并不是一个有效的解决方案)。
我非常困惑为什么 ANTLR 会给出如此极端奇怪的错误,而在乱搞一番后突然又能正常工作,原因似乎毫无头绪。