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