2011-11-10 68 views
1
grammar mygrammar; 

string : '"' (ESC | ~('\u0000'..'\u001f' | '\\' | '\"'))* '"'; 

number : HEX_NUMBER | '-'? INTEGER_NUMBER ('.' INTEGER_NUMBER)?; 

HEX_NUMBER : '0x' HEX_DIGIT+; 

INTEGER_NUMBER : DIGIT+; 

WS: (' '|'\n'|'\r'|'\t')+ {$channel=HIDDEN;} ; // ignore whitespace 

fragment 
ESC  : '\\' (UNI_ESC |'b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\'); 

fragment 
UNI_ESC : 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT; 

fragment 
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
DIGIT : ('0'..'9'); 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*; 

這裏是錯誤消息我在ANTLRWorks控制檯獲得爲什麼ANTLR語法文件不會生成,我該如何解決?

[14:49:09] error(208): mygrammar.g:7:1: The following token definitions can never be matched because prior tokens match the same input: T__16 

如果我註釋掉string線它生成的代碼,我怎麼有兩個stringnumber在同一時間規則?

+0

順便說一句,「字符串」和「數量」,在那裏你有一個字符串的規則直接字面兩個語法規則。 ANTLR將爲這些字符串創建令牌,但會給他們一些名稱,如T__324。您可能需要考慮爲所有字符串創建令牌,因爲它允許錯誤消息更有意義。 – 2011-11-14 04:36:37

回答

3

我想你會看到有點奇怪的錯誤,因爲你在非法的地方使用操作符。範圍運算符..(dot-dot)僅在詞法規則中有效。您的string規則是一個解析器規則,應該將其作爲詞法分析規則。

因此,而不是:

string : '"' (ESC | ~('\u0000'..'\u001f' | '\\' | '\"'))* '"'; 

做:

STRING : '"' (ESC | ~('\u0000'..'\u001f' | '\\' | '\"'))* '"'; 
相關問題