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.