2010-03-09 35 views
3

我對ANTLR和EBNF語法是完全陌生的,因此這可能是我根本不理解的一個基本問題。簡單語法上的ANTLR MismatchedTokenException

我有一個規則,如:

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 ; 

or this form:

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

回答

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 
# 

(!請注意,在輸入#是一個新行字符)

測試與ANTLRWorks V1.3.1。

+0

嗯,你說得對。這必須是文件中其他地方衝突的問題。但是,您給了我一個關於如何調試的好主意(儘管從一條規則開始,然後慢慢展開)。 – jjkparker 2010-03-09 21:25:46

+0

@jjkparker,是的,我也是這麼做的:寫一些規則,測試它。寫更多的規則,測試它等。 – 2010-03-09 21:34:12