3

我目前正在用 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 脚本引擎让它工作得非常快!

4

4 回答 4

2

编写自定义语言很难,认真。

从 6.0 开始,Java 有一个内置的 JavaScript 引擎。改用它,您的用户会很高兴您使用他们熟悉的语法。其他替代方案是 Groovy、JRuby,甚至是 Lua。

也可以看看

于 2012-10-22T17:27:47.987 回答
2

我会考虑使用BeanShell而根本不解析。您只需要将语句编写为 beanshell 命令。

于 2012-10-22T17:25:30.930 回答
0

如果您准备使用类似 Java 的大括号而不是类似 Python 的缩进级别,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()
于 2012-10-22T18:14:36.857 回答
0

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

于 2012-10-23T16:32:37.967 回答