我在这上面看了很多帖子,并在https://eclipse.org/Xtext/documentation/307_special_languages.html中阅读了使用Xtext的解析表达式,以及https://typefox.io/parsing-expressions-with-xtext
但是,我无法消除LL递归错误:
我的语法是:
能够解决除一个问题之外的所有问题
Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')'|
'.' name=id(trailer+=Trailer)* //TODO fix left recusion
;
尝试以下
Trailer:
TerminalTrailer |
'.' name=id (trailer+=TerminalTrailer )* //TODO fix left recusion
TerminalTrailer returns Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')';
但这不起作用,我有点困惑为什么,它也没有考虑到一个案例。拖车是另一个的名称(预告片)。名字
任何想法?
答案 0 :(得分:1)
这些表达式在Xtext
中看起来像以下那样Addition returns Expression:
Multiplication ({Addition.left=current} '+' right=Multiplication)*;
Multiplication returns Expression:
Primary ({Multiplication.left=current} '*' right=Primary)*;
Primary returns Expression:
NumberLiteral |
'(' Addition ')';
NumberLiteral:
value=INT;
有关详细说明,请参阅http://typefox.io/parsing-expressions-with-xtext。和https://github.com/LorenzoBettini/xsemantics/blob/master/examples/it.xsemantics.example.expressions/src/it/xsemantics/example/expressions/Expressions.xtext更复杂的例子
更新
你的东西可能是(未经测试的)
OrExpression:
And_expr ({OrExpression.left=current} '||' right+=And_expr)*;
And_expr returns Expression:
Subtract_expr ({And_expr.left=current} '&&' right+=Subtract_expr)*;
Subtract_expr returns Expression:
"!" not=Subtract_expr
| Compare_expr;
Compare_expr returns Expression:
Math_expr (operator+=('>=' | '<=' | '==' | '!=' | '>' | '<') comp+=Math_expr)+ |
'(' Compare_expr ')' | //
Literal;
Literal returns Expression:
{Literal}(
value?="true" | "false");
Math_expr:
valie=INT;
编辑2:
Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')'|
'.' name=ID (=>trailer+=Trailer)*
;