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