How can I manage a grammar for a language with multiple files?
Xtext first parses the file, and then links crossreferences. These crossreferences can be "internal" in a file or "external". In both cases the linking and the scoping ystems will do the hard work for you.
All files share the same extension, though not the same grammar. Is that possible at all?
This seems to be a different question, but alas...
If the grammars are really different then you will have a hard time with Xtext. If Xtext sees a .foo
file, how should it decide, which parser should be applied? Try each one until no error occurs? And what if the file is written in grammar B but really contains syntax errors? ...
But often there is a little trick: The is really one grammar, but the grammar contains two nearly separate parts. Which part is used is calculated by the first few keywords in the file.
A small example:
File A.foo:
module A {
// more stuff here
}
module B {
// also more stuff
}
File B.foo:
system X {
use module A
use module B
}
The grammar might look like this:
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 this grammar one file can only contain either module
XOR system
definitions but not a mix of them. The first occurrence of the keyword module
or system
determines what is allowed.