ToyQL: JFLEX and CUP

Impala は lexer と parser generator にそれぞれ JFLex と CUP を使っている。CUP は聞いたことがなかった。 Syntax が違う以外はだいたい Bison ぽい。ANTLR みたいに AST をつくってくれる機能もあるっぽいけれど Impala ではそれを使わず自力で書いている。

なお Presto や Hive は ANTLR を使う。Java はこの手のツールが妙に充実してるね。そして Presto の文法ファイルImpala のファイルと比べると ANTLR の強力さがわかる。が、自分が使う PLY は記述力の低いツールなので Impala の CUP コードの方が参考になるのだった。

Impala の文法を眺めつつちょっとだけ PLY の文法を書いてみて思ったこと: (1) 自分は SQL を知らなすぎる。すくなくとも一冊くらい SQL の入門書を眺めないと自分の作ってる文法の正しさを少しも判断できない気がする。UNION とかしらねー。(2) Impala からコピペしているせいが大きいとは思うけれど、SQL の文法はサブセットにしておけばそんなにむずかしくない。古い言語だけあってコードを簡潔にしようみたいな頑張りを感じない。サブセットの AST までなら割と問題なくいけそうな予感。(3) Python+PLY でパーサを書くのはけっこうよい。Lex/Yacc のダメさも Python のおかげで若干やわらぐ。

実際にプロジェクトの stub を作り、作りを考えつつコードを書きはじめていい気がしてきた。