2016-09-05 11 views
0

構文述語の使い方を理解できません。Xtext:相互参照で構文述語を使用する

私の文法は次のとおりです。非LL(*)の競合を生成

Rule: 
    'terminalOne' (name=ID ':')? 
    (field='terminalTwo' | myReference=[Something])? (anotherField=RuleTwo TOK_SEMI); 

Iは、インフロントの '=>' 入れてみました:

(anotherField=RuleTwo TOK_SEMI) 

しかし、助けていないようです。

どのように構文述語で解決できますか?

ありがとうございました。

+0

非常にunusalに見えますが、完全な最小限の再生文法 –

+0

も何文法はかなり巨大であるが、与えることができます –

答えて

0

私はいくつかの短縮をした(左ファクタリングのあなたの方法は

RuleA: 
    'terminalA' (name=ID ':')? 
    ((->fieldA=ID passedParams+=AdditiveExpression (',' passedParams+=AdditiveExpression)*) 
    | 
    ((fieldB='t' | fieldC='q')? (fieldD=AdditiveExpression ";"))); 


AdditiveExpression returns BExpression : 
    RuleB 
    ({BBinaryOpExpression.leftExpr=current} functionName=("+" | "-") rightExpr=RuleB)* 
    ; 

RuleB returns BExpression 
    : PostopExpression 
    | RuleC 
    ; 

RuleC returns BExpression : {BUnaryOpExpression} 
    functionName="-" expr=UnaryOrPrimaryExpression 
    ; 

PostopExpression returns BExpression : 
    PrimaryExpression ({BUnaryPostOpExpression.expr=current} functionName = ("++"))? 
    ; 

PrimaryExpression returns BExpression: 
    c=constant 
    | myID=ID '(' myFieldB+=AdditiveExpression (',' myFieldB+=AdditiveExpression)* ')' 
    | myP=ID (operator+='['intvalue=INT operator+=']')? 
    | operator+='(' additiveExpression=AdditiveExpression operator+=')' 
    | operator+='someOperator' operator+='(' additiveExpression=AdditiveExpression operator+=')'; 


constant: 
    booleanValue='FALSE' 
    | booleanValue='TRUE' 
    | integerValue=INT; 
関連する問題