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

Forthを作ってみる / ワード名と処理内容を関連付ける

ワード名と処理内容を関連付ける

ワード名と処理内容を登録できるようになった。これらを結びつける必要がある。

まず、構文解析時であるが、トークンを得てそれがワードであれば、対応する処理の先頭番地を得られるようにする必要がある。これを実現するために、ワード・番地対応表を作る。ワード名から対応する番地を得て、その番地に対するサブルーチン呼び出しを埋め込む。

処理実行時には、サブルーチン呼び出しワードが現れたら指定された番地を呼び出す。

ワード名-処理番地変換表は次のようなデータ構造とする。

/** ワード名-処理番地の組 */
typedef struct word_proc_table {
    char word_pointer;          /**< ワード名が登録されたヒープへの番地 */
    char proc_pointer;          /**< 登録された処理番地 */
} WORD_PROC_TABLE;

構文解析時、ワード':'に出会ったら、その次の文字列をワード名としてヒープに登録し、場所を割り当ててもらう。 そして、ワード名と対応する処理番地を対応付ける。

/**
 * @brief ワード名と処理番地とを関連付ける
 * @param[in] name 登録ワード名
 */
void assoc_word_name(char *name)
{
    /* ワード名をヒープ領域に登録する */
    word_proc[word_proc_head].word_pointer = reg_word_name(name);

    /* その時点のプログラム位置を登録する(ワードの開始位置になる) */
    word_proc[word_proc_head].proc_pointer = prog_cnt;

    /* 使っていない登録テーブルを先頭にする */
    word_proc_head++;
}

あるワードがユーザ定義ワードだと判定するには、最初に組み込みワードかどうかを調べ、そうでなければユーザ定義ワードとして登録されているかを調べる。

戻る 前へ 次へ