我有一個由幾個「小」分析器組成的JParsec分析器,我想提取用這些分析器解析的總值。假設:如何從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
平的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
構建器實現,並將它通過解析器鏈以某種方式傳遞給。還是應該重新考慮,如果是的話,那麼如何?
它像一個魅力工作!非常感謝你!請再說一個問題:是否可以過濾掉''分析器?爲什麼我問:我正在提取像'l.get(2)','l.get(4)'和'l.get(6)'這樣的有效值,而且它看起來並不自然我。我的意思是,爲了分別用'l.get(0)','l.get(1)'和'l.get(2)'提取值,是否可以組合解析器的分隔符?我目前使用'list()'combinator。 –
正如我在回答的最後一段中所建議的那樣,您可以執行'substitute.followedBy(separator)'而不是將兩個解析器按順序排列。 'followedBy'內解析器的返回值被忽略。 – insitu
我會試一試。謝謝! –