Поддерживает ли Attoparsec сохранение и изменение состояния пользователя?

Я использую Attoparsec и хочу отслеживать значение пользовательского состояния во время выполнения задачи синтаксического анализа.

Я знаком с монадическими функциями getState, putState и ModifyState в Parsec, но не могу найти аналог в Attoparsec. Есть ли тривиальный способ сделать это с помощью чего-то внутреннего для Attoparsec или с помощью монады State?


person Robert Bermani    schedule 28.05.2015    source источник


Ответы (1)


Вы можете использовать StateT s Parser, просто помните, что возврат в синтаксическом анализаторе также откатывает состояние, поэтому вы получаете только те действия с отслеживанием состояния, которые были вызваны на пути кода с успешным синтаксическим анализом.

{-# LANGUAGE OverloadedStrings #-}

import Data.Attoparsec.ByteString.Char8
import Control.Monad.State
import Control.Applicative

test :: StateT Int Parser ()
test = do
  many $ choice [
    (modify (+1) *> lift (string "car")),
    (modify (+1) *> lift (string "cat"))]
  pure ()

parseOnly (runStateT test 0) "catcatcat"
-- Right ((),3)

Кроме того, мы можем использовать большинство комбинаторов Attoparsec из коробки, потому что они имеют универсальные типы с ограничениями Alternative, MonadPlus, Applicative или Monad, а StateT определяет для них сквозные экземпляры. Мы можем использовать lift для основных Parser-ов.

person András Kovács    schedule 28.05.2015
comment
Спасибо, очень признателен. Похоже, это приведет меня к этому с помощью Attoparsec, поэтому я отмечу это как ответ. - person Robert Bermani; 28.05.2015