トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

Forthを作ってみる / 処理内容を登録する

処理内容を登録する

組み込みワードにはワードごとにコードを割り当ててある。 しかし、ユーザ定義ワードには、プログラム領域内の番地が割り当てられている。 例えるなら、組み込みワードは機械語命令、ユーザ定義ワードはサブルーチンである。 ユーザ定義ワードを呼び出すことは、サブルーチンを呼び出すことと同じである

さて、処理内容は先の例

: hoge 2 3 + . ;

でいうと、"2 3 +"である。 処理内容をプログラム領域に登録するのは、通常の構文解析と同じである。 ただし、ワードとして登録するので、登録時の先頭番地と、ワードの最後を示さないといけない。

登録時の先頭番地として、ワード':'が現れた時点のプログラムカウンタprog_cntの値を保存する。 そして、ワード定義終了を知らせる';'を構文解析時に見つけたときは、登録した処理の最後にワード終了を知らせるコードを付ける。

実行時、ワード終了コードを見つけたら、ユーザ定義ワードから呼び出し元に戻らないといけないので、結局、終了コードというのはサブルーチンのリターンとして働く。

/** 構文解析する */
void parse(char *fname)
{
    :
    :
       } else if (strcmp(token, ":") == 0) {
           /* :の次の単語をワード名とする */
           get_token(fp, token);
           assoc_word_name(token);
           idx++;

       } else if (strcmp(token, ";") == 0) {
           /* ワード終端コードを追加する */
           prog[idx] = CODE_RET;
           idx++;

       }
    :
    :
}

戻る 前へ 次へ