Java5で関数型パーザーを書くとしたら

実装は省きますが、 id:bellbind:20060530:1148969152 をJava5でそのまま実装するとしたら、以下のような感じでしょう。

  • class PState
  • interface Parser
  • interface Func
    • public Parser run(indata data)
  • class ParserBind implements Parser
    • public ParserBind(Parser src, Func dst)
  • class ParserNext implements Parser
    • public ParserNext(Parser src, Parser dst)
  • class ParserReturn implements Parser
    • public ParserReturn(result returnValue)
  • class ParserFail implements Parser<*>
    • public PState<*> parseMethod(String code, int pos) { return null; }
  • class CharParser implements Parser
    • public CharParser(char ch)
  • class ManyParser implements Parser>
    • public ManyParser(Parser parser)
  • class OrElseParser implements Parser
    • public OrElseParser(Parser parser1, Parser parser2)

Javaではクラスとインスタンスは同格で扱えないので、組合せパーザーの記述ではnewがついたりつかなかったりと面倒になるでしょう。もしくは一律どこかのクラスのメソッドにしてしまうかでしょうか。


stringParserは一応メソッドとして実装したら以下のようになるでしょう:

  public Parser<String> stringParser(final String text) {
    if (text.equals("")) return new ParserReturn("");
    return new ParserBind(new CharParser(text.charAt(0), new Func<Character, String> {
      public Parser<String> run(final Character ch) {
        return new ParserBind(stringParser(text.substring(1)), new Func<String, String> {
          public Parser<String> run(String results) {
            return new ParserReturn(ch ++ results);
          }
        });
      }
    });
  }

でかすぎ。