"以下规则集是相互左递归的"

时间:2016-09-13 03:57:54

标签: antlr grammar antlr3

我试图写一个语法来识别像:

这样的表达式
(A + MAX(B) ) / ( C - AVERAGE(A) )
IF( A > AVERAGE(A), 0, 1 ) 
X / (MAX(X)

不幸的是,antlr3因这些错误而失败:

  

错误(210):以下几组规则是相互左递归的[unaryExpression,additiveExpression,primaryExpression,formula,multiplicativeExpression]

     

错误(211):DerivedKeywords.g:110:13:[致命]规则booleanTerm由于可以从alts 1,2到达的递归规则调用而具有非LL(*)决策。通过左因子分解或使用句法谓词或使用backtrack = true选项来解析。

     

错误(206):DerivedKeywords.g:110:13:备选1:在匹配输入之后,如决定无法预测由于递归溢出到公式的additiveExpression而接下来会发生什么

我花了几个小时试图解决这些问题,如果有人能帮助我解决第一个问题,那就太好了。感谢

代码:

    grammar DerivedKeywords;
options {
output=AST;
//backtrack=true;
}
WS    : (    ' ' | '\t' | '\n' | '\r' )
            { skip(); }
      ;

//for numbers
DIGIT
      :     '0'..'9'
      ;
//for both integer and real number
NUMBER
      :     (DIGIT)+ ( '.' (DIGIT)+ )?( ('E'|'e')('+'|'-')?(DIGIT)+ )?
      ;

// Boolean operatos
AND : 'AND';
OR : 'OR';
NOT : 'NOT';
EQ : '=';
NEQ : '!=';
GT : '>';
LT : '<';
GTE : '>=';
LTE : '<=';
COMMA : ',';

// Token for Functions
IF : 'IF';
MAX : 'MAX';
MIN : 'MIN';
AVERAGE : 'AVERAGE';


VARIABLE :   'A'..'Z' ('A'..'Z' | '0'..'9')*
         ;
// OPERATORS

LPAREN      :     '('   ;     
RPAREN            :     ')'   ;

DIV         :     '/'   ;     
PLUS              :     '+'         ;
MINUS       :     '-'   ;     
STAR              :     '*'         ;


expression : formula;

formula 
        :   functionExpression
        |   additiveExpression 
        |   LPAREN! a=formula RPAREN! // First Problem
        ;

additiveExpression 
      : a=multiplicativeExpression ( (MINUS^ | PLUS^ )   b=multiplicativeExpression )* 
      ;


multiplicativeExpression
      : a=unaryExpression ( (STAR^ | DIV^ ) b=unaryExpression )* 

      ;

unaryExpression
      :     MINUS^ u=unaryExpression 
      |     primaryExpression 
      ;

functionExpression 
        : f=functionOperator LPAREN e=formula RPAREN 
        |  IF LPAREN b=booleanExpression COMMA p=formula COMMA s=formula RPAREN
        ; 


functionOperator : 
    MAX | MIN | AVERAGE;


primaryExpression
      :     NUMBER 
      // Used for scientific numbers
      |     DIGIT 
      |     VARIABLE 
      |     formula
    ;

// Boolean stuff
booleanExpression 
            : orExpression;

orExpression :  a=andExpression (OR^ b=andExpression )*
                ;
andExpression 
            :   a=notExpression (AND^ b=notExpression )*
                ;

notExpression
            : NOT^ t=booleanTerm 
            | booleanTerm
            ;

booleanOperator :
    GT | LT | EQ | GTE | LTE | NEQ; 

booleanTerm : a=formula op=booleanOperator b=formula                 
            | LPAREN! booleanTerm RPAREN! // Second problem
;

1 个答案:

答案 0 :(得分:2)

  

错误(210):以下几组规则是相互左递归的[unaryExpression,additiveExpression,primaryExpression,formula,multiplicativeExpression]

- 这意味着如果解析器输入unaryExpression规则,则可以匹配additiveExpressionprimaryExpressionformulamultiplicativeExpression和{{ 1}}再次没有从输入中消耗单个令牌 - 因此它无法决定是否使用这些规则,因为即使它使用规则,输入也是相同的。

您可能试图通过这一系列规则允许表达式中的子表达式 - 您需要确保路径将使用子表达式的左括号。 unaryExpression中的formula替代方法可能应更改为primaryExpression,其余语法也应相应调整。