0

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

some, list, of, things

这很容易用 with 完成,parser.sepBy(Scanners.isChar(',')但无法解析更大的文档,除非我将它包装在between.

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

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

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

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

4

1 回答 1

1

在示例目录中有一个或多或少完整的 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(). 请注意,此片段是一系列解析器的可选部分,其返回的元素用于创建ClassDefAST 对象。

于 2015-08-05T11:59:21.760 回答