如何从JParsec中的有序解析器中提取所有值?

时间:2016-11-13 16:14:51

标签: java jparsec

我有一个JParsec解析器,它包含一些"较小的"解析器,我想提取用这些解析器解析的总值。让我们说:

//                          V-- because of sequence()
private static final Parser<Object> definitionParser = sequence(
        substitute, separator, digits4, separator, digits2, separator, description.optional()
);

上面的一些解析器是虚拟的,用于分隔数据字段。虚拟解析器是substituteseparator,我不会从中提取任何内容。但是,其余的解析器让我感兴趣:

private static final Parser<Short> digits4 = ...; // 4 hex digits, just a short value
private static final Parser<Byte> digits2 = ...; // 2 hex digits, just a byte value
private static final Parser<String> description = ...; // arbitrary string

但是,map ping substituteDefinition解析器需要Map<Object, Definition>接口实现,将最后一个排序解析器description.optional()的结果传播到Map实现,并且传入的参数是String

private static final Parser<Definition> definitionParser = sequence(
        substitute, separator, digits4, separator, digits2, separator, description.optional()
).map(new Map<Object, Definition>() {
    @Override
    public Definition map(final Object o) {
        ... o is a String here because description.optional() is the last one
    }
});

显然,我只能在此处提取description.optional()值,但我无法找到达到digits4digits2解析器结果的方法。我想知道:是否可以使用上述方法将digits4digits2description值提取到单个Definition对象中?我在想一个Definition构建器实现,并通过解析器链以某种方式传递。或者应该重新考虑,如果是,那么如何?

2 个答案:

答案 0 :(得分:2)

如果要使用部分或全部解析器的返回值,则sequence(Parser<?> ... parsers)不是您应该使用的组合子。根据要组合的解析器数量,您可以使用以下之一:

  • 2到5个解析器的覆盖sequence()组合器,您可以应用适当的map()
  • list()组合器返回您的解析器结果List<Object>
  • 返回array()
  • Object[]组合子
  • 从2到5元组返回的tuple()组合子。

对于分隔符令牌,您可以使用Parser.sepBy()Parser.followedBy()受益:这样您就可以缩短sequence()只有相关结果。

答案 1 :(得分:0)

现在,sequence 要使用的组合器。 sequence的最后一个参数可以是lambda,您将从此处指定的解析器中获取所有结果。

所以您得到Parsers.sequence(parserA, parserB, parserC, (a, b, c) -> make_the_parser_result_using_a_b_c);