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
;