Come posso gestire una grammatica per una lingua con più file?
Xtext analizza prima il file, quindi collega i riferimenti incrociati. Questi riferimenti incrociati possono essere "interni" in un file o "esterni". In entrambi i casi, il linking e il scoping ystems faranno il lavoro duro per voi.
Tutti i file condividono la stessa estensione, anche se non hanno la stessa grammatica. È possibile?
Questa sembra essere una questione diversa, ma ahimè ...
Se le grammatiche sono davvero diverso allora si avrà un momento difficile con xtext. Se Xtext vede un file .foo
, come dovrebbe decidere, quale parser dovrebbe essere applicato? Provare ciascuno fino a quando non si verifica alcun errore? E se il file è scritto nella grammatica B ma contiene davvero errori di sintassi? ...
Ma spesso c'è un piccolo trucco: la vera grammatica è una grammatica, ma la grammatica contiene due parti quasi separate. Quale parte viene utilizzata viene calcolata dalle prime parole chiave nel file.
Un piccolo esempio:
A.foo File:
module A {
// more stuff here
}
module B {
// also more stuff
}
File B.foo:
system X {
use module A
use module B
}
La grammatica potrebbe assomigliare a questo:
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 questa grammatica è possibile solo un file y contengono le definizioni module
XOR system
ma non un misto di esse. La prima occorrenza della parola chiave module
o system
determina cosa è consentito.
fonte
2013-05-30 11:37:27