2012-04-10 2 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

확인을 클릭하십시오. 하지만 원래 코드에서와 같이 파서 쿼리 사이에서 어떻게 처리 할 수 ​​있습니까? 추적하고 거기에서 산출물을 얻기 위해 먹이를주는 일은 없을까요? – wiz

+1

당신은'trace "를 할 수 있습니다 ..."$ return()'아마도 ... – dflemstr

+0

고마워요! 그게 잘 됐어! – wiz