その種のものを実装するサンプルディレクトリには、多かれ少なかれ完全なJavaパーサーがあります。秘訣は、リストの要素内で中括弧が発生しないと仮定して、シーケンス内の物事のリストのパーサーを含めるか、中括弧の間の本体の別のパーサーと next() と組み合わせることです。
からのclassDef
メソッドは次のorg.codehaus.jparsec.examples.java.parser.DeclarationParser
とおりです。
static Parser<Declaration> classDef(Parser<Modifier> mod, Parser<Member> member) {
return curry(ClassDef.class).sequence(
mod.many(), term("class"), Terminals.Identifier.PARSER, TYPE_PARAMETERS.optional(),
term("extends").next(ELEMENT_TYPE_LITERAL).optional(),
term("implements").next(ELEMENT_TYPE_LITERAL.sepBy1(term(","))).optional(),
body(member));
}
気になる部分はterm("implements").next(ELEMENT_TYPE_LITERAL.sepBy1(term(","))).optional()
. このフラグメントは、返された要素を使用してAST オブジェクトを作成する一連のパーサーのオプション部分であることに注意してください。ClassDef