У меня есть парсер для запроса 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?