2012-04-10 6 views
3

私はattoparsecパーサーでトレース/デバッグをしたいと思っています。ここでは、最小限の[ありません]作業例です:attoparsec ParserにIOを正しく追加するには?

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アクションを使用するために何をすべきか?

答えて

5

Parsecライブラリを使用していた場合、Parsecモナド変圧器を使用して、コード内でIOとパーサのコマンドを混在させることができます。

しかし、Attoparsecは純粋なパーサーなので、デバッグの目的で端末にメッセージを出力するにはDebug.Trace.trace関数を使用する必要があります。関連する値は、(式stuff ++ ...の結果をここに)評価される場合

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

メッセージが印刷されます。

+0

[OK]をクリックします。しかし、私は元のコードのように、パーサのクエリの間でどのようにそれらを行うことができますか?トレースするフィードを取得し、そこから出力を得るためのノーオペレーションはありますか? – wiz

+1

あなたは 'trace 'を行うことができます..." $ return() 'おそらく... – dflemstr

+0

ありがとう!それはうまくいった! – wiz

関連する問題