Programmer's Note

コード読み書きの備忘録。

awk / yacc / lex

いかん、忙しさにかまけて更新が滞っている・・・。 さて、コンスタントに読んでいる「The UNIX Programming Environment」は、第6、7章が終わり。8章に入っている。 yaccで簡易計算言語の作成だぜ。さすがはKernighanさんとPikeさん、yaccがこんな風に楽しいものとは。 すべてはつながっているというか、yaccというツールは、awkと発想が似ている。

list:
        | list '\n'
        | list expr '\n'    { printf("\t%.8g\n", $2); }
        ;
expr:   NUMBER              { $$ = $1; }
        | expr '+' expr { $$ = $1 + $3; }
        | expr '-' expr { $$ = $1 - $3; }
        | expr '*' expr { $$ = $1 * $3; }
        | expr '/' expr { $$ = $1 / $3; }
        | '(' expr ')'      { $$ = $2; }
        ;

つまり、 左側にパターンを書いて、右側にそのパターンが適合した時の処理を書く、 という点において。$1, $2の発想もね。

lexにいたっては、左側に正規表現を書いて右は処理を書く、からほとんどawkと一緒だ。

このパターン認識側の言語って、どれがオリジンかは分からんが、 shell, ed, sed, awk, yacc, lex。 これらぜんぶ初期UNIXの文化の中から生まれた、と考えたら似てて当たり前かもしれない。 が、面白い。