2011-01-23 14 views
2

私は、このサイトとハッカーのニュースで、インタプリタとコンパイラの作成に関する多くの記事を読んだ。シンプルなゲームのインタプリタを書く

すべてのトピックでは、大きな通訳言語について話していますが、私は単純化された言語を書いています。言語はハーバートに基づいて

言語

  1. は、私はオンライン版を作成したい
  2. [イマジンカップ]、ユーザーがフォームで提出することができますし、ロボットがウェブ・ウィンドウで実行して、それを参照してください。
  3. 私は、php、python、ruby、または任意のウェブ言語しか使用できません。ここで

私の言語は

命令の基本

  1. のです - ストレート
  2. リットル -
  3. を左R - 右
  4. あなたがここに 関数fを持つことができます。SSRLを[それらは再帰f:ssrlfの引数f(A)をサポートします:Assrl、f(A):ssrlf(A-1)(Aは整数です)
  5. プログラム内で複数の機能を互いに呼び出すことができます。 f:ssrlgf

これをできるだけ早く実装したいと思っています。私はこの仕事をやり遂げるための最良の選択肢となります。 [私はPHPを知っている、パイソンやルビーの経験がないが、このプロジェクトのためにそれらを学んで喜んで]

+0

あなたが言及したバックエンド言語に加えて(またはその代わりに)フロントエンド対応言語が必要になります。 –

答えて

2

トークナイザ(チェーン)を書く必要があります。

クラストークン{ 静的トークン解析(文字列プログラム)。 void実行(CurrentProgramState状態)。 }

まず、テキスト全体を解析するために、トークンを作成する複数の小さなトークンを渡してプログラムトークンを作成します。渡された成功したトークンはそれぞれ少ししか消費されないので、最後に文字列は空です。 (そして、最終的にプログラムトークンには順序付けられたトークンのリストがあります)。

次に、Program.Execute()が呼び出されると、CurrentProgramStateを追跡し、その状態をそのパラメータに従ってゲームの状態を変更する独自のトークンに順番に渡します。

小さな例です。

たちは、トークンの2種類のみ(ストレート用)

の 数(どれだけのために)

class StraightToken 
{ 
    public StraightToken(NumberToken howFar) 
    { 
     this.howFar = howFar; 
    } 
    private NumberToken howFar; 
    static Token Parse(string program) 
    { 
     if(program.StartsWith("s ") 
     { 
      NumberToken number = NumberToken.Parse(program.substring(2)); 
      if(howFar != null) 
      {     
       return new StraightToken(number); 
      } 
     } 
     return null; 
    } 

    public void Execute(ProgramState state) 
    { 
     state.Position += this.howFar.value; 
    } 
} 

class NumberToken 
{ 
    public int value; 
    public NumberToken(int value;) 
    { 
     this.value = value; 
    } 

    static Token Parse(string program) 
    { 
     if(IsDigit(program[0])) 
     { 
      program = program.SubString(1); 
      return new NumberToken((int)program[0]) 
     } 
    } 
} 
+0

私には全く答えられないようです。 –

+0

答えには何が欠けていますか?私は単純なパーサ(テキストから実行可能なトークンを作成する)を作成する方法と、あなたの 's'と数値トークンを実装する例を説明しました。このコードを理解すれば、あなたの言語のための通訳を書くことができると思います。 –

0

それはだ古いスレッドに投稿するため申し訳ありませんが、 を持っている言語を持っていると言います面白い質問です。解決されないので、私は個人的にjavascriptを使用し、通訳を書くのは気にしません。

入力がすべて1行だとすると、[警告: typ

var input = "lllssrb", 
     horizontal = 0, vertical = 0; 
//now we'll just loop through the input 
input.split("").forEach(function(char){ 
    switch(char){ 
     case "l": 
       horizontal --; 
       break; 
     case "r" 
       horizontal ++; 
       break; 
     case "s": 
       vertical ++; 
       break; 
      case "b": 
       vertical --; 
       break; 
    } 
}); 

//now do something with our results 
//function advance(horizontal, vertical) 
advance(horizontal, vertical); 
関連する問題