parsing - 秒级调试

标签 parsing haskell parsec

我一直在使用 parsec,但在调试代码时遇到了麻烦。例如,我可以在 ghci 中设置断点,但我不确定如何查看消耗了多少输入,或者类似的东西。

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

最佳答案

This页面可能会有所帮助。
Debug.trace是你的 friend ,它允许你做一些 printf调试。它计算并打印它的第一个参数,然后返回它的第二个。所以如果你有类似的东西

foo :: Show a => a -> a
foo = bar . quux

您可以通过更改 foo 来调试 foo 参数的“值”。到以下:
import Debug.Trace(trace)

foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) x

foo 现在将像以前一样工作,但是当您调用 foo 1 时它现在将打印 x is: 1评估时到标准错误。

要进行更深入的调试,您需要使用 GHCI 的调试命令。具体来说,听起来您正在寻找 :force命令,它强制评估变量并将其打印出来。 (替代方法是 :print 命令,它打印已评估的尽可能多的变量,不再评估。)

请注意 :force更有助于找出变量的内容,但也可能改变程序的语义(如果您的程序依赖于惰性)。

一般的 GHCI 调试工作流程如下所示:
  • 使用:break设置断点
  • 使用:list:show context检查您在代码中的位置
  • 使用:show bindings检查变量绑定(bind)
  • 尝试使用 :print查看当前绑定(bind)的内容
  • 使用:force如有必要检查您的绑定(bind)

  • 如果您正在尝试调试无限循环,它也有助于使用
  • :set -fbreak-on-error
  • :trace myLoopingFunc x y

  • 然后你可以打Ctrl-C在循环期间并使用 :history看看有什么循环。

    关于parsing - 秒级调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484065/

    相关文章:

    c - Bison解析全局变量和函数

    Haskell cabal 对文件和模块名称感到困惑

    haskell - 在 Haskell 中的元组和列表上 Applicative 的不同行为

    haskell - 使用 State Monad 时了解符号 "<-"吗?

    使用 Parsec 解析数据并省略注释

    haskell - Parsec:解析后获取原始源

    php - 使用 preg_split 拆分和弦和单词

    ruby - 删除 CSV 文件中的空格

    mongodb - 使用 MongoDB 索引 Markdown 文件

    haskell - Parsec:消耗所有输入