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

Forthを作ってみる / 処理内容を登録するの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!処理内容を登録する

組み込みワードにはワードごとにコードを割り当ててある。 
しかし、ユーザ定義ワードには、プログラム領域内の番地が割り当てられている。 
例えるなら、組み込みワードは機械語命令、ユーザ定義ワードはサブルーチンである。 
ユーザ定義ワードを呼び出すことは、サブルーチンを呼び出すことと同じである 

さて、処理内容は先の例 

 : 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}}