トップ 差分 一覧 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 + ."

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

やってみよう。

戻る 前へ 次へ?

Amazonリンク
言語設計者たちが考えること (Theory in practice)