2016-09-05 2 views
0

Je n'arrive pas à comprendre comment utiliser les prédicats syntaxiques.Xtext: Utilisation de prédicats syntaxiques avec référence croisée

Ma grammaire est:

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

qui produit un conflit non-LL (*).

J'ai essayé de mettre « => » en face de:

(anotherField=RuleTwo TOK_SEMI) 

Mais il ne semble pas aider. Comment puis-je le résoudre avec des prédicats syntaxiques?

Merci.

+0

peut vous donner une grammaire de reproduction minimale complète –

+0

bien ce que la grammaire est assez énorme, –

Répondre

0

je l'ai fait un peu shortening (votre façon d'affacturage gauche semble très unusal

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;