簡體   English   中英

我該如何解析GHC核心?

[英]How can I parse GHC core?

我試圖解析從運行ghc -c -ddump-simpl myfile.hs獲得的ghc核心代碼。

我知道extcorecore庫是我的選擇。

我正在尋找一個描述這些庫使用的簡單示例。

[編輯]解析結果應該是一個數據結構,從中可以很容易地跟蹤函數可以采用的不同路徑。

考慮一個簡單的not功能

not True = False
not False = True

GHC會將其轉換為case表達式(僅考慮ghc -c -ddump-simple輸出)。 我想解析GHC核心的這個輸出。

我認為最簡單的方法是放棄這些外部核心庫,直接使用GHC作為庫。 基於Haskell wiki中的這個示例 ,我們可以創建一個將模塊轉換為Core的簡單函數:

import GHC
import GHC.Paths (libdir)
import HscTypes (mg_binds)
import CoreSyn
import DynFlags
import Control.Monad ((<=<))

compileToCore :: String -> IO [CoreBind]
compileToCore modName = runGhc (Just libdir) $ do
    setSessionDynFlags =<< getSessionDynFlags
    target <- guessTarget (modName ++ ".hs") Nothing
    setTargets [target]
    load LoadAllTargets
    ds <- desugarModule <=< typecheckModule <=< parseModule <=< getModSummary $ mkModuleName modName
    return $ mg_binds . coreModule $ ds

這是一個愚蠢的示例用法,用於處理其輸出以計算案例數:

-- Silly example function that analyzes Core
countCases :: [CoreBind] -> Int
countCases = sum . map countBind
  where
    countBind (NonRec _ e) = countExpr e
    countBind (Rec bs) = sum . map (countExpr . snd) $ bs

    countExpr (Case e _ _ alts) = countExpr e + sum (map countAlt alts)
    countExpr (App f e) = countExpr f + countExpr e
    countExpr (Lam _ e) = countExpr e
    countExpr (Let b e) = countBind b + countExpr e
    countExpr (Cast e _) = countExpr e
    countExpr (Tick _ e) = countExpr e
    countExpr _ = 0

    countAlt (_, _, rhs) = 1 + countExpr rhs

讓我們在你的例子中運行它:

main :: IO ()
main = do
   core <- compileToCore "MyNot"
   print $ countCases core

按預期輸出2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM