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

Forthを作ってみる / ソースコードを読み込むの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!ソースコードを読み込む

現在のところ、プログラムを実行するには、プログラム配列progにコード化されたプログラムを直接書かないといけない。 
「えーと、+のコードは-2っと」なんてやってられないので、外部ファイルから読み込むようにする。 
行うことは、 

指定されたファイルを解析し、内部コードに変換してプログラム配列progに入れていく

処理内容は、次のようになる。 

*ファイルからトークンを得る(空白で区切られた文字列がトークン)
*トークンが"+"なら、対応するコードCODE_PLUSをprogに埋め込む
*トークンが"."なら、対応するコードCODE_PRINTをprogに埋め込む
*トークンが数字なら、対応するコードCODE_PUSHと、その数値をprogに埋め込む
*EOFまで繰り返す

まず、main()を引数からファイル名を得られるようにする。 

 int main(void)

を 

 int main(int argc, char *argv[])

に変更する。 
ファイル名は、argv[1]に格納されている。 

Forthのプログラムを解析する関数parse()を作る。 
引数としてファイル名をとる。 

 void parse(char *fname)

parse()内でget_token()を呼び出すことで、トークンを得る。 

 void get_token(FILE * fp, char *token)
 {
         int c;
         int j = 0;
 
         token[0] = '\x0';
 
         c = fgetc(fp);
         while (c != ' ' && c != '\n' && !feof(fp)) {
                 token[j] = c;
                 j++;
                 c = fgetc(fp);
         }
 
         token[j] = '\x0';
 }

ファイルから1文字ずつ取っていき、空白または改行が見つかると、そこまでの文字列をトークンとして返す。 

得たトークンをもとに、parse()は対応するコードをプログラム配列progに埋め込んでいく。 

         get_token(fp, token);
         while (token[0] != '\x0' || !feof(fp)) {
                 if (strcmp(token, "+") == 0) {
                         prog[idx] = CODE_PLUS;
                         idx++;
 
                 } else if (strcmp(token, ".") == 0) {
                         prog[idx] = CODE_PRINT;
                         idx++;
 
                 } else if (isnumber(token)) {
                         prog[idx] = CODE_PUSH;
                         prog[idx + 1] = atoi(token);
                         idx += 2;
 
                 }
 
                 get_token(fp, token);
         }
 
         prog[idx] = CODE_END;

さて、実行してみる。ファイルtest1の中身は"4 5 + ."である。 

 $ ./a.out testfile/test1
 9

完成した。 
[ソースコード|http://moi2.sakura.ne.jp/fswiki/wiki.cgi?page=LoadingSourceCode&file=moiforth%2D0%2E2%2Etar%2Egz&action=ATTACH]

[[戻る|ForthImplementation]] [[前へ|TryingRunForth]] [[次へ|ImplementingBranch]]
[[戻る|Forthを作ってみる]] [[前へ|Forthを作ってみる / Forthを実行してみる]] [[次へ|Forthを作ってみる / 条件分岐を実装する]]

{{adsence}}