!!!ワード名と処理内容を関連付ける ワード名と処理内容を登録できるようになった。これらを結びつける必要がある。 まず、構文解析時であるが、トークンを得てそれがワードであれば、対応する処理の先頭番地を得られるようにする必要がある。これを実現するために、ワード・番地対応表を作る。ワード名から対応する番地を得て、その番地に対するサブルーチン呼び出しを埋め込む。 処理実行時には、サブルーチン呼び出しワードが現れたら指定された番地を呼び出す。 ワード名-処理番地変換表は次のようなデータ構造とする。 /** ワード名-処理番地の組 */ 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++; } あるワードがユーザ定義ワードだと判定するには、最初に組み込みワードかどうかを調べ、そうでなければユーザ定義ワードとして登録されているかを調べる。 [[戻る|Forthを作ってみる]] [[前へ|Forthを作ってみる / 処理内容を登録する]] [[次へ|Forthを作ってみる / ワード定義のテスト]] {{adsence}}