测试时未识别ANTLR数学符号

时间:2014-02-05 07:32:12

标签: antlr ebnf

我在我的antlr语法中遇到了一个奇怪的问题。它看起来如下。现在问题在于我正在测试“singlerule”

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 个答案:

答案 0 :(得分:1)

尝试制作所有数学标记片段:

fragment LANGLEBRACKET : '<';
fragment RANGLEBRACKET : '>';
...

我认为因为你将它们作为另一个令牌定义的一部分使用,它们需要是片段,而不是其他令牌。