Forthの構文解析など、あってないようなものではあるが、それでも三流技術者の頭を悩ませたりする。 * 切り取ったトークンが辞書にあるかを調べる * 辞書に存在したら、その中間コードをプログラム配列に格納する この関数をparse_buffer()と名付ける。 parse_buffer()は入力をコンソールからの文字列、および中間コード格納構造体へのポインタとし、生成した中間コードをポインタを介して構造体へ格納する。 今回は、文字列からハッシュコードを計算し、ハッシュコードをワード配列のインデックスにして中間コードを得る。 /** * バッファを構文解析し、プログラム配列を生成する */ void parse_buffer(char *buf, PROGBUF *progbuf) { const char *delimiter = "\xd\xa\t"; char *token = strtok(buf, delimiter); while (token != NULL) { // トークンから中間コードを得て、バッファに埋め込む set_icode(token, progbuf); // 次のトークンを得る token = strtok(NULL, delimiter); } } /** * トークンから中間コードを得て、バッファに埋め込む */ void set_icode(char *token, PROGBUF *progbuf) { unsigned short hcode; // ハッシュコード // ハッシュコードを得る hcde = get_hash_code(token); // ワードの中間コードを得る icode = get_icode(hcode); // 中間コードを埋め込む progbuf->prog[progbuf->top] = icode; } 、、、3ヶ月放っておいたら忘れた。 その前は2年放っておいたので、なおさら忘れた。 どうやって作るか、考えて、テスト駆動開発にすることにした。 入力に対する、予測された出力を満たしていればOK、ということにする。 例えば、 "2 3 + ." という入力に対して、それぞれの中間コード列が出力として返されればよい。 やってみよう。 [[戻る|Forthを作ってみる2]] [[前へ|Forthを作ってみる2 / 対話環境を作る2]] [[次へ|Forthを作ってみる2 / ]] :Amazonリンク:[言語設計者たちが考えること (Theory in practice)|http://www.amazon.co.jp/gp/product/4873114713/ref=as_li_ss_tl?ie=UTF8&tag=moi0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4873114713] {{adsence}}