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

BeanShellを使用し、解析はまったく行わないことを検討します。ステートメントをbeanshellコマンドとして記述する必要があります。

于 2012-10-22T17:25:30.930 に答える
2

カスタム言語を書くことは、真剣に難しいです。

6.0以降、JavaにはJavaScriptエンジンが組み込まれています。代わりにそれを使用してください。そうすれば、ユーザーは使い慣れた構文を使用できることに非常に満足します。他の選択肢は、Groovy、JRuby、さらにはLuaです。

も参照してください

于 2012-10-22T17:27:47.987 に答える
0

Pythonのようなインデントレベルではなく、Javaのような中括弧をネストに使用する準備ができている場合、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 に答える