Xtext - 多种文件语言

S.W*_*.W. 6 dsl xtext

我对Xtext很新,所以我不太了解所有相关的概念.有一个问题,特别是我找不到答案:
如何管理具有多个文件的语言的语法?

我正在研究的DSL通常使用四个文件,其中三个应该在第一个文件中引用.所有文件共享相同的扩展名,但语法不同.这有可能吗?

A.H*_*.H. 6

如何管理包含多个文件的语言的语法?

Xtext首先解析文件,然后链接交叉引用.这些交叉引用可以是文件中的"内部"或"外部".在这两种情况下,链接范围系统都将为您完成艰苦的工作.

所有文件共享相同的扩展名,但语法不同.这有可能吗?

这似乎是一个不同的问题,但唉......

如果语法真的不同,那么你将很难使用Xtext.如果Xtext看到一个.foo文件,它应该如何决定应该应用哪个解析器?尝试每一个,直到没有错误发生?如果文件是用语法B编写但实际上包含语法错误怎么办?...

但通常会有一个小技巧:它实际上是一个语法,但语法包含两个几乎独立的部分.使用哪个部分是由文件中的前几个关键字计算的.

一个小例子:

文件A.foo:

module A {
   // more stuff here
}
module B {
   // also more stuff
}
Run Code Online (Sandbox Code Playgroud)

文件B.foo:

system X {
   use module A
   use module B
}
Run Code Online (Sandbox Code Playgroud)

语法可能如下所示:

Model: Modules | Systems;

Modules: modules += Module;
Module:  'module' name=ID '{' '}';

Systems: systems += System;
System:  'system' name=ID '{' used+=UsedModule* '}';
UsedModule: 'use' 'module' module=[Module];
Run Code Online (Sandbox Code Playgroud)

在这个语法中,一个文件只能包含moduleXOR system定义,但不能包含它们的混合.第一次出现关键字modulesystem确定允许的内容.