3

我想在我的 attoparsec 解析器中进行一些跟踪/调试。这是最小的 [not] 工作示例:

import Data.Text as T
import Data.Attoparsec.Text
import Data.Attoparsec.Combinator
import Control.Applicative ((<*), (*>))

parseSentences :: Parser [T.Text]
parseSentences = many1 $ takeWhile1 (/= '.') <* char '.' <* skipSpace

parser :: Parser [T.Text] 
parser = do
    stuff <- parseSentences
--    putStrLn $ "Got stuff: " ++ show stuff

    tail <- takeText
--    putStrLn $ "Got tail: " ++ show tail

    return $ stuff ++ [tail, T.pack "more stuff"]

main = do
    let input = T.pack "sample. example. bang"
    print $ parseOnly parser input

为了在解析器中使用 IO 操作,我必须做什么?

4

1 回答 1

5

如果您使用了 Parsec 库,您将有可能使用 Parsec monad 转换器在代码中混合 IO 和解析器命令。

然而,Attoparsec 是一个纯解析器,因此您必须使用该Debug.Trace.trace函数将消息输出到终端以进行调试。

parser = do
  stuff <- parseSentences
  tail <- takeText
  return .
    trace ("Got stuff: " + show stuff) .
    trace ("Got tail: "  + show tail) $
    stuff ++ [tail, T.pack "more stuff"]

当评估关联值(此处为表达式的结果)时,将打印消息stuff ++ ...

于 2012-04-10T14:15:04.820 回答