- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!処理内容を登録する
組み込みワードにはワードごとにコードを割り当ててある。
しかし、ユーザ定義ワードには、プログラム領域内の番地が割り当てられている。
例えるなら、組み込みワードは機械語命令、ユーザ定義ワードはサブルーチンである。
ユーザ定義ワードを呼び出すことは、サブルーチンを呼び出すことと同じである
さて、処理内容は先の例
: 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++;
}
:
:
}
[[戻る|ForthImplementation]] [[前へ|RegistingWordName]] [[次へ|AssociatingWord]]
[[戻る|Forthを作ってみる]] [[前へ|Forthを作ってみる / ワード名を登録する]] [[次へ|Forthを作ってみる / ワード名と処理内容を関連付ける]]
{{adsence}}