在xtext中删除左递归

时间:2016-04-27 17:59:27

标签: xtext

我在这上面看了很多帖子,并在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)? ')';

但这不起作用,我有点困惑为什么,它也没有考虑到一个案例。拖车是另一个的名称(预告片)。名字

任何想法?

1 个答案:

答案 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)*
 ;