【问题标题】:Need a tutorial for using GHC to parse and typecheck Haskell需要一个使用 GHC 来解析和检查 Haskell 的教程
【发布时间】:2010-02-11 07:52:24
【问题描述】:

我正在做一个分析 Haskell 代码的项目。我决定使用 GHC 来解析源代码和推断类型,而不是编写我自己的代码来做这件事。现在,我正在阅读 Haddock 文档,但进展缓慢。有谁知道好的教程吗?

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

【问题讨论】:

  • 这是一个非常重要的需求!
  • @Adam 你找到答案了吗?我也在开发一个类似的应用程序。
  • 这方面有进展吗?这是一个 3 年前的问题,但像这样的教程正是我正在寻找的。​​span>

标签: haskell ghc ghc-api


【解决方案1】:

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

我用这个例子更新了wikipage

这里我们演示调用 parseModule、typecheckModule、desugarModule、getNamesInScope 和 getModuleGraph。这适用于 haskell 平台,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!"

【讨论】:

  • 您有任何示例如何进一步进行吗?我的意思是如何将 CORE 编译成二进制文件?
【解决方案2】:

亚当,这雪橇挺难的。自 2006 年推出以来,GHC API 的文档记录一直有些不足。我建议尝试查找一些使用 GHC API 编写的小型应用程序。问的正确地方可能是GHC users' mailing list

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多