Parsec,解析结束后访问最后一个用户状态
Parsec, access last user state after parsing has ended
我有一个简单的解析器scriptParser
,它使用用户状态(类型和内容在这里不重要)。它 returns 错误消息的 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
之后会允许访问用户状态吗?
据我了解,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
函数。
我有一个简单的解析器scriptParser
,它使用用户状态(类型和内容在这里不重要)。它 returns 错误消息的 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
之后会允许访问用户状态吗?
据我了解,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
函数。