私は Xtext にかなり慣れていないので、関連するすべての概念をよく理解していません。特に答えが見つからない質問が 1 つあり
ます。複数のファイルを持つ言語の文法を管理するにはどうすればよいですか?
私が取り組んでいる DSL は通常 4 つのファイルを使用し、そのうちの 3 つを最初のファイルで参照する必要があります。すべてのファイルは、同じ文法ではありませんが、同じ拡張子を共有します。それはまったく可能ですか?
複数のファイルを持つ言語の文法を管理するにはどうすればよいですか?
Xtext は最初にファイルを解析し、次に相互参照をリンクします。これらの相互参照は、ファイル内の「内部」または「外部」にすることができます。どちらの場合も、リンクとスコーピングのシステムが大変な作業をしてくれます。
すべてのファイルは、同じ文法ではありませんが、同じ拡張子を共有します。それはまったく可能ですか?
これは別の質問のようですが、残念ながら...
文法が本当に違う場合は、Xtext で苦労することになります。Xtext が.foo
ファイルを認識した場合、どのパーサーを適用するかをどのように決定する必要がありますか? エラーが発生しなくなるまで、それぞれを試しますか? ファイルが文法 B で書かれているのに、実際には構文エラーが含まれている場合はどうなるでしょうか? ...
しかし、しばしばちょっとしたトリックがあります: は実際には1 つの文法ですが、文法には 2 つのほぼ別々の部分が含まれています。どの部分が使用されるかは、ファイル内の最初のいくつかのキーワードによって計算されます。
小さな例:
ファイル 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];
この文法では、1 つのファイルにいずれかのmodule
XORsystem
定義のみを含めることができますが、それらを混在させることはできません。キーワードmodule
orの最初の出現によって、system
何が許可されるかが決まります。