2016-04-27 120 views
0

我看到了这么多的帖子,并与的Xtext在https://eclipse.org/Xtext/documentation/307_special_languages.html阅读解析表达式,以及https://typefox.io/parsing-expressions-with-xtext去除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)* 
; 
+0

嘿,谢谢你的回答。我已经表明我读了第一篇建议的文章。我试图创建这样的终端来避免这种LL 例如我做了 TerminalCompExpression返回Comp_expr: \t'('Comp_expr')' ; ,并用终端替代comp + ='('Compare_expr')',但是然后not_ex + = Compare_expr in subtract导致问题,并且创建另一个终端不起作用。 – Quantico

+0

我会试一试,并更新我的问题,或接受答案。谢谢 – Quantico

+0

差不多所有人都加了另一个编辑 – Quantico