我正在使用JParsec库编写一个简单的解析器,并希望解析以下内容:
some, list, of, things
使用parser.sepBy(Scanners.isChar(',')
可以轻松完成此操作,但无法解析更大的文档,除非我将其包装在between
内。
最终我想要解析以下内容:
implements some.java.Interface, some.other.Interface {
...
}
然而,我找不到一个神奇的组合来说“sepBy X直到(但不消耗Y)”甚至“sepBy X直到失败”。
我在这里错过了一些简单的东西吗?
答案 0 :(得分:1)
examples目录中有一个或多或少完整的Java解析器,它实现了那种东西。诀窍是将解析器包含在序列中的事物列表中,或者将next()与花括号之间的主体的另一个parSer结合使用,假设在列表的元素中不能出现花括号。
以下是classDef
的{{1}}方法:
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对象。