我有一个JParsec解析器,它包含一些"较小的"解析器,我想提取用这些解析器解析的总值。让我们说:
// V-- because of sequence()
private static final Parser<Object> definitionParser = sequence(
substitute, separator, digits4, separator, digits2, separator, description.optional()
);
上面的一些解析器是虚拟的,用于分隔数据字段。虚拟解析器是substitute
和separator
,我不会从中提取任何内容。但是,其余的解析器让我感兴趣:
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()
值,但我无法找到达到digits4
和digits2
解析器结果的方法。我想知道:是否可以使用上述方法将digits4
,digits2
和description
值提取到单个Definition
对象中?我在想一个Definition
构建器实现,并通过解析器链以某种方式传递。或者应该重新考虑,如果是,那么如何?
答案 0 :(得分:2)
如果要使用部分或全部解析器的返回值,则sequence(Parser<?> ... parsers)
不是您应该使用的组合子。根据要组合的解析器数量,您可以使用以下之一:
sequence()
组合器,您可以应用适当的map()
,list()
组合器返回您的解析器结果List<Object>
,array()
Object[]
组合子
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);