我对 Xtext 很陌生,所以我不太了解所有相关概念。特别是有一个问题我找不到答案:
 如何管理具有多个文件的语言的语法? 
我正在处理的 DSL 通常使用四个文件,其中三个应该在第一个文件中引用。所有文件共享相同的扩展名,但语法不同。这有可能吗?
如何管理具有多个文件的语言的语法?
Xtext 首先解析文件,然后链接交叉引用。这些交叉引用可以是文件中的“内部”或“外部”。在这两种情况下,链接和作用域系统都会为您完成艰苦的工作。
所有文件共享相同的扩展名,但语法不同。这有可能吗?
这似乎是一个不同的问题,但唉......
如果语法真的不同,那么您将很难使用 Xtext。如果 Xtext 看到一个.foo文件,它应该如何决定,应该应用哪个解析器?尝试每一个直到没有错误发生?如果文件是用语法 B 编写的,但确实包含语法错误怎么办?...
但通常有一个小技巧:the 确实是一个语法,但该语法包含两个几乎独立的部分。使用哪个部分由文件中的前几个关键字计算得出。
一个小例子:
文件 A.foo:
module A {
   // more stuff here
}
module B {
   // also more stuff
}
文件 B.foo:
system X {
   use module A
   use module B
}
语法可能如下所示:
Model: Modules | Systems;
Modules: modules += Module;
Module:  'module' name=ID '{' '}';
Systems: systems += System;
System:  'system' name=ID '{' used+=UsedModule* '}';
UsedModule: 'use' 'module' module=[Module];
在这个语法中,一个文件只能包含moduleXORsystem定义,但不能包含它们的混合。module关键字or的第一次出现system决定了允许的内容。