トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Forthを作ってみる2 / 構文解析を作るの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
Forthの構文解析など、あってないようなものではあるが、それでも三流技術者の頭を悩ませたりする。

* 切り取ったトークンが辞書にあるかを調べる
* 辞書に存在したら、その中間コードをプログラム配列に格納する

この関数をparse_buffer()と名付ける。
parse_buffer()は入力をコンソールからの文字列、および中間コード格納構造体へのポインタとし、生成した中間コードをポインタを介して構造体へ格納する。

今回は、文字列からハッシュコードを計算し、ハッシュコードをワード配列のインデックスにして中間コードを得る。

 /**
  * バッファを構文解析し、プログラム配列を生成する
  */
 void parse_buffer(char *buf, PROGBUF *progbuf)
 {
     const char *delimiter = "\xd\xa\t";
 
     char *token = strtok(buf, delimiter);
 
     while (token != NULL) {
         // トークンから中間コードを得て、バッファに埋め込む
         set_icode(token, progbuf);
 
         // 次のトークンを得る
         token = strtok(NULL, delimiter);
     }
 }
 
 /**
  * トークンから中間コードを得て、バッファに埋め込む
  */
 void set_icode(char *token, PROGBUF *progbuf)
 {
     unsigned short hcode;   // ハッシュコード
 
     // ハッシュコードを得る
     hcde = get_hash_code(token);
 
     // ワードの中間コードを得る
     icode = get_icode(hcode);
 
     // 中間コードを埋め込む
     progbuf->prog[progbuf->top] = icode;
 }

、、、3ヶ月放っておいたら忘れた。
その前は2年放っておいたので、なおさら忘れた。

どうやって作るか、考えて、テスト駆動開発にすることにした。
入力に対する、予測された出力を満たしていればOK、ということにする。

例えば、

 "2 3 + ."

という入力に対して、それぞれの中間コード列が出力として返されればよい。

やってみよう。

[[戻る|Forthを作ってみる2]]  [[前へ|Forthを作ってみる2 / 対話環境を作る2]]  [[次へ|Forthを作ってみる2 / ]]

:Amazonリンク:[言語設計者たちが考えること (Theory in practice)|http://www.amazon.co.jp/gp/product/4873114713/ref=as_li_ss_tl?ie=UTF8&tag=moi0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4873114713]

{{adsence}}