我试图写一个语法来识别像:
这样的表达式(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
;
答案 0 :(得分:2)
错误(210):以下几组规则是相互左递归的[unaryExpression,additiveExpression,primaryExpression,formula,multiplicativeExpression]
- 这意味着如果解析器输入unaryExpression
规则,则可以匹配additiveExpression
,primaryExpression
,formula
,multiplicativeExpression
和{{ 1}}再次没有从输入中消耗单个令牌 - 因此它无法决定是否使用这些规则,因为即使它使用规则,输入也是相同的。
您可能试图通过这一系列规则允许表达式中的子表达式 - 您需要确保路径将使用子表达式的左括号。 unaryExpression
中的formula
替代方法可能应更改为primaryExpression
,其余语法也应相应调整。