我一直在使用parsec,但我在调试代码时遇到了问题。例如,我可以在ghci中设置一个断点,但是我不确定如何查看已经消耗了多少输入,或者类似的事情。
有没有工具/指南可以帮助调试parsec代码?
发布于 2012-02-29 00:43:40
This页面可能会有所帮助。
Debug.trace是你的朋友,它允许你基本上做一些printf调试。它计算并打印第一个参数,然后返回第二个参数。所以如果你有像这样的东西
foo :: Show a => a -> a
foo = bar . quux您可以通过将foo更改为以下值来调试foo参数的'value‘:
import Debug.Trace(trace)
foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) xfoo现在的工作方式与以前一样,但是当您调用foo 1时,它现在会在计算时将x is: 1输出到stderr。
要进行更深入的调试,您需要使用GHCI的调试命令。具体地说,听起来像是在寻找:force命令,该命令强制对变量求值并将其输出。(另一种方法是使用:print命令,该命令将打印已计算的变量,而不再执行任何计算。)
请注意,:force在找出变量的内容方面更有帮助,但也可能改变程序的语义(如果您的程序依赖于惰性)。
一般的GHCI调试工作流如下所示:
:break设置breakpoints:list和:show context检查您在代码中的位置:show bindings检查变量绑定:print查看当前绑定的内容:force 如果您正在尝试调试无限循环,那么使用
:set -fbreak-on-error:trace myLoopingFunc x y然后,您可以在循环期间输入Ctrl-C,并使用:history查看正在循环的内容。
发布于 2012-02-29 02:04:19
您也许能够在Text.Parsec.Prim中使用the operator为您和您的用户制作更好的错误消息。现实世界中的Haskell中有一些examples。如果您的解析器有很好的子部分,那么您可以设置一些简单的测试(或使用HUnit)来确保它们按照预期单独工作。
发布于 2018-02-25 23:04:17
另一个有用的技巧是:
_ <- many anyChar >>= fail这将生成以下错误(Left):
unexpected end of input
the remaining 'string'我认为这里提到的parserTrace和parserTraced函数http://hackage.haskell.org/package/parsec-3.1.13.0/docs/Text-Parsec-Combinator.html#g:1做了类似于上面的事情。
https://stackoverflow.com/questions/9484065
复制相似问题