(ブロック/スコープ内で) ローカルにのみ一意であり、グローバルには一意ではない端末の相互参照に問題があります。完全修飾名またはパッケージ宣言を使用する方法を説明するチュートリアルを見つけましたが、私のケースは構文的に例とは少し異なり、DSL を変更して明示的な完全修飾名またはパッケージ宣言などをサポートすることはできません。
私の DSL には、2 種類の構造化された JSON リソースがあります。
- 私のデータを含むインスタンス。
- データの型情報などを含むメタ モデル。
これら 2 つを簡単に解析し、次の Java スニペットを使用して EMF モデルを取得できます。
new MyDSLStandaloneSetup().createInjectorAndDoEMFRegistration();
ResourceSet rs = new ResourceSetImpl();
rs.getResource(URI.createPlatformResourceURI("/Foo/meta.json", true), true);
Resource instanceResource= rs.getResource(URI.createPlatformResourceURI("/Bar/instance.json", true), true);
EObject eobject = instanceResource.getContents().get(0);
簡単な例:
メタ.json
{
"toplevel_1": {
"sublevels": {
"sublevel_1": {
"type": "int"
},
"sublevel_2": {
"type": "long"
}
}
},
"toplevel_2": {
"sublevels": {
"sublevel_1": {
"type": "float"
},
"sublevel_2": {
"type": "double"
}
}
}
}
インスタンス.json
{
"toplevel_1": {
"sublevel_1": "1",
"sublevel_2": "2"
},
"toplevel_2": {
"sublevel_1": "3",
"sublevel_2": "4"
}
}
このことから、次のように推測したいと思います。
- toplevel_1:sublevel_1 の型は int で、値は 1 です
- toplevel_1:sublevel_2 の型は long で、値は 2 です
- toplevel_2:sublevel_1 の型は float で、値は 3 です
- toplevel_2:sublevel_2 の型は double で、値は 4 です
一意のトップレベル要素を相互参照し、探しているものが見つかるまですべてのサブレベルを反復することができましたが、私のユース ケースでは非常に非効率的で複雑です。また、生成されたエディターがこの方法でサブレベル間をリンクすることもありません。
リンクとスコーピングをいじってみましたが、本当に必要なものと、プロバイダークラスの AbstractDeclarativeScopeProvider および/または DefaultDeclarativeQualifiedNameProvider を拡張する必要があるかどうかはわかりません。
最善の方法は何ですか?
以下も参照してください。