- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
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}}