遍历抽象语法树

时间:2014-08-27 14:40:04

标签: data-structures abstract-syntax-tree

我试图翻译Haskell。

我需要步行 HsModule结构(由parseModule源返回),   翻译每个 HsIdent String ,其中String是英文标识符    into HsIdent String ,其中String是其他一些自然语言的标识符(即意大利语,法语,......)。

我想知道是否存在一些直接策略,也许是在TH中,可以使用HsModule结构(即将函数应用于每个HsIdent字符串),而不涉及所涉及子结构的显式展开函数?

我希望我的要求足够清楚;非常感谢你的宝贵帮助。

最好的问候。

1 个答案:

答案 0 :(得分:0)

我在Data.Generics包中找到了一个解决方案。

HsModule是 Data Typeable 的一个实例,因此它有资格使用Generic包的遍历函数来处理它。我之所以选择SYB是因为documented非常好。

我的解决方案是:

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\""

我希望它对其他人有用。