ベンダー固有のファイル形式で定義されたオブジェクトを参照する xtext ベースの言語を開発しています。
たとえば、このファイル形式はメッセージを定義し、私の言語はこれらのメッセージで動作するルールを定義します。もちろん、メッセージ名、属性などのオートコンプリート/検証など、xtext 機能を使用したいと考えています。
いいアイデアかどうかはわかりませんが、次のように考えました。
- 1 つの xtext プロジェクトを使用してファイル形式を記述します
- このプロジェクトの依存関係を DSL プロジェクトに追加し、ファイル形式の文法を文法にインポートします
- importURI 経由で記述ファイルをインポートする
ファイル形式の文法:
grammar com.example.xtext.fileformat.FileFormat;
generate fileformat "http://xtext.example.com/fileformat/FileFormat"
[...]
DSL 文法:
grammar com.example.xtext.dsl.DSL;
import "http://xtext.example.com/fileformat/FileFormat" AS ff;
Model:
rules += Rule*;
Rule: ImportFileRule | SampleRule;
ImportFileRule: "IMPORT" importURI=STRING "AS" name=ID ";";
SampleRule: "FORWARD" msg=[ff::Message] ";"
まず第一に:これはうまくいきます。
現在、インポートされたさまざまなファイルが衝突する名前のメッセージを定義している可能性がありますが、とにかくメッセージに完全修飾名を使用したいと考えています。メッセージ名のプレフィックスは、DSL で定義する必要があります (例: ImportFileRule の名前)。
だから私は次のようなものを使いたい:
IMPORT "first-incredibly-long-filename-with-version-and-stuff.ff" AS first;
IMPORT "second-incredibly-long-filename-with-version-and-stuff.ff" AS second;
FORWARD first.msg_1; // references to msg_1 in first file
FORWARD second.msg_1; // references to msg_1 in second file
残念ながら、xtext でこれを実現する簡単な方法はわかりません。
現時点では、名前空間修飾子とカスタム ProposalProvider/Validator クラスの ID を使用しています。これは詳細が見苦しく、EMF インデックスをバイパスし、1000 メッセージと 50000 属性のファイルで遅くなります...
それを行う正しい方法はありますか?そもそも xtext を使用して定義ファイルを解析するのは良い考えでしたか?