雑談で構文解析面白いよ〜と教えてもらったのでやってみるかというので冬休みの自由研究している。大学で lex と yacc で自作言語を作る実験をやったことはあるものの、名前とコードの見た目以外全部忘れていて、手の付け方もわからなかったので、今日はひとまず lex から勉強し始めた。
lex というのは、 Plan 9 /sys/man/1/lex を見ると「generator of lexical analysis programs」 だそうで、日本語を探すと字句解析プログラム生成器という感じ。一緒に例が書いてあり、 lex だけでお試しできるいいやつだったのでお試しした。
ex1.lex
%% [A-Z] putchar(yytext[0]+'a'-'A'); [ ]+$ [ ]+ putchar(' ');
入力文字列を見つつ、上から順にパターンにマッチするか見ていって、マッチしたらそのときの処理をして次に進む、という流れ。例では、大文字アルファベットは1文字ずつ小文字にし、末尾空白は消し、空白が続いていたら1つにする、という意味。これは lex ファイルで、これを lex コマンドに渡すと C言語のプログラムを書いてくれる。そのプログラムを gcc コマンドでコンパイルして、実行しつつ文字列を入力すると、 lex ファイルに書いたとおりに文字列が出力される。
$ cat in1.txt abcABC 123 0A89FE44 A B C $ ./aex1.out < in1.txt abcabc 123 0a89fe44 a b c
普段こういうことをしたいときは、 cat in1.txt | perl -pe 's/ +$//g' | perl -pe 's/ +/ /g'
とかやっているので、ちゃんとコードとして書けるのは面白いな〜という感想。 C言語なので 'a'-'A'
で小文字にする、のような処理も書けて便利。何をするにも三日坊主になりがちなので続くかわからないけど、ゆっくりやっていけると楽しそう。