4

入力として使用するスクリプトを (技術的な) ユーザーが作成する必要がある Java プログラムを作成しています。これらのスクリプトを一連のアクションに解釈して実行します。現在、スクリプト/構成言語を実装する最もクリーンな方法を探しています。私は当初、XML ルートに向かうことを考えていましたが、実際には必要な入力の性質は、実行する必要があるアクションの手続き的で直線的なフローです。

function move(Block b, Position p) {
    // user-defined algorithm for moving block "b" to position "p"
}

Block a = getBlockA();
Position p = getPositionP();

move(a, p);

など注意してください : 上記は単なるであり、私が達成しようとしている正確な構文を構成するものではありません。私はまだ「30,000 フィート ビュー」の設計段階にあり、具体化されたスクリプト言語が最終的にどのようになるかはわかりません。この例は、ユーザーが記述しなければならないフロー/手続き型スクリプトであること、および XML がおそらくその実装に最適な候補ではないことを示すためにのみ提供しています。

階層データに最適な XML は、そのような実装に最適な選択肢とは思えません (ただし、必要に応じて強制的に動作させることもできます)。

私は DSL について何も知らなかったので、Groovy DSL について読み始めましたが、それらは私が必要としているものに完全に一致するように感じました。

私の理解では、Groovy (私は Scala や JRuby などよりも Groovy の方が強い) DSL を作成して、ユーザーがスクリプト (.groovyファイル) を作成し、プログラムが実行時に入力として実行できるようにすることができます。

これは正しいですか、それとも DSL の意図を完全に誤解していますか? 私が間違っている場合、誰か私に何か提案はありますか? そして、私が正しければ、Java プログラムはどのように.groovyファイルを読み取って実行するのでしょうか (つまり、私のプログラムはどのようにスクリプトを「消費」しますか)?

編集:ANTLRが好きになり始めています。袖をまくり上げて Groovy DSL を書きたいと思っていますが、ユーザーが必要な古い Groovy プログラムを作成できるようにしたくありません。私は自分自身の「マイクロ言語」が欲しいのですが、ユーザーがそれの外に出た場合、インタープリターにスクリプトを無効にしてもらいたいのです。Groovy/DSL は適切な選択ではないように思われ始めており、ANTLR が必要なソリューションになる可能性があります...?

4

2 に答える 2

1

あなたは本当に良い道を歩んでいると思います。ユーザーは単純な DSL を使用してファイルを作成でき、実行時に評価することでそれらを実行できます。あなたの最大の課題は、DSL の API を正しく使用できるようにすることです。IDE を使用しない限り、これは非常に困難です。

Groovy の eval() に相当

于 2012-07-14T13:24:53.457 に答える
0

はい、スクリプトを入力として受け入れて実行するGroovyプログラムを作成できます。私は最近、groovyを使用してこのようにBASICDSL/インタープリターを作成しました。

http://cartesianproduct.wordpress.com/binsic-is-not-sinclair-instruction-code/

(結局、それはDSLよりも通訳でしたが、それはおそらくあなたに影響を与えないであろうGroovyの特性と関係がありました-BASICはGroovyが解析するのが難しいと思う大文字のキーワードを主張します-したがってそれらは小文字に変換されなければなりません)。

Groovyを使用すると、さまざまな方法でスクリプト環境を拡張できます(たとえば、バインディングに変数を挿入し、現在のスクリプトから別の動的にロードされたスクリプトに実行を転送する)。これにより、これが比較的簡単になります。

于 2012-07-14T13:57:02.400 に答える