2016-03-31 5 views
1

問題:コードインタプリタとランナー

我々は、実行時にソースコードを解釈して実行する方法を探しています。私は提案が欲しい。

私たちは、CodinGameのように、チャレンジを完了するためのソースコードを書く必要があるゲームを開発しています。

ゲームの目的は、プログラミング分野を始める学生を支援することです。

要件:

  • ゲームは生徒がturnLeft()turnRight()よう呼び出すことができる方法の限られたセットを、持っています
  • (JavaのデスクトップとAndroidのために)go()LibGDXで開発されており、その他。
  • IF/ELSE,FORWHILEなどの文を使用できるようにする必要があります。
  • 生徒が作成したコードにエラーが表示される場合は、非常に役立ちます。

私たちは実装方法を探し始めました。

最初は「アスペクト指向プログラミング」を使うことを考えましたが、生徒のソースコードを動的に読み取ることのできるものは見つかりませんでした。

InstantJとしてのコンパイラは、JAVACを使用するためオプションではないため、Android内でのビルドが不可能です。

私たちは、ユーザが入力したソースコードと「メモリで実行中のもの」を読み込み、リフレクションによってメソッドを呼び出すことを考えました。またはそのようなもの。

LISPやLOGOインタプリタのようなものも提案されていますが、この場合の問題は構文です。私たちは、将来利用できる言語を学びたいと思っています。

私たちが今見ている解決策はJavaParserです。しかし、このライブラリは文字通りコードパーサを作成し、命令を解釈しません。ここでは、手動でリフレクション経由で呼び出しを実行する必要があります。そして、などIF、FOR、などの条件を解釈することは困難である

質問:

当社の目標は、ユーザーは、Java(またはJavaScript)事前に定義されたメソッドへの呼び出しを行う必要があり、コードを書くことができるということです。メソッドは既にゲームクラスに実装されています。私たちは具体的に図書館を探しているわけではなく、研究の提案をしたいと考えています。

私たちが探しているものはありますか?

答えて

0

多くの検索と友人との会話の後、私は非常に素晴らしい解決策を得たと信じています!

検索中にRhinoライブラリが見つかりました。このライブラリを使用すると、JavaScriptを使用してコンパイルする必要なくスクリプトを作成できます。

private void executeScript() { 
    String source = "" + 
      "game.walk();\n" + 
      "game.walk();\n" + 
      "var jumps = 10;\n" + 
      "for (var i = 0; i < jumps; i++) {\n" + 
      " game.jump(i + 1);\n" + 
      "}"; 


    org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter(); 
    cx.setOptimizationLevel(-1); // disable compilation 
    Scriptable scope = cx.initStandardObjects(); 
    Object wrappedOut = cx.javaToJS(this, scope); 
    ScriptableObject.putProperty(scope, "game", wrappedOut); 
    Object result = cx.evaluateString(scope, source, "<cmd>", 1, null); 

} 

public void walk() { 
    System.out.println("Walking!"); 
} 

public void jump(int count) { 
    System.out.println("Jumping! " + count); 
} 

出力:

System.out: Walking! 
System.out: Walking! 
System.out: Jumping! 1 
System.out: Jumping! 2 
System.out: Jumping! 3 
System.out: Jumping! 4 
System.out: Jumping! 5 
System.out: Jumping! 6 
System.out: Jumping! 7 
System.out: Jumping! 8 
System.out: Jumping! 9 
System.out: Jumping! 10 

パーフェクト!

関連する問題