2014-02-05 6 views
1

필자는 antlr 문법에 이상한 문제가 있습니다. 다음과 같이 보입니다. 이제 여기서 문제는 "singlerule"테스트 중에 ANTLR 수학 기호가 확인되지 않았습니다.

X.Y EQUALS A.B 작동하지만 모든 수학 동작 테스트입니다 동안 같은 X.Y > 100이 작동하지 않습니다. 다음과 같은 오류가 발생합니다 : line 1:4 no viable alternative at input '>' 이 문제가 왜 발생하는지 이해해주십시오.

grammar RA; 

options { 
    language = Java; 

} 


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

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


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



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 : ((C O U N T | A V G | C O U N T D I S T I N C T) 
     | C A S T) ; 

OP2 : DIVIDE|PLUS|MINUS|STAR|MOD 
     |LANGLEBRACKET|RANGLEBRACKET|EQ|GRTRTHANEQTO|LESSTHANEQTO|NOTEQ 
     |E Q U A L S | L I K E | N O T E Q U A L S | N O T L I K E | N O T N U L L; 

OP3 : ((C O R R E S P O N D I N G | A N Y)|I); 
OP4 : (A N D | O R); 

DIGIT : ('0'..'9'); 
Letter : ('a'..'z' | 'A'..'Z'); 

singlerule : SECATTR OP2 DIGIT* 
       | SECATTR OP2 SECATTR 
       | BRACEDSECATTR OP2 BRACEDSECATTR 
       | UNOPSECATTR OP2 UNOPSECATTR 
; 
expr : LPAREN? singlerule RPAREN? 
     | LPAREN singlerule RPAREN OP3 
     |((LPAREN? singlerule RPAREN?|LPAREN singlerule RPAREN OP3) OP4 (LPAREN? singlerule RPAREN?|LPAREN singlerule RPAREN OP3))+; 

답변

1

수학 토큰 조각을 모두 만들어보십시오 :

다른 토큰 정의의 일부로 사용하고 있기 때문에 나는 생각
fragment LANGLEBRACKET : '<'; 
fragment RANGLEBRACKET : '>'; 
... 

, 그들은 조각이 아닌 다른 토큰해야합니다.