简单语法上的ANTLR不匹配TokenException

简单语法上的ANTLR不匹配TokenException,antlr,Antlr,首先,我对ANTLR和EBNF语法一无所知,所以这可能是一个我根本不理解的基本问题 我有一个规则,例如: version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ; WS : ' '+ ; EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 与输入文件中的语句相匹配,如下所示(带可选空格): 使用上面的规则表单,我获得了一个成功的匹配,尽管我得到了此表单的一个例外: version_line : WS? 'VERS' WS

首先,我对ANTLR和EBNF语法一无所知,所以这可能是一个我根本不理解的基本问题

我有一个规则,例如:

version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;
与输入文件中的语句相匹配,如下所示(带可选空格):

使用上面的规则表单,我获得了一个成功的匹配,尽管我得到了此表单的一个例外:

version_line : WS? 'VERS' WS? '=' WS? '1' '.0' WS? EOL ;
version_line : WS? 'VERS' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;
或本表格:

version_line : WS? 'VERS' WS? '=' WS? '1' '.0' WS? EOL ;
version_line : WS? 'VERS' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;
这有什么不同?我在尝试进一步分解规则时发现了这个问题,希望最终得到如下结果:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;

我看没问题,所有四种语法都会生成预期的AST:

1.

2.

3.

4.

输入:

VERSION = 1.0
#
(请注意,输入中的
#
是一个新行字符!)


用v1.3.1测试。

Hmm,你说得对。这一定是文件中其他地方存在冲突的问题。不过,你给了我一个调试它的好主意(从一条规则开始,慢慢扩展)。@jjkparker,是的,我也是这样做的:编写一些规则,测试它。写更多的规则,测试它,等等。
version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;
version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;
VERSION = 1.0
#