关于简单语法的ANTLR MismatchedTokenException

时间:2010-03-09 20:47:25

标签: antlr

我刚开始接触ANTLR和EBNF语法,所以这可能是一个我根本不理解的基本问题。

我有一条规则,例如:

version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

匹配输入文件中看起来像这样的语句(带有可选的空格):

VERSION = 1.0

使用上面的规则表单,我得到了一个成功的匹配,虽然我得到了这种形式的例外:

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' ;

1 个答案:

答案 0 :(得分:2)

我没有看到任何问题,所有四个语法都产生了预期的AST:

1

version_line : WS? 'VERSION' WS? '=' WS? '1.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text http://img130.imageshack.us/img130/2568/82912644.jpg

2

version_line : WS? 'VERSION' WS? '=' WS? '1' '.0' WS? EOL ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text http://img708.imageshack.us/img708/3493/51731096.jpg

3

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.0' WS? EOL ;
DIGIT : '1' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text http://img198.imageshack.us/img198/9674/94436521.jpg

4

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ;
DIGIT : '0'..'9' ;
WS : ' '+ ;
EOL : '\r' | '\n' | '\r\n' | '\n\r' ;

alt text http://img198.imageshack.us/img198/7050/22348287.jpg

输入:

VERSION = 1.0
#

(请注意,输入中的#是新行char!)

使用ANTLRWorks v1.3.1。

进行测试