ANTLR单语法输入不匹配

时间:2016-01-25 17:07:47

标签: antlr4

到目前为止,我一直在使用ANTLR4进行测试,我已经使用这种单一语法进行了测试:

grammar LivingDSLParser;

options{
    language = Java;
    //tokenVocab = LivingDSLLexer;
}

living
 : query                            #QUERY
 ;

query
 : K_QUERY entity K_WITH expr
 ;


entity
 : STAR         #ALL
 | D_FUAS       #FUAS
 | D_RESOURCES  #RESOURCES
 ;

field
 : ((D_FIELD | D_PROPERTY | D_METAINFO) DOT)? IDENTIFIER
 | STAR
 ;

expr
 : field
 | expr ( '*' | '/' | '%' ) expr
 | expr ( '+' | '-' ) expr
 | expr ( '<<' | '>>' | '&' | '|' ) expr
 | expr ( '<' | '<=' | '>' | '>=' ) expr
 | expr ( '=' | '==' | '!=' | '<>' ) expr
 | expr K_AND expr
 | expr K_OR expr
 ;

IDENTIFIER
 : [a-zA-Z_] [a-zA-Z_0-9]* // TODO check: needs more chars in set
 ;

NUMERIC_LITERAL
 : DIGIT+ ( '.' DIGIT* )? ( E [-+]? DIGIT+ )?
 | '.' DIGIT+ ( E [-+]? DIGIT+ )?
 ;

STRING_LITERAL
 : '\'' ( ~'\'' | '\'\'' )* '\''
 ;

K_QUERY : Q U E R Y;
K_WITH: W I T H;
K_OR: O R;
K_AND: A N D;

D_FUAS : F U A S;
D_RESOURCES : R E S O U R C E S;
D_METAINFO: M E T A I N F O;
D_PROPERTY: P R O P E R T Y;
D_FIELD: F I E L D;

STAR : '*';
PLUS : '+';
MINUS : '-';
PIPE2 : '||';
DIV : '/';
MOD : '%';
LT2 : '<<';
GT2 : '>>';
AMP : '&';
PIPE : '|';
LT : '<';
LT_EQ : '<=';
GT : '>';
GT_EQ : '>=';
EQ : '==';
NOT_EQ1 : '!=';
NOT_EQ2 : '<>';

OPEN_PAR : '(';
CLOSE_PAR : ')';
SCOL : ';';
DOT : '.';

SPACES
 : [ \u000B\t\r\n] -> channel(HIDDEN)
 ;

fragment DIGIT : [0-9];

fragment A : [aA];
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
//so on...

到目前为止,我能够弄明白,当我写下这样的输入时:

query fuas with field.xxx == property.yyy

,它应该匹配。

但是我收到了这条消息:

  

LivingDSLParser :: living:1:0:不匹配的输入&#39;查询&#39;期待K_QUERY

我不知道问题出在哪里,也不知道这个消息的含义。

1 个答案:

答案 0 :(得分:1)

每当ANTLR可以将2个或更多规则与某个输入匹配时,它会选择第一个规则。由于IDENTIFIERK_QUERY都匹配输入"query"IDENTIFIERK_QUERY之前定义,IDENTIFIER匹配。

解决方案:将您的IDENTIFIER规则移至关键字定义下方。