2013-05-30 3 views
6

Sono piuttosto nuovo di Xtext, quindi non capisco molto bene tutti i concetti associati. In particolare, c'è una domanda a cui non sono riuscito a trovare una risposta:
come posso gestire una grammatica per una lingua con più file?
Xtext - linguaggio di più file

La DSL su cui sto lavorando in genere utilizza quattro file, tre dei quali dovrebbero essere referenziati nel primo. Tutti i file condividono la stessa estensione, sebbene non abbiano la stessa grammatica. È possibile?

risposta

6

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.