首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历抽象语法树

遍历抽象语法树
EN

Stack Overflow用户
提问于 2014-08-27 14:40:04
回答 1查看 475关注 0票数 0

为了翻译Haskell,我投入了一段时间。

I需要遍历 HsModule结构(由parseModule源代码返回),将每个 HsIdent字符串(其中字符串是英语标识符)转换为 HsIdent字符串,其中字符串是其他一些自然语言(即意大利语、法语、.)中的标识符。

我想知道是否存在一些直接的策略,也许在TH中,是为了遍历一个HsModule结构(即对每个HsIdent字符串应用一个函数),而不对所涉及的子结构进行显式的展开函数?

我希望我的请求足够明确,非常感谢你的宝贵帮助。

诚挚的问候。

EN

回答 1

Stack Overflow用户

发布于 2014-08-30 13:25:51

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

HsModule是一个数据和可键入的实例,因此它有资格使用泛型包的遍历函数来处理它。我选择赛伯是因为记录在案很好。

我的解决办法是:

代码语言:javascript
复制
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\""

我希望它能对别人有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25530130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档