gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:31:35 27 4
gpt4 key购买 nike

我有一个 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>传播最后一个排序解析器的结果的接口(interface)实现 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()值,但我找不到到达 digits4 的方法和 digits2解析器结果。我想知道:是否可以提取 digits4 , digits2description值合并为一个 Definition使用上述方法的对象?我在想 Definition构建器实现并将其通过解析器链以某种方式传递。还是应该重新考虑,如果是,那么如何?

最佳答案

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

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

对于分隔符标记,您可以使用 Parser.sepBy() 获益或 Parser.followedBy() : 这会让你有一个更短的 sequence()只有相关的结果。

关于java - 我如何从 JParsec 中的顺序解析器中提取所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com