如何在不使用.between()的情况下从jparsec返回List

时间:2015-08-04 20:30:49

标签: java parsing jparsec

我正在使用JParsec库编写一个简单的解析器,并希望解析以下内容:

some, list, of, things

使用parser.sepBy(Scanners.isChar(',')可以轻松完成此操作,但无法解析更大的文档,除非我将其包装在between内。

最终我想要解析以下内容:

implements some.java.Interface, some.other.Interface {
  ...
}

然而,我找不到一个神奇的组合来说“sepBy X直到(但不消耗Y)”甚至“sepBy X直到失败”。

我在这里错过了一些简单的东西吗?

1 个答案:

答案 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对象。