首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parsec调试

Parsec调试
EN

Stack Overflow用户
提问于 2012-02-28 22:47:12
回答 3查看 2.5K关注 0票数 9

我一直在使用parsec,但我在调试代码时遇到了问题。例如,我可以在ghci中设置一个断点,但是我不确定如何查看已经消耗了多少输入,或者类似的事情。

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

EN

回答 3

Stack Overflow用户

发布于 2012-02-29 00:43:40

This页面可能会有所帮助。

Debug.trace是你的朋友,它允许你基本上做一些printf调试。它计算并打印第一个参数,然后返回第二个参数。所以如果你有像这样的东西

代码语言:javascript
复制
foo :: Show a => a -> a
foo = bar . quux

您可以通过将foo更改为以下值来调试foo参数的'value‘:

代码语言:javascript
复制
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输出到stderr。

要进行更深入的调试,您需要使用GHCI的调试命令。具体地说,听起来像是在寻找:force命令,该命令强制对变量求值并将其输出。(另一种方法是使用:print命令,该命令将打印已计算的变量,而不再执行任何计算。)

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

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

  • 使用:break设置breakpoints
  • Use :list:show context检查您在代码中的位置
  • 使用:show bindings检查变量绑定
  • 尝试使用:print查看当前绑定的内容
  • 如果需要检查绑定,请使用:force

如果您正在尝试调试无限循环,那么使用

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

然后,您可以在循环期间输入Ctrl-C,并使用:history查看正在循环的内容。

票数 9
EN

Stack Overflow用户

发布于 2012-02-29 02:04:19

您也许能够在Text.Parsec.Prim中使用the operator为您和您的用户制作更好的错误消息。现实世界中的Haskell中有一些examples。如果您的解析器有很好的子部分,那么您可以设置一些简单的测试(或使用HUnit)来确保它们按照预期单独工作。

票数 5
EN

Stack Overflow用户

发布于 2018-02-25 23:04:17

另一个有用的技巧是:

_ <- many anyChar >>= fail这将生成以下错误(Left):

代码语言:javascript
复制
unexpected end of input
the remaining 'string'

我认为这里提到的parserTraceparserTraced函数http://hackage.haskell.org/package/parsec-3.1.13.0/docs/Text-Parsec-Combinator.html#g:1做了类似于上面的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9484065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档