运维开发网

如何编写Java程序的脚本输入

运维开发网 https://www.qedev.com 2020-02-27 08:06 出处:网络 作者:运维开发网整理
我正在编写一个 Java程序,要求其(技术)用户编写用作输入的脚本;它将这些脚本解释为一系列动作并执行它们.我目前正在寻找最简洁的方法来实现脚本/配置语言.我原本打算沿着XML路线前进,但所需输入的本质实际上是需要执行的程序性线性动作流程: function move(Block b, Position p) { // user-defined algorithm for moving b
我正在编写一个 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可能是我需要的解决方案……?

是的,您可以编写一个Groovy程序,它将接受脚本作为输入并执行它.我最近使用groovy以这种方式编写了一个BASIC DSL /解释器:

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

(最后它比DSL更多的解释,但这与Groovy的特性有关,可能不会影响你 – BASIC坚持使用Groovy难以解析的UPPER CASE关键字 – 因此它们必须转换为小写).

Groovy允许您以各种方式扩展脚本环境(例如,将变量注入绑定并将执行从当前脚本转移到另一个动态加载的脚本),这使得这相对简单.

0

精彩评论

暂无评论...
验证码 换一张
取 消