2014-08-27 3 views
0

하스켈을 번역하기 위해 attemp에 뛰어 들었습니다.추상 구문 트리를 탐색하십시오.

나는 걸을 필요HsModule 구조 은 문자열입니다HsIdent 문자열로 문자열이 영어 식별자 있는 모든HsIdent 문자열을, 번역, (parseModule 소스에 의해 반환) 다른 자연 언어 (즉, 이탈리아어, 프랑스어, ...)의 식별자.

관련 하위 구조에 대한 명시 적 전개 기능없이 HsModule 구조를 걸어 (즉, 모든 HsIdent 문자열에 함수를 적용하기 위해) TH에 직접적인 전략이 있는지 궁금합니다.

나는 내 요청에 충분히 명료하다. 당신의 소중한 도움에 대해 많은 감사드립니다.

감사합니다.

답변

0

Data.Generics 패키지에서 해결책을 찾았습니다.

HsModule 는 데이터 및Typeable 인스턴스이므로는 일반적인 패키지의 이송 기능을 처리 할 자격이있다. 나는 documented이기 때문에 SYB을 선택했다.

내 솔루션은 다음과 같습니다

module Main where 

import Data.Generics 
import Language.Haskell.Syntax 
import Language.Haskell.Parser 
import Language.Haskell.Pretty 
import Control.Monad 

translate:: ParseResult HsModule -> Maybe String 
translate r = case r of 
       ParseOk a -> Just (show $ prettyPrint $ translateHsIdent "_italian" a) 
       ParseFailed _ _ -> Nothing 

translateHsIdent :: Data a => String -> a -> a 
translateHsIdent k = everywhere (mkT (addStrangerIdentifier k)) 
    where 
     addStrangerIdentifier :: String -> HsName -> HsName 
     addStrangerIdentifier s (HsIdent i) = HsIdent (i ++ s) 

main = maybe (putStrLn "Parse Error") putStrLn result 
    where 
     result :: Maybe String 
     result = translate $ parseModule "main = putStrLn \"Just a Try\"" 

나는 그것이 다른 사람이 유용 할 수 있기를 바랍니다.

관련 문제