删除 xtext 中的左递归

Removing left recursion in xtext

我看了很多这方面的帖子,还阅读了 https://eclipse.org/Xtext/documentation/307_special_languages.html, as well as https://typefox.io/parsing-expressions-with-xtext

中的 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)? ')';

但是这是行不通的,我有点不明白为什么,它也没有说明这种情况。 name (Trailer) 其中 trailer 是另一个 .姓名

有什么想法吗?

这些表达式在 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 for a detailed explanation. and 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)*
 ;