我刚开始接触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' ;
答案 0 :(得分:2)
我没有看到任何问题,所有四个语法都产生了预期的AST:
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
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
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
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。
进行测试