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

时间:2012-10-22 17:22:23

标签: java parsing scripting

我目前正在研究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快速完成了工作!

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

严肃地写自定义语言很难。

自6.0以来,Java有一个内置的JavaScript引擎。请改用它,您的用户会非常高兴您使用他们熟悉的语法。其他选择是Groovy,JRuby,甚至是Lua。

另见

答案 2 :(得分: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()

答案 3 :(得分:0)

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