Parsec调试

Xod*_*rap 8 parsing haskell parsec

我一直在使用parsec,我在调试代码时遇到问题.例如,我可以在ghci中设置断点,但我不知道如何查看已经消耗了多少输入,或者类似的东西.

是否有工具/指南来帮助调试parsec代码?

So8*_*res 9

此页面可能有所帮助.

Debug.trace是你的朋友,它允许你基本上做一些printf调试.它评估并打印其第一个参数,然后返回其第二个参数.所以,如果你有类似的东西

foo :: Show a => a -> a
foo = bar . quux
Run Code Online (Sandbox Code Playgroud)

您可以通过更改foo为以下内容来调试foo参数的"值" :

import Debug.Trace(trace)

foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) x
Run Code Online (Sandbox Code Playgroud)

foo现在的工作方式和以前一样,但是当你调用foo 1它时,它现在会x is: 1在评估时打印到stderr.

要进行更深入的调试,您需要使用GHCI的调试命令.具体来说,听起来你正在寻找:force命令,它强制评估变量并将其打印出来.(另一种选择是:print命令,它打印尽可能多的已经评估的变量,而不再进行评估.)

请注意,:force更有助于计算变量的内容,但也可能会更改程序的语义(如果您的程序依赖于懒惰).

一般的GHCI调试工作流程如下所示:

  • 使用:break设置断点
  • 使用:list和:show context检查代码中的位置
  • 使用:show bindings检查变量绑定
  • 尝试使用:print以查看当前绑定的内容
  • :force如有必要,请使用以检查绑定

如果您正在尝试调试无限循环,它也有助于使用

  • :set -fbreak-on-error
  • :trace myLoopingFunc x y

然后你可以Ctrl-C在循环中点击并使用:history以查看循环.


Chr*_*icz 5

您也许可以使用Text.Parsec.Prim中的<?>运算符为您和您的用户提供更好的错误消息。现实世界中的Haskell中有一些示例。如果您的解析器具有良好的子部分,则可以设置一些简单的测试(或使用HUnit)以确保它们可以按预期单独工作。