4

現在のプロジェクトでは、dsl 仕様 (つまり、voc.mydsl、arch.mydsl、および network.mydsl) を記述するために xText エディターを使用しています。コード補完やその他の機能があるため、xText エディターが気に入っています。

ただし、別の Java プログラムがあります。この Java プログラムは、入力としてテキスト ファイル (つまり、voc.txt、arch.txt、network.txt) を受け取り、ANTLR パーサーを使用してこれらのファイルを解析し、S​​tringTemplate ファイルを使用してコードを生成します。

さて、私の問題は、現在、次の手順を手動で実行する必要があることです:
(1) XText エディター (voc.mydsl、arch.mydsl、および network.mydsl) で DSL 仕様を作成します。
(2) これらの仕様を 3 つのテキスト ファイル (voc.txt、arch.txt、network.txt) にコピー アンド ペーストします。
(3) 最後に、Java プログラムを実行してこれらの .txt ファイルを解析し、コードを生成します。

上記の 3 つの手順をすべて自動化 (ワンクリックで実行) する方法はありますか? 詳細が必要な場合はお知らせください。

4

1 に答える 1

3

DSL 用の「特別な」ジェネレーターを作成できます。*.mydsl ファイルを編集して保存するたびに、XText はこのジェネレーターを呼び出します。この「ジェネレータ」で実際に行うことは、Xtext には関係ありません。したがって、MydslGenerator.xtendジェネレーターは次のようになります。

// whereever Xtext generates your empty version of this file
package mydsl.xtext.generator

// add imports

@Singleton
class MydslGenerator implements IGenerator {

    override void doGenerate(Resource resource, IFileSystemAccess fsa) {

        // calculate new filename
        val newFilename= resource.URI.lastSegment.replaceAll(".mydsl", ".txt")

        // get text representation of parsed model
        val textContent = resource.contents.map[NodeModelUtils::getNode(it).text].join

        // write text content to new file
        fsa.generateFile(newFilename, textContent);

        // TODO: call ANTLR parser on new file here
    }
}

main最後のステップでは、Eclipse からそのメソッドを直接呼び出すか、新しい JVM を呼び出すことによって、「他の」プログラムを呼び出すことができます。後者は、*.mydsl ファイルを保存するたびに呼び出されるため、他のジェネレーターがすばやく動作する場合にのみお勧めします。最初の方法は、他のプログラムにメモリ リークがなく、多くの jar 依存関係がない場合にのみ推奨されます。

于 2013-02-11T18:49:17.427 に答える