是否有可能以某种方式获得某些自定义类型的解析错误?例如,从错误中获取更多关于解析上下文的信息会很酷。而且仅以短信的形式提供错误信息似乎不太方便。
问问题
519 次
1 回答
8
正如 Rhymoid 所观察到的,不幸的是,这是不可能的。
Parsec
与你自己的 -like monad结合Either
也无济于事——它会退出太早(ParsecT
over Either
)或太晚(EitherT
over ParsecT
)。
如果你非常想要它,你可以这样做:使用ParsecT
over State (SourcePos, YourErrorType)
。(您不能使用 Parsec 的用户状态,因为这样会回溯错误。)
每次您想发出结构化错误值时,将其记录在当前位置的状态中,但前提是当前位置比已记录的位置更远。(如果位置相同,您可能希望以某种方式合并错误。也许保留它们的列表。)
最后,当您运行 monad 堆栈时,您将获得最终状态和ParseError
包含 a 的 a SourcePos
。只需检查这两个位置是否重合。如果他们没有(即 ParsecSourcePos
更远),那么您没有此错误的错误值。
于 2013-05-16T22:21:20.593 回答