Parsec,在解析结束后访问最后一个用户状态

时间:2016-01-21 10:33:12

标签: haskell parsec

我有一个简单的解析器scriptParser,它使用用户状态(类型和内容在这里不重要)。它会返回String的错误消息或Statement的列表(同样,不重要的是如何定义):

parseScript :: String -> Either String [Statement]
parseScript input
  = let parsed = runParser scriptParser initialUserState "" input
    in  case parsed of
          Left e   -> Left (parseError input e)
          Right ss -> Right ss

parseError只是根据einput格式化错误消息(它显示错误位置周围的代码片段)。

我的问题是,如果我还要根据上一个可用的用户状态自定义错误消息该怎么办?显然,runParser结束后用户状态消失了。 runParserT之后是否允许访问用户状态?

1 个答案:

答案 0 :(得分:4)

据我了解,Parsec会因错误而抛弃内置用户状态,因此无法恢复它。

或者,您可以将用户状态转移到m中的ParsecT s u m a monad,例如,您可能拥有ParsecT String () (State s) a

这样,runParserT返回State s (Either ParseError a)类型,您可以从中恢复最后一个状态。

此外,由于ParsecT String () (State s) aMonadState s instance,因此您可以毫无问题地使用get和其他MonadState功能。