入力として使用するスクリプトを (技術的な) ユーザーが作成する必要がある 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 が必要なソリューションになる可能性があります...?