2016-09-05 10 views
0

구문 술어 사용 방법을 이해하는 데 문제가 있습니다.Xtext : 상호 참조와 함께 구문 술어 사용

내 문법은 다음과 같습니다

비 LL (*) 충돌을 생산
Rule: 
    'terminalOne' (name=ID ':')? 
    (field='terminalTwo' | myReference=[Something])? (anotherField=RuleTwo TOK_SEMI); 

.

(anotherField=RuleTwo TOK_SEMI) 

하지만 도움이 보이지 않는다 :

나는 '=>'에서 앞의 해 봤어.

어떻게 구문 술어로 해결할 수 있습니까?

감사합니다.

+0

당신이 매우 큰 어떤 문법도 완전한 최소한의 재생 문법 –

+0

을 줄 수있는 아주 대한 unusal 보인다 (일부 단축했다 –

답변

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;