10

是否有可能以某种方式获得某些自定义类型的解析错误?例如,从错误中获取更多关于解析上下文的信息会很酷。而且仅以短信的形式提供错误信息似乎不太方便。

4

1 回答 1

8

正如 Rhymoid 所观察到的,不幸的是,这是不可能的。

Parsec与你自己的 -like monad结合Either也无济于事——它会退出太早(ParsecTover Either)或太晚(EitherTover ParsecT)。

如果你非常想要它,你可以这样做:使用ParsecTover State (SourcePos, YourErrorType)。(您不能使用 Parsec 的用户状态,因为这样会回溯错误。)

每次您想发出结构化错误值时,将其记录在当前位置的状态中,但前提是当前位置比已记录的位置更远。(如果位置相同,您可能希望以某种方式合并错误。也许保留它们的列表。)

最后,当您运行 monad 堆栈时,您将获得最终状态和ParseError包含 a 的 a SourcePos。只需检查这两个位置是否重合。如果他们没有(即 ParsecSourcePos更远),那么您没有此错误的错误值。

于 2013-05-16T22:21:20.593 回答