Antlr &引用;以下规则集是相互左递归的;

Antlr &引用;以下规则集是相互左递归的;,antlr,grammar,antlr3,Antlr,Grammar,Antlr3,我试着写一个语法来识别以下表达式: (A + MAX(B) ) / ( C - AVERAGE(A) ) IF( A > AVERAGE(A), 0, 1 ) X / (MAX(X) 不幸的是,antlr3出现以下错误: 错误(210):以下规则集是相互左递归的[unaryExpression、additiveExpression、primaryExpression、formula、乘法Expression] 错误(211):DerivedKeywords.g:110:13:[致命]规

我试着写一个语法来识别以下表达式:

(A + MAX(B) ) / ( C - AVERAGE(A) )
IF( A > AVERAGE(A), 0, 1 ) 
X / (MAX(X)
不幸的是,antlr3出现以下错误:

错误(210):以下规则集是相互左递归的[unaryExpression、additiveExpression、primaryExpression、formula、乘法Expression]

错误(211):DerivedKeywords.g:110:13:[致命]规则布尔项具有非LL(*)决策,因为可以从alts 1,2访问递归规则调用。通过左因子分解或使用语法谓词或使用backtrack=true选项进行解析

错误(206):DerivedKeywords.g:110:13:备选方案1:匹配输入(如decision)后,由于公式中additiveExpression的递归溢出,无法预测下一步会发生什么

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

代码:
语法关键词;
选择权{
输出=AST;
//回溯=真;
}
WS:(“|”\t“|”\n“|”\r”)
{skip();}
;
//数字
数字
:     '0'..'9'
;
//对于整数和实数
数
:(数字)+(‘.。(数字)+)?(‘E’|‘E’)(‘+’|’-’)?(数字)+)?
;
//布尔运算符
和:'和';
或:‘或’;
不是‘不是’;
等式:'=';
NEQ:“!=”;
GT:“>”;
LT:'=';
LTE:'
错误(210):以下规则集是相互左递归的[unaryExpression、additiveExpression、primaryExpression、formula、乘法Expression]

-这意味着,如果解析器输入
unaryExpression
规则,它就有可能匹配
additiveExpression
primaryExpression
公式
乘法表达式
unaryExpression
再次使用,而从不使用输入中的单个标记-因此它无法决定是否使用这些规则,因为即使使用这些规则,输入也将是相同的

您可能正试图通过此规则序列在表达式中允许子表达式-您需要确保path将使用子表达式的左括号。可能应将
primaryExpression
中的
formula
替换项更改为
LPAREN formula RPAREN
,并相应调整其余语法

错误(210):以下规则集是相互左递归的[unaryExpression、additiveExpression、primaryExpression、formula、乘法Expression]

-这意味着,如果解析器输入
unaryExpression
规则,它就有可能匹配
additiveExpression
primaryExpression
公式
乘法表达式
unaryExpression
再次使用,而从不使用输入中的单个标记-因此它无法决定是否使用这些规则,因为即使使用这些规则,输入也将是相同的

您可能正试图通过此规则序列在表达式中允许子表达式-您需要确保path将使用子表达式的左括号。可能应将
primaryExpression
中的
formula
替换项更改为
LPAREN formula RPAREN
,并相应调整其余语法

    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
;