簡體   English   中英

Parsec調試

[英]Parsec debugging

我一直在使用parsec,我在調試代碼時遇到問題。 例如,我可以在ghci中設置斷點,但我不知道如何查看已經消耗了多少輸入,或者類似的東西。

是否有工具/指南來幫助調試parsec代碼?

頁面可能有所幫助。

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) x

foo現在的工作方式和以前一樣,但是當你調用foo 1它會在評估時打印x is: 1到stderr。

要進行更深入的調試,您需要使用GHCI的調試命令。 具體來說,它聽起來像你正在尋找:force命令,它強制評估變量並將其打印出來。 (替代方法是:print命令,打印盡可能多的已經評估的變量,而不再進行評估。)

請注意:force更有助於計算變量的內容,但也可能會更改程序的語義(如果您的程序依賴於懶惰)。

一般的GHCI調試工作流程如下所示:

  • 使用:break來設置斷點
  • 使用:list:show context來檢查您在代碼中的位置
  • 使用:show bindings檢查變量綁定
  • 嘗試使用:print來查看當前綁定的內容
  • 使用:force必要時:force檢查綁定

如果您正在嘗試調試無限循環,它也有助於使用

  • :set -fbreak-on-error
  • :trace myLoopingFunc xy

然后你可以在循環期間Ctrl-C並使用:history來查看循環的內容。

您可以使用Text.Parsec.Prim中<?>運算符為您和您的用戶制作更好的錯誤消息。 Real World Haskell中有一些例子 如果您的解析器具有良好的子部件,那么您可以設置一些簡單的測試(或使用HUnit )以確保它們按預期單獨工作。

另一個有用的技巧

_ <- many anyChar >>= fail這會產生一個錯誤( Left ):

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做了類似的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM