首页 文章

ANTLR单语法输入不匹配

提问于
浏览
0

到目前为止,我一直在测试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:不匹配的输入'查询'期待K_QUERY

我不知道问题出在哪里,也不知道这个消息是什么意思 .

1 回答

  • 1

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

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

相关问题