- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Megaparsec 5。
关注 this guide ,我可以通过结合 StateT
来实现回溯用户状态和 ParsecT
(未定义的类型应该是明显的/不相关的):
type MyParser a = StateT UserState (ParsecT Dec T.Text Identity) a
p :: MyParser a
, 像这样:
parsed = runParser (runStateT p initialUserState) "" input
parsed
的类型是:
Either (ParseError Char Dec) (a, UserState)
最佳答案
您可以将自定义错误组件与 observing
结合使用。用于此目的的函数(参见 this great post 了解更多信息):
{-# LANGUAGE RecordWildCards #-}
module Main where
import Text.Megaparsec
import qualified Data.Set as Set
import Control.Monad.State.Lazy
data MyState = MyState Int deriving (Ord, Eq, Show)
data MyErrorComponent = MyErrorComponent (Maybe MyState) deriving (Ord, Eq, Show)
instance ErrorComponent MyErrorComponent where
representFail _ = MyErrorComponent Nothing
representIndentation _ _ _= MyErrorComponent Nothing
type Parser = StateT MyState (Parsec MyErrorComponent String)
trackState :: Parser a -> Parser a
trackState parser = do
result <- observing parser -- run parser but don't fail right away
case result of
Right x -> return x -- if it succeeds we're done here
Left ParseError {..} -> do
state <- get -- read the current state to add it to the error component
failure errorUnexpected errorExpected $
if Set.null errorCustom then Set.singleton (MyErrorComponent $ Just state) else errorCustom
observing
功能有点像
try
/
catch
捕获解析错误的 block ,然后读取当前状态并将其添加到自定义错误组件中。当
runParser
时依次返回自定义错误组件返回
ParseError
.
a = trackState $ do
put (MyState 6)
string "foo"
b = trackState $ do
put (MyState 5)
a
main = putStrLn (show $ runParser (runStateT b (MyState 0)) "" "bar")
关于haskell - Megaparsec,使用 StateT 和 ParsecT 回溯用户状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798950/
我有一个使用 permute 的文件解析器来自 parsec 结合各种Parser秒。看起来像 permute只允许 Identity monad,我确信它会降低算法的复杂性。 现在我正在尝试将我所有
我有一个解析器定义为以下稍微复杂的版本: data X = X { getX :: State ([Int], [X]) Bool } type Parser = ParsecT Void Strin
的文档秒差距包states that u参数用于通过一元计算携带一些用户状态。但是同样的功能可以通过 ParsecT 来实现。 State 上的单子(monad)变压器单子(monad)。所以如果我的
我今天早些时候正在写一些 Haskell。想出了一些类似的东西 {-# LANGUAGE GeneralizedNewtypeDeriving #-} newtype Foo a = Foo { Pa
使用 Megaparsec 5。 关注 this guide ,我可以通过结合 StateT 来实现回溯用户状态和 ParsecT (未定义的类型应该是明显的/不相关的): type MyParser
我是一名优秀的程序员,十分优秀!