2016-04-27 90 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