【问题标题】:ANTLR math symbols not identfied while testing测试时未识别 ANTLR 数学符号
【发布时间】:2014-02-05 07:32:12
【问题描述】:

我在我的 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))+;

【问题讨论】:

    标签: antlr ebnf


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 2012-08-16
      • 1970-01-01
      • 2011-07-16
      相关资源
      最近更新 更多