2016-08-08 17 views
0

Folgende zu meiner Frage: here Ich versuche, das Scoping anzupassen. Ich möchte, dass im Bereich "Prädikat" in meiner Sprache einige der Objekte im Bereich sichtbar sind, wie "typeDef".Scoping: alle Instanzen des bestimmten Typs in der aktuellen Datei erhalten xtext

Predicate: 
    'predicate' name=ID ('(' params=TypedParamList ')')? 
    (':' body=TemporalExpression TOK_SEMI) 
    | ('{' body=TemporalExpression '}'); 

TypeDef: 
    'type' name=ID '=' type=VarType TOK_SEMI; 

Hier einige Beispiele meiner Sprache.

type 
    move = {left, right}; 

predicate stop(move m1, move m2) : 
    m1=left and m2=right; 

Es ist nicht links und rechts erkennen (Verweis nicht auflösen kann)

ich so etwas wie dies versucht:

  val allContentsCurrFile = EcoreUtil2.eAllOfType(context,TypeDef) 
      val allContentsCurrFile2 = EcoreUtil2.getAllContentsOfType(context,TypeDef) 

Ich putted dies als Parameter der Scopes.scopeFor-Methode (zusätzlich zu den Parametern von Prädikat) und das ist nicht für mich gearbeitet. Ich weiß nicht, wie ich es machen soll, wie man alle Instanzen eines bestimmten Typs in der aktuellen Datei findet, damit der Querverweis im Prädikat-Bereich funktioniert.

Danke.

+0

Wie sieht dein Cross Ref aus? –

+0

sieht es so aus: Zeiger = [Referrable | QualifiedName] Dies ist die Querreferenz. Es wird von TemporalExpression abgerufen (es gibt eine Menge von Parserregeln, bis es zur Referenz kommt). Es wird in die if-Anweisung "if (reference == SpectraPackage.Literals.TEMPORAL_PRIMARY_EXPR_HELPER__POINTER)" – RoG

+0

Und TypeDef ist ein refferable? –

Antwort

0

Sie müssen bis zur Wurzel der von vor einem Spaziergang gehen. EcoreUtil2.getContainerOfType(context, YourRootType) könnte dabei helfen.

Update:

die Grammatik und das Beispiel Modell nicht fit. also kann ich nur ein paar Hinweise geben

Nun, das scheint ein ganz anderes Problem. können Sie nur auf Dinge verweisen, die einen Namen haben.

dann müssen Sie alle Sachen auf den Umfang legen.

TypedParam: (module=[Import] '.')? type=[TypeDef] name=ID;

Referrable: TypedParam | TypeDef | TypeConstant;

`` ` val root = EcoreUtil2.getContainerOfType (context, Domainmodel) val allContentsCurrFile = EcoreUtil2.getAllContentsOfType (root, TypeConstant)

` ``

+0

was meinst du root des Formulars? Ich denke, TypeDef ist der Root-Typ .. – RoG

+0

Ich meine root die Eintragssache der Grammatik. Die Wurzel des Asts –

+0

Es hat funktioniert Danke !!! – RoG