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 + ."
という入力に対して、それぞれの中間コード列が出力として返されればよい。
やってみよう。
- Amazonリンク
- 言語設計者たちが考えること (Theory in practice)