トップ 一覧 Farm 検索 ヘルプ RSS ログイン

AssociatingWordの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!ワード名と処理内容を関連付ける

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

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

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

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

 /** ワード名-処理番地の組 */
 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を作ってみる / ワード名と処理内容を関連付ける]]に移動しました。