私は次のような単純な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コードジェネレーターとリンクしようとしましたが、それは一種の別の問題です。何かアイデアがあればいいのですが。