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

Parsec, access last user state after parsing has ended

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

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 之后会允许访问用户状态吗?

据我了解,Parsec 会在出现错误时丢弃 built-in 用户状态,因此无法恢复它。

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

这样,runParserT returns 输入 State s (Either ParseError a),您可以从中恢复最后的状态。

此外,由于 ParsecT String () (State s) a 有一个 MonadState s instance,您可以毫无问题地使用 get 和其他 MonadState 函数。