読者です 読者をやめる 読者になる 読者になる

Javaで使えるパーサジェネレータ

詳しいことはみずしまくんにでも聞くのが早いと思うけど、ちょっと考えてみる。

パースしたいのはOCamlの文法。とりあえず標準のやつだけを考える。ocamlcはocamlyaccを使っていて、ocamlyaccはLALR。つまりOCamlのプログラムはLALRには含まれていることになる。

さて、Javaで使えるパーサジェネレータには、とりあえず次の三つくらいが有名だと思う。

パーサジェネレータ 解析できるクラス
JavaCC LL(k)
ANTLR LALRLL(*) (※コメント)
Rats! Parsing Expression Grammer

ここで、PEGはLALRよりも強かったはずなので、ANTLRかRats!ならOCamlのプログラムをパースできるパーサが書けるはずである。LL(k)でいけるかどうかは知らん。

で、最初Rats!でパーサを書くつもりだったんだけど、良く考えたらLexerが別にあった方がいい気がしてきた。なぜかというとcamlp4で拡張されたプログラムがありうるから。camlp4で書かれたプログラムをちゃんと解析するのは難しいんだけども、でもキーワードとか変数とか、そのくらいは解析したいと思う。実行時に拡張できるようなパーサがあれば、大きな問題にはならないような気もするけど、そういうのを探すのは大変だし、手で書くのはもっと大変。特に、とりあえず現時点ではそれっぽい感じで動くやつを作りたいだけなので。そうするとやっぱりANTLRになるんだろうか。

あーでもOCamlのコメントとかは正則表現で解析できなかったりする*1から、ちょっと嫌らしいのか。その辺も考えたくないから、やっぱりRats!で書いちゃうのが楽かね。

*1:ネストできる