2016-09-16 32 views
-2
grammar even_numbers; 

NUMBER : '0'..'9'; 
EVEN_NUMBER : '2' | '4' | '6' | '8'; 

signedEvenNumber : ('+' | '-' |) NUMBER? EVEN_NUMBER; 

錯誤是:Antlr 3中的語法有什麼問題?

錯誤(208)::4:1:下面的標記定義永遠不能匹配,因爲現有的令牌匹配相同的輸入:EVEN_NUMBER

Please check the picture

+0

如果你重新排序'NUMBER'和'EVEN_NUMBER'?否則'NUMBER'總是匹配。 – zerkms

+0

@zerkms最後一個號碼應該是偶數,以獲得一個偶數 – MOHA

+0

當然,它不與我建議的相矛盾,請再次閱讀。 – zerkms

回答

2

錯誤很明顯,如果仔細閱讀:EVEN_NUMBER無法匹配,因爲NUMBER將匹配EVEN_NUMBER也匹配的內容。並且NUMBER正在優先,因爲它在EVEN_NUMBER之前定義。

你可以做的是這樣的:

signedEvenNumber : ('+' | '-' |) number? EVEN_NUMBER; 
number   : ZERO | ODD_NUMBER | EVEN_NUMBER; 

ZERO  : '0'; 
ODD_NUMBER : '1' | '3' | '5' | '7' | '9'; 
EVEN_NUMBER : '2' | '4' | '6' | '8'; 
+0

非常感謝小費 – MOHA