0

一般に、DSL をプラグインとして使用しており、DSL を使用する新しいアプリを作成したい

だから私はこのコードを書いてみました:

JsonParser p = new JsonParser();
IParseResult r = p.parse(new StringReader("{}")); 
//once that work it will be the file data instead of {}

しかし、解析を行うと、ノード モデル ビルダーが null になり、次の行に例外があります。return doParse(ruleName, in, nodeModelBuilder.get(), 0);

nodeModelBuilder を初期化する方法がわかりません

いくつかの手順が欠けていると確信していますが、xtext プロセスにはあまり詳しくありません。ありがとう!

4

3 に答える 3

0

Eclipseフォーラムで次の回答をすでに読んでいます。IParserインスタンスを挿入して作成する必要があります。すべての依存関係も注入されます。必要なバインディングは、JsonRuntimeModuleに記述されています。Xtextは、Guiceとthesesモジュールを使用してすべてを接着します。このパターンは、依存性注入と呼ばれます。


...DSLを使用する新しいアプリを作成したい

したがって、JsonDSLをスタンドアロンモードで使用する必要があります。

私のおすすめ:

  • 入力ファイルを読み取って解析するCLIを使用して最小限のEclipseIApplicationを作成します。Eclipse IApplicationの利点は、DSLランタイムのヘッドレスバージョンを簡単にデプロイできることです。[1]
  • スタンドアロンモードでDSLおよびXtextランタイムを使用する方法の例については、XtextのJUnitサポートのJsonInjectorProviderおよびParseHelper[2]を参照してください。

[1] http://www.eclipsezone.com/eclipse/forums/t99762.html [2] org.eclipse.xtext.junit.util.ParseHelper

于 2012-12-06T08:53:21.590 に答える
0

パーサーを直接呼び出すことは想定されていません。参照: http://wiki.eclipse.org/Xtext/FAQ#How_do_I_load_my_model_in_a_standalone_Java_application.C2.A0.3F

コードは次のようになります。

Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
Resource resource = resourceSet.getResource(new File("/../../some.json").toURI(), true);
Model modelRootElement = (Model) resource.getContents().get(0);

MyDsl を「JsonParser」または「Json」などの DSL 名に置き換えます。DSL ソース コードでクラス JsonStandaloneSetup または JsonParserStandaloneSetup を探します。このクラスは、Xtext プロジェクトを開始したときに生成されます (またはワークフローを初めて実行したとき、今はわかりません)。Modelルート要素のタイプに置き換えてください。EObject サブクラスでなければなりません。

解析/検証/構築 AST は完了resource.getContents()コマンドです。あまり直感的ではありません。これは、コンテキスト、実際にはすべての種類のコンテキスト、Guice コンテキスト、EMF コンテキスト、およびおそらくその他のすべてを StandaloneSetup (および RuntimeModule) にカプセル化して初期化する必要があるためです。コンテキストは、Spring Application Context に似ています。

于 2012-12-17T00:52:33.780 に答える
0

StandaloneSetupスタンドアロン モードで実行するには、を使用する必要があります。

ヘルプについては、このチュートリアルを参照してください

于 2014-02-10T02:22:10.220 に答える