我目前正在研究java中的一个小项目,我需要为我组建的机器人处理一个非常轻量级的脚本语言。
它不需要处理算术或任何复杂的功能,它只需要运行某些命令并处理if和while语句。
看起来像这样:
turn(90,cw)
move(25)
sleep(5000)
get(temp)
turn(90,ccw)
get(image)
这是我没有遇到过的问题,并且能够让它快速运行。然而,一旦我开始考虑if和while语句,我意识到事情可能会复杂得多。
例如,管理这样的事情会非常简单:
while(temp > 50)
move(25)
turn(90,cw)
但是我对如何开始处理这样的语句感到非常困惑:
while(temp > 50)
if(light < 100)
move(25)
turn(90,cw)
move(10)
看着它,我可以很快看到事情变得非常混乱!
是否有一种处理“轻量级脚本”的首选方法?或者我会更好地坚持并制定某种手动解析器?
感谢你们给我的任何帮助!
编辑 - 感谢大家的帮助,我使用Java Scripting Engine快速完成了工作!
答案 0 :(得分:2)
我会考虑使用BeanShell而不是解析。您只需要将您的语句编写为beanshell命令。
答案 1 :(得分:2)
严肃地写自定义语言很难。
自6.0以来,Java有一个内置的JavaScript引擎。请改用它,您的用户会非常高兴您使用他们熟悉的语法。其他选择是Groovy,JRuby,甚至是Lua。
答案 2 :(得分:0)
Groovy可以很好地支持编写像这样的特定领域语言。
while(temp > 50) {
if(light < 100) {
move(25)
}
turn(90,cw)
move(10)
}
这可以实现类似
GroovyShell gs = new GroovyShell()
Script script = gs.parse(stringContainingTheScript)
Binding b = script.binding
// utility values
b.cw = true
b.ccw = false
b.light = theRobot.getLight()
b.temp = theRobot.getTemperature()
def mc = script.metaClass
mc.move = { distance ->
theRobot.move(distance)
// update from sensors
b.light = theRobot.getLight()
b.temp = theRobot.getTemperature()
}
mc.turn = { angle, direction ->
if(direction) theRobot.turnClockwise(angle)
else theRobot.turnCounterclockwise(angle)
}
mc.sleep = { time ->
sleep(time) // Groovy builtin
// update from sensors
b.light = theRobot.getLight()
b.temp = theRobot.getTemperature()
}
script.run()
答案 3 :(得分:0)
我使用Jython(在JVM上移植的Python)来完成类似的任务。主要优点包括“主机”(Java环境)和Jython解释器(从Java调用)之间的强大互操作性。您可以从脚本中访问JVM Universe:Java环境中定义的类,方法,字段。都可以从你的脚本中操作。