在示例目录中有一个或多或少完整的 Java 解析器,它实现了这种东西。诀窍是将您的解析器包含在序列中的事物列表中,或者将 next() 与另一个 parSer 组合用于大括号之间的主体,假设大括号不能出现在列表的元素中。
这是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()
. 请注意,此片段是一系列解析器的可选部分,其返回的元素用于创建ClassDef
AST 对象。