ToyQL: PLY

Python 用の parser generator として PLY を試す。といっても簡単な四則演算を評価するだけのパーサをつくる hello world をコピペしつつ動かしただけ。

自分は Lex/Yacc を真面目に使ったことがなく、Hello World 以外では他人の助けを頼りに通りすがりで既存の g ファイルをいじったことがあるくらい。だからノウハウを何もわかっていない。若いうちに言語処理系を作っておくべきだったが仕方ない。トライアンドエラーでがんばるとしよう。 Lex / Yacc の本を読んだほうがいいのだろうか。乗り気になれないけれど。

その少ない経験にもづいて思うに、PLY は Python-Lex-Yacc というだけあってまるっきり Lex/Yacc だなあ。そういうコンセプトのライブラリなので仕方ないが、もうちょっとモダンな何かにはなれなかったのかと思ってしまう。bug tracker の会話を見ても「デザインが古いのは歴史があるからで仕方ないし直す気もないよ」と言っている。API がモダンになるだけでだいぶかっこよさそうなのに残念。この上のレイヤで誰かがんばってくれないものか。Lex/Yacc とか 40 年前のテクノロジじゃん。これが 40 年前にあったというのはすごいことだが・・・。

いいところもある。作者が主張するとおりエラーメッセージは丁寧でわかりやすい。そして Pure python な上にコード生成を実行時にやるため yacc/lex コマンドを走らせる必要がない。これは動的言語らしくてよい。あと古いとはいえきちんとメンテナンスされている安心感はある。

モダンな parser generator として ANTLR を使おうかとも一瞬考えたけれど、別コマンド実行の不便をふくめ Python との相性の良さが低めに見えたのでやめておいた。Combinator 系はどうか。なんとなく動的型で combinator は違う気がする。

まずは他の SQL 実装の文法ファイルを眺めつつ PLY で簡単な SQL を解釈してみようかなあ。SELECT 文 WHERE なし式なしみたいなやつ。