2016-05-20 25 views
0

Ich habe Probleme damit zu verstehen, wie ich das Scoping beeinflussen kann. gehe ich davon aus einfachen Grammatik:Scoping in Xtext

Model: 
    def = DefVarList 
    (use = UseList)? 
; 

DefVarList: 
    name = 'def' '{' (list += DefVar)* '}' 
; 

DefVar: 
    name = ID ';' 
; 

UseList: 
    name = 'use' '{' 
     (list += UseVar)* 
    '}' 
; 

UseVar: 
    name = [DefVar] ';' 
; 

natürlich so etwas wie

def { qwerty; } 
use { qwerty; } 

Ergebnisse Fehler zu schreiben, weil man keinen Verweis auflösen konnte. Also ging ich zur ScopeProvider-Klasse und schrieb sie um:

public class TestgrammarScopeProvider extends AbstractTestgrammarScopeProvider{ 
    public IScope scope_UseVar_name(UseVar v, EReference ref) { 
     Model m = (Model)v.eContainer().eContainer(); 
     return Scopes.scopeFor(m.getDef().getList()); 
    } 
} 

Dies funktioniert nicht. Es nennt diese Funktion nicht einmal. Was mache ich falsch?

P.S. Ich weiß über das Einfügen Fragment Zeile in meiner mwe2-Datei, aber ich frage mich, warum dieses Programm diese Funktion nicht aufrufen.

+1

Die scope_-Methoden funktionieren nur, wenn Ihr scopeprovider von abstractdeclarativescopeprovider erbt - in xtext 2.9+ ist dies nicht mehr der Fall –

Antwort

0

Sie verwenden einen Querverweis als Kennung in UseVar. Ich änderte das zu

UseVar: ref=[DefVar] ';' 

Dann funktioniert diese xtend schnipsel für Ihr DSL.

override IScope getScope(EObject context, EReference ref){ 
    if(context instanceof UseVar && ref == USE_VAR__REF){ 
     val model = context.getContainerOfType(Model) 

     val defVarList = model.def.list   
     return Scopes::scopeFor(defVarList) 
    } 
    return IScope::NULLSCOPE 
} 

Am auch davon aus, das nur ein Start Demo ist Ihr Projekt zu erhalten gehen, aber Sie sollten erwägen einige der syntaktischen Lärm so mit diesem eine Liste statt

List items+=rule (',' items+=rule)*; 

oder vielleicht Entfernen der geschweiften Entfernen geschweifte Klammern (aber Sie möchten vielleicht später verschachtelte Blöcke, in denen Sie sie möglicherweise benötigen). Nur du kannst es sagen, aber es ist eine Überlegung wert.