2013-05-30 19 views
6

Ich bin ziemlich neu in Xtext, daher verstehe ich nicht alle damit verbundenen Konzepte sehr gut. Es gibt nur eine Frage, auf die ich keine Antwort finden konnte:
Wie kann ich eine Grammatik für eine Sprache mit mehreren Dateien verwalten?
Xtext - mehrere Dateien Sprache

Die DSL, an der ich arbeite, verwendet normalerweise vier Dateien, von denen drei in der ersten referenziert werden sollten. Alle Dateien haben die gleiche Erweiterung, jedoch nicht die gleiche Grammatik. Ist das überhaupt möglich?

Antwort

6

Wie kann ich eine Grammatik für eine Sprache mit mehreren Dateien verwalten?

Xtext analysiert zuerst die Datei und verknüpft anschließend Querverweise. Diese Querverweise können "intern" in einer Datei oder "extern" sein. In beiden Fällen werden die linking und die scoping Systeme die harte Arbeit für Sie erledigen.

Alle Dateien haben dieselbe Erweiterung, jedoch nicht dieselbe Grammatik. Ist das überhaupt möglich?

Dies scheint eine andere Frage zu sein, aber leider ...

Wenn die Grammatiken wirklich anders sind, dann werden Sie eine harte Zeit mit Xtext haben. Wenn Xtext eine .foo Datei sieht, wie sollte es entscheiden, welcher Parser angewendet werden soll? Probieren Sie jedes aus, bis kein Fehler auftritt? Und was, wenn die Datei in Grammatik B geschrieben ist, aber Syntaxfehler enthält? ...

Aber oft gibt es einen kleinen Trick: Das ist wirklich eine Grammatik, aber die Grammatik enthält zwei fast separate Teile. Welcher Teil verwendet wird, wird anhand der ersten Schlüsselwörter in der Datei berechnet.

Ein kleines Beispiel:

Datei A.foo:

module A { 
    // more stuff here 
} 
module B { 
    // also more stuff 
} 

Datei B.foo:

system X { 
    use module A 
    use module B 
} 

Die Grammatik könnte wie folgt aussehen:

Model: Modules | Systems; 

Modules: modules += Module; 
Module: 'module' name=ID '{' '}'; 

Systems: systems += System; 
System: 'system' name=ID '{' used+=UsedModule* '}'; 
UsedModule: 'use' 'module' module=[Module]; 

In dieser Grammatik kann nur eine Datei gespeichert werden y enthalten entweder module XOR system Definitionen, aber keine Mischung von ihnen. Das erste Vorkommen des Schlüsselwortes module oder system bestimmt, was erlaubt ist.