我有一个用于uri查询的解析器。查询是十六进制/uri编码的。
我还有一个用于解码字符串的解析器;它从查询参数中生成键值选项对。
我想做一个两阶段的传递:一个检测查询字符串,另一个解析查询字符串的内容;然后将它们组合成一个fparsec解析器。
或者简而言之;
let private Predicate i =
isPchar i
|| i = 0x2f // /
|| i = 0x3f // ?
let contentP =
PercentEncoding.makeParser Predicate
let paramsP =
contentP >>= fun q ->
run QueryParams.queryParamsP q
然而,
contentP
推进charstream的状态,并且
run ...
生成一个parseResult,而不是一个解析器。我真的很想做些
contentP |> Parser.bindSuccess queryParamsP
,同时返回预期的分析器状态。
如何用fparsec来表达?