Java5で関数型パーザーを書くとしたら
実装は省きますが、 id:bellbind:20060530:1148969152 をJava5でそのまま実装するとしたら、以下のような感じでしょう。
- class PState
- interface Parser
- interface Func
- public Parser
run(indata data)
- public Parser
- class ParserBind
implements Parser - public
ParserBind(Parser src, Func dst)
- public
- class ParserNext
implements Parser - public
ParserNext(Parser src, Parser dst)
- public
- 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)
- public ManyParser(Parser
- class OrElseParser
implements Parser - public OrElseParser(Parser
parser1, Parser parser2)
- public OrElseParser(Parser
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); } }); } }); }
でかすぎ。