我有一个简单的解析器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
只是根据e
和input
格式化错误消息(它显示错误位置周围的代码片段)。
我的问题是,如果我还要根据上一个可用的用户状态自定义错误消息该怎么办?显然,runParser
结束后用户状态消失了。 runParserT
之后是否允许访问用户状态?
答案 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) a
有MonadState s
instance,因此您可以毫无问题地使用get
和其他MonadState
功能。