我正在编写一个
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(我在Groovy中比Scala,JRuby等更强)DSL允许用户编写脚本(.groovy文件),然后我的程序可以在运行时作为输入执行.
这是正确的,还是我完全误解了DSL的意图?如果我弄错了,有人对我有什么建议吗?如果我是正确的,那么Java程序将如何读取和执行.groovy文件(换句话说,我的程序将如何“消耗”他们的脚本)?
编辑:我开始喜欢ANTLR了.虽然我很想卷起袖子写一个Groovy DSL,但我不希望我的用户能够编写他们想要的任何旧的Groovy程序.我想要自己的“微语言”,如果用户走出它,我希望解释器使脚本无效.看起来Groovy / DSL似乎不是正确的选择,也许ANTLR可能是我需要的解决方案……?
博主正在设计一个Java程序,需要用户编写脚本来定义一系列执行的动作。最初考虑使用XML,但发现它不适合这种线性的、过程性的脚本需求。博主对Groovy DSL感兴趣,因为它可能更适合这种场景,但同时也担心用户可能会编写不安全的Groovy代码。ANTLR被提出来作为可能的解决方案,因为它可以创建自定义的解析器。博主希望通过DSL限制用户只能编写特定的“微语言”,而不是任意Groovy代码。


被折叠的 条评论
为什么被折叠?



