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

时间:2010-02-11 07:52:25

标签: haskell ghc ghc-api

我正在开发一个分析Haskell代码的项目。我决定使用GHC来解析源代码并推断类型而不是编写我自己的代码来做到这一点。现在,我正在通过Haddock文档,但它进展缓慢。有谁知道一个很好的教程?

编辑:澄清一下,我不是在找像hlint这样的东西。我正在编写自己的工具来分析Haskell代码的运行时特性,所以就像我正在编写一个不同的hlint。我正在寻找的基本上是维基页面GHC As a library的扩展。

4 个答案:

答案 0 :(得分:10)

啊!在以下文档中找到了更好的切入点:   http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html

我使用此示例更新了wikipage

这里我们演示调用parseModule,typecheckModule,desugarModule,getNamesInScope和getModuleGraph。这适用于haskell-platform,ghc-6.12.1。

错误:libdir是硬编码的。见上面的ghc-paths。

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

答案 1 :(得分:9)

亚当,这是非常艰难的雪橇。自从2006年推出以来,GHC API一直没有得到充分证明。我建议尝试找一些使用GHC API编写的小应用程序。正确的问题可能是GHC users' mailing list

一个这样的程序是ghctags,它与GHC源代码树一起提供。我写了原始版本,但我不推荐它 - 代码上有太多的脚印,我不能再遵循它了。我能说的最好的是,虽然它很难遵循,但至少并且很难遵循 - 比所有GHC都简单得多。

答案 2 :(得分:2)

如果解析是最重要的,我推荐haskell-src-exts。它解析了所有Haskell98,一大堆扩展,非常易于使用。

答案 3 :(得分:-1)

如果您搜索文章,Haskell wikiGHC documentation可能就是您要找的内容。您可能感兴趣的工具是hlint,用于检查源代码的语法和其他内容。