我正在编写一个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,他们觉得这完全符合我的需要。
我的 uderstanding 是我可以写一个Groovy(我在Groovy中比Scala,JRuby等更强大)DSL允许用户编写脚本({{然后我的程序可以在运行时作为输入执行。
这是正确的,还是我完全误解了DSL的意图?如果我弄错了,有人对我有什么建议吗?如果我是正确的,那么Java程序将如何读取并执行.groovy
文件(换句话说,我的程序将如何消耗"他们的脚本)?
编辑:我开始喜欢ANTLR了。虽然我很想卷起袖子写一个Groovy DSL,但我不希望我的用户能够编写他们想要的任何旧的Groovy程序。我想要自己的"微语言"如果用户走出它,我希望解释器使脚本无效。它开始看起来像Groovy / DSL并不是正确的选择,也许ANTLR可能是我需要的解决方案......?
答案 0 :(得分:1)
我认为你的道路非常好。您的用户可以使用简单的DSL编写文件,您可以通过在运行时评估它们来运行它们。您面临的最大挑战是帮助他们正确使用您的DSL的API。除非他们使用IDE,否则这将非常困难。
答案 1 :(得分:0)
是的,您可以编写一个Groovy程序,它将接受脚本作为输入并执行它。我最近使用groovy以这种方式编写了一个BASIC DSL /解释器:
http://cartesianproduct.wordpress.com/binsic-is-not-sinclair-instruction-code/
(最后它比DSL更多的解释,但这与Groovy的特性有关,可能不会影响你 - BASIC坚持使用Groovy难以解析的UPPER CASE关键字 - 因此它们必须被转换小写)。
Groovy允许您以各种方式扩展脚本环境(例如,将变量注入绑定并将执行从当前脚本转移到另一个动态加载的脚本),这使得这相对简单。