我是ANTLR的新手,我正在尝试以下内容。从错误看来,我正在定义一些通用的,下面的规则是无法访问/冗余的.ANTLR抱怨的冗余是 MAPPING,STROPS, UNARYOPS,ARITHEMATICOPS,MATHLOGICALOP,LOGICALOP,OP1,OP2,OP3,OP4 。我不明白我哪里错了。请让我知道问题及其背后的概念。
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))+;
答案 0 :(得分:2)
ANTLR为输入中的每个非重叠字符序列分配一个且只有一个令牌类型(以大写字母开头的名称)。在您的情况下,ANY
规则与序列匹配,并且定义后的MAPPING
规则也定义为匹配ANY
(作为其替代方案之一)。当输入为any
时,您的词法分析器总是将令牌类型ANY
分配给它,因为该规则是首先定义的。
虽然您已允许输入any
为MAPPING
,但ANTLR警告您它永远不会将类型MAPPING
分配给此输入,因此{{1}的当前定义1}}具有误导性。您应该更新词法分析器规则,以便每个序列只匹配一种令牌类型。