代码之家  ›  专栏  ›  技术社区  ›  Adam Crume

需要一个使用GHC解析和类型检查Haskell的教程吗

  •  24
  • Adam Crume  · 技术社区  · 16 年前

    我正在做一个分析Haskell代码的项目。我决定使用GHC解析源代码并推断类型,而不是编写自己的代码来实现这一点。现在,我正在苦读黑线鳕的文档,但进展缓慢。有人知道一个好的教程吗?

    GHC As a library .

    4 回复  |  直到 13 年前
        1
  •  9
  •   Norman Ramsey    16 年前

    亚当,这是一次非常艰难的滑雪。自2006年推出以来,GHC API的文档记录就有些不足。我建议您尝试寻找一些使用GHCAPI编写的小型应用程序。正确的提问地点可能是 GHC users' mailing list .

    一个这样的项目是 ghctags ,它随GHC源代码树一起提供。我编写了原始版本,但我不能推荐它,因为代码上有太多的封装外形,我无法再遵循它了。我能说的最好的话是,尽管很难理解,但至少是 而且很难理解,这比所有GHC都要简单得多。

        2
  •  10
  •   ja.    16 年前

    啊!!在以下位置找到了一个更好的文档入口: http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html

    我更新了 wikipage 在这个例子中:

    这里我们演示如何调用parseModule、typecheckModule、desugarModule、GetNameInscope和getModuleGraph。这适用于haskell平台,ghc-6.12.1。

    错误:libdir是硬编码的。请参见上面的ghc路径。

    --A.hs
    --invoke: ghci -package ghc A.hs
    import GHC
    import Outputable
    
    --import GHC.Paths ( libdir )
    import DynFlags ( defaultDynFlags )
    libdir = "/usr/local/lib/ghc-6.12.1"
    targetFile = "B.hs"
    
    main = do
       res <- example
       print $ showSDoc ( ppr res )
    
    example = 
        defaultErrorHandler defaultDynFlags $ do
          runGhc (Just libdir) $ do
            dflags <- getSessionDynFlags
            setSessionDynFlags dflags
            target <- guessTarget targetFile Nothing
            setTargets [target]
            load LoadAllTargets
            modSum <- getModSummary $ mkModuleName "B"
            p <- parseModule modSum
            t <- typecheckModule p
            d <- desugarModule t
            l <- loadModule d
            n <- getNamesInScope
            c <- return $ coreModule d
    
            g <- getModuleGraph
            mapM showModule g     
            return $ (parsedSource d,"/n-----/n",  typecheckedSource d)
    
    --B.hs
    module B where
    
    main = print "Hello, World!"
    
        3
  •  2
  •   Matt Roberts    16 年前

    如果解析是最重要的,我建议使用haskell-src-exts。它解析所有Haskell 98,这是一堆扩展,非常容易使用。

        4
  •  -1
  •   Jonno_FTW    16 年前