0

ベンダー固有のファイル形式で定義されたオブジェクトを参照する 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 を使用して定義ファイルを解析するのは良い考えでしたか?

4

2 に答える 2

0

何を確認するかについては、2 つのアイデアがあります。

  1. Xtext には、ImportedNameSpaceAwareScopeProviderと呼ばれる特定のグローバル スコープ プロバイダーがあります。これのオーバーライドされたバージョンを使用することで、考慮すべき他のヘッダーを指定できます。
  2. EPackage インポートでこのような機能をサポートしているため、 xtext 文法自体の実装を確認してください。どのように動作するのか正確にはわかりませんが、このように動作するはずです。
于 2013-07-25T16:34:53.543 に答える
0

最後に、SimpleNamesFragment、ImportURIScopingFragment、および AbstractDeclarativeScopeProvider から派生したカスタム ScopeProvider を使用することになりました。

そのようにして、いくつかのルールを静かにするために ScopeProvider メソッドを実装する必要がありましたが、「名前空間プレフィックス」を使用する方がはるかに柔軟でした。たとえば、次のような構文を実装するのは簡単です

FORWARD FROM first: msg_01, msg_02;
于 2013-08-13T18:04:12.313 に答える