Парсеры связывания;повторный анализ потребляемых данных - PullRequest
0 голосов
/ 16 ноября 2018

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

...