2014-01-30 19 views
1

我是ANTLR的新手,我在嘗試以下內容。從錯誤中看來,我正在定義一些通用的東西,並且它下面的規則是無法訪問/冗餘。ANTLR抱怨的冗餘的是MAPPING,STROPS,UNARYOPS,ARITHEMATICOPS,MATHLOGICALOP,LOGICALOP,OP1,OP2,OP3,OP4。我不明白我到底在哪裏錯了。請讓我知道這個問題和背後的概念。ANTLR錯誤:以下令牌定義永遠無法匹配,因爲先前的令牌匹配相同的輸入

grammar RA; 

options { 
    language = Java; 
    output = AST; 
    k=3; 
} 



DIVIDE : '/'; 
PLUS : '+'; 
MINUS : '-'; 
STAR : '*'; 
MOD : '%'; 
LPAREN : '('; 
RPAREN : ')'; 
COMMA : ','; 
COLON : ':'; 
LANGLEBRACKET : '<'; 
RANGLEBRACKET : '>'; 
EQ : '='; 
NOT : '!'; 
UNDERSCORE : '_'; 
DOT : '.'; 
GRTRTHANEQTO : RANGLEBRACKET EQ; 
LESSTHANEQTO : LANGLEBRACKET EQ; 
NOTEQ   : NOT EQ; 


fragment A:('a'|'A'); 
fragment B:('b'|'B'); 
fragment C:('c'|'C'); 
fragment D:('d'|'D'); 
fragment E:('e'|'E'); 
fragment F:('f'|'F'); 
fragment G:('g'|'G'); 
fragment H:('h'|'H'); 
fragment I:('i'|'I'); 
fragment J:('j'|'J'); 
fragment K:('k'|'K'); 
fragment L:('l'|'L'); 
fragment M:('m'|'M'); 
fragment N:('n'|'N'); 
fragment O:('o'|'O'); 
fragment P:('p'|'P'); 
fragment Q:('q'|'Q'); 
fragment R:('r'|'R'); 
fragment S:('s'|'S'); 
fragment T:('t'|'T'); 
fragment U:('u'|'U'); 
fragment V:('v'|'V'); 
fragment W:('w'|'W'); 
fragment X:('x'|'X'); 
fragment Y:('y'|'Y'); 
fragment Z:('z'|'Z'); 

AND  : A N D; 
OR  : O R; 
COUNT  : C O U N T; 
AVG  : A V G; 
COUNTDISTINCT : C O U N T D ; 
CAST  : C A S T; 
CORRESPONDING : C O R R E S P O N D I N G; 
ANY  : A N Y; 

MAPPING  : (CORRESPONDING|ANY); 
MATCHCASE  : I; 

EQUALS  : E Q U A L S; 
LIKE  : L I K E; 
NOTEQUALS  :      N O T E Q U A L S; 
NOTLIKE  : N O T L I K E; 
NOTNULL  : N O T N U L L; 

STROPS  : (EQUALS | LIKE | NOTEQUALS | NOTLIKE | NOTNULL); 
UNARYOPS  : (COUNT | AVG | COUNTDISTINCT); 
ARITHEMATICOPS : (DIVIDE|PLUS|MINUS|STAR|MOD); 
MATHLOGICALOP : (LANGLEBRACKET|RANGLEBRACKET|EQ|GRTRTHANEQTO|LESSTHANEQTO|NOTEQ); 
LOGICALOP  : (AND|OR); 

SECATTR  : ('a'..'z' | 'A'..'Z') UNDERSCORE? ('a'..'z' | 'A'..'Z')* DOT ('a'..'z' | 'A'..'Z') UNDERSCORE? ('a'..'z' | 'A'..'Z')*; 
BRACEDSECATTR : LPAREN SECATTR RPAREN; 
UNOPSECATTR : OP1 BRACEDSECATTR; 

OP1  : (UNARYOPS | CAST) ; 
OP2  : (ARITHEMATICOPS|MATHLOGICALOP|STROPS); 
OP3  : (MAPPING|MATCHCASE); 
OP4  : (LOGICALOP); 
//fragment Letter : 'a'..'z' | 'A'..'Z'; 
//Alphanumeric  : (('a'..'z' | 'A'..'Z')| '0'..'9')* ('a'..'z' | 'A'..'Z') (('a'..'z' | 'A'..'Z')| '0'..'9')* ; 
SINGLERULE  : (SECATTR|BRACEDSECATTR|UNOPSECATTR) OP2 ((('a'..'z' | 'A'..'Z')| '0'..'9')|SECATTR|BRACEDSECATTR|UNOPSECATTR); 
BRACEDSINGLERULE : LPAREN SINGLERULE RPAREN; 
UNOPSINGLERULE : BRACEDSINGLERULE OP3; 

Expr  : SINGLERULE|UNOPSINGLERULE|((SINGLERULE|UNOPSINGLERULE)OP4(SINGLERULE|UNOPSINGLERULE))+; 
+1

對不起,忘記了補充:**映射,STROPS,UNARYOPS,ARITHEMATICOPS,MATHLOGICALOP,LOGICALOP,OP1,OP2,OP3,OP4 ** –

回答

2

ANTLR爲輸入中的每個非重疊字符序列分配一個且只有一個標記類型(名稱以大寫字母開頭)。在你的情況下,ANY規則與一個序列相匹配,並且規則MAPPING也被定義爲匹配ANY(作爲其替代方案之一)。當輸入爲any時,您的詞法分析器將始終將令牌類型ANY指定給它,因爲該規則是首先定義的。

雖然您已允許輸入any是一個MAPPING,ANTLR警告你,它永遠類型MAPPING分配給此輸入,所以MAPPING目前的定義是一種誤導。您應更新詞法分析器規則,以便每個序列只匹配一種標記類型。

+1

謝謝你的幫助。雖然我希望它儘可能模塊化,但我會努力改進它。 –