Intellij Antlr4插件左直接递归不起作用

时间:2014-02-28 07:44:45

标签: intellij-idea antlr4 left-recursion

我正在尝试使用Antlr4为sql select语句创建解析器,其中包含以下部分

expr: '1' | expr('*'|'/'|'+'|'-'|'||') expr; // As the re-factored form of expression: compound expression;
WS :[ \t\r\n]+ -> skip ; 

我认为这条规则允许以下几组结果:

1
1+1
1+1-1
....

但是在图表中显示它无法解析

有没有人知道为什么它不能像我预期的那样被解析?

1 个答案:

答案 0 :(得分:0)

这个稍微调整过的语法对我有用。在输入1+1-1||1*1-1/1上测试。在ANTLRWorks2.1中测试

grammar myGrammar;

top : expr EOF ;

expr : '1'
     | expr '+' expr 
     | expr '*' expr
     | expr '/' expr
     | expr '+' expr
     | expr '-' expr
     | expr '||' expr
     ;

WS :[ \t\r\n]+ -> skip ; 

One : '1' ;
Times : '*' ;
Div : '/' ;
Plus : '+' ;
Minus : '-' ;
Or : '||' ;

enter image description here

修改

当匹配规则top

时,我也能够将其工作
grammar newEmptyCombinedGrammar;

top : expr EOF ;

expr: one 
    | expr op=(Times|Div|Plus|Minus|Or) expr
    ;

one : One ;

One : '1' ;
Times : '*' ;
Div : '/' ;
Plus : '+' ;
Minus : '-' ;
Or : '||' ;

WS :[ \t\r\n]+ -> skip ; 

enter image description here