Java中非常简单的脚本解析器

4
我目前正在使用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 很快就把它搞定了!


我不明白你的问题。 - Wins
4个回答

2
我会考虑使用BeanShell而不是解析。您只需要将语句编写为BeanShell命令即可。

2

编写自定义语言是很难的,非常严肃。

自从6.0版本以来,Java就内置了JavaScript引擎。使用它,你的用户将非常高兴,因为你使用了他们熟悉的语法。其他替代方案包括Groovy、JRuby或甚至Lua。

另请参阅


0

Groovy很好地支持编写领域特定语言,例如本例中的语言,如果您准备使用类似Java的花括号进行嵌套,而不是类似Python的缩进级别。

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()

0

我曾经使用过Jython(在JVM上移植的Python)来完成类似的任务。其主要优点包括"宿主"(Java环境)与Jython解释器(从Java调用)之间的强大互操作性。您可以从脚本中访问JVM universe:Java环境中定义的类、方法和字段都可以从您的脚本中进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接