6

我正在使用 Attoparsec,我想在整个解析任务中跟踪用户状态值。

我熟悉 Parsec 的一元函数 getState、putState 和 modifyState,但我似乎无法在 Attoparsec 中找到类似的函数。有没有一种简单的方法可以通过 Attoparsec 内部的东西或使用 State monad 来做到这一点?

4

1 回答 1

5

您可以使用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为这些定义了提升实例。我们可以使用基本的-s。ApplicativeMonadStateTliftParser

于 2015-05-28T13:56:40.730 回答