Парсеры связывания; повторный анализ потребляемых данных
У меня есть парсер для запроса 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?