4

私は次のような単純なXtext文法を定義しました(簡略化):

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

System:
   'Define System'
   (
     'Define Components' '{' components+=Component+ '}'
   )
   'End'
;

Component:
    'Component' name=ID 'Value' value=Double ';'
;

Double returns ecore::EDouble:
    '-'? INT? '.' INT
;

私が解決したい問題は、単純なJavaオブジェクトを有効なxtextファイルに変換するにはどうすればよいですか?

私の問題を単純化するために、Javaでコンポーネントのリストを作成するとしましょう。

List<Component> components = new ArrayList<Component>();
components.add(new Component("FirstComponent", 1.0));
components.add(new Component("SecondComponent", 2.0));
components.add(new Component("ThirdComponent", 3.0));

作成したい出力ファイルは次のようになります。

Define System
   Define Components { 
       Component FirstComponent Value 1.0;
       Component SecondComponent Value 2.0;
       Component ThirdComponent Value 3.0;
   }
End

このファイルが有効であるように、xtext文法によってチェックされることが重要です。私のために何かアイデアがあればいいのですが。これが私の一部ですが、これまでのところ、それらを実装する方法がわかりません。

アイデア#1:ファイルの読み取りと書き込みの方法を知っています。私の頭の中では、1つの解決策は次のようになります。Javaコードにリストがあります。今度は、上記の出力ファイルのようなファイルを作成します。その後、このファイルを読んで、文法によるエラーをチェックするのが好きです。これどうやってするの?

アイデア#2:JDOMを使用してJavaコードからxmlファイルを作成することを想像した場合、xtextでも同じことができればと思います。「End」で終わる親「DefineSystem」を定義し(出力ファイルを参照)、「}」で終わる子「Define Components {」を追加してから、これに子を追加します(例:「Component FirstComponent Value」)。 1.0;"。これが混乱しないことを願っています:-)

アイデア#3:次のようなテンプレートを使用して、中括弧 "{"..."}"の間に子を追加できます。

Define System
   Define Components { ... }
End

ところで:私はすでにXtextをStringTemplateコードジェネレーターとリンクしようとしましたが、それは一種の別の問題です。何かアイデアがあればいいのですが。

4

2 に答える 2

2

Xtextは、EMFベースのASTを提供します。このASTは、SystemやComponentなどのクラスと、ComponentのValue属性などの対応する属性を備えています。これらのクラスは、言語プロジェクトのsrc-genフォルダーにあります。

これらのオブジェクトをインスタンス化するには、同じパッケージで利用可能なファクトリクラスを使用する必要があります。

このようなASTをシリアル化するには、リソースを作成して内容を保存することにより、標準のEMFツールを再利用できます。シリアル化中に、ASTが検証されます。

System system = ...; //Creating the AST programmatically
ResourceSet set = new ResourceSetImpl();
Resource resource = set.createResource(URI.create...URI("filename")); //Initializing an EMF resource that represents a file
resource.getContents.add(system); //adding your AST to the file resource
resource.save();

マイナーな注意: Eclipseプラグインを開発していない場合は、生成された«YourLanguage»StandaloneSetup.doSetup()静的メソッドを呼び出してXtextツールを初期化する必要があります。

その他のプログラムによる検証オプションについては、Xtextテストフレームワークで使用されるParseHelperクラスとValidatorTesterクラスを確認できます。

于 2012-09-06T20:36:04.763 に答える