JParsec
Java5でのParsec実装のようだが、使いやすいのか?static import前提のようではある。chainl/chainrに相当するものがないように見えるが、buildExpressionParsersはあるので、内部で最適化しているようにも見える。
こうみるとJavaはコード生成せざろうえない言語だなと思う。Rubyのように(シンタックスツリーレベルでの)言語機能自体にカスタマイズ性を持たせるか、HaskellのようにComposableなプリミティブを簡単に扱う仕組みを言語に組み込むことか、これらのどちらかはこれからのプログラミング言語には必須な仕組みだろう。
JParsecのAPIを見て、昨日のJava版パーザーですっかりその存在を忘れてたことがあるのに気ががつきました。それは、戻り値や引数の受け渡しのcovarianceやcontravariance(日本語でなんていうんだろ)を考えなきゃいけないということ。
昨日(id:bellbind:20060530:1148972432)は
public <indata> ParserBind(Parser<indata> src, Func<indata, result> dst)
って書いたけど、contravarianceを考えると
public <indata> ParserBind(Parser<indata> src, Func<? super indata, result> dst)
になる。