-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathScmToIR.hs
65 lines (59 loc) · 1.95 KB
/
ScmToIR.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import Data.Map (Map)
import qualified Data.Map as Map
import Data.List (intercalate)
import Control.Monad
import Util.Temp
import qualified Util.Ppr as Ppr
import Frontend.Parser
import Frontend.Scheme.AST
import Frontend.Scheme.Mangler
import Frontend.Scheme.CPSTrans
import Frontend.Scheme.UpvalLift
import Frontend.Scheme.GenC
pprScDefns scDefns =
forM_ (Map.toList scDefns) $ \(name, expr) -> do
pprScDefn name expr
pprScDefn name expr = do
putStr $ name ++ " = "
putStrLn $ Ppr.ppr $ Ppr.render expr
putStrLn ""
main = do
prog <- liftM readProgSucc getContents
let (ast,cps,uvl,mgd,cSrc) = runTempGen $ do
defns <- runASTGen $ toAST prog
cpsForm <- runCPSTrans $ forM (Map.toList defns) $
\(name, expr) ->
case expr of
ELambda _ _ _ -> do
expr' <- transformToplevel expr
return (name, expr')
_ ->
return (name, expr)
uvLifted <- runUpvalGen $ forM cpsForm $ \(name, expr) ->
case expr of
ELambda _ _ _ -> do
expr' <- liftUpval expr
return (name, expr')
_ ->
return (name, expr)
mangled <- forM uvLifted $ \(name, expr) ->
return (mangle name, fmap mangle expr)
cSource <- runGenC (mkGenState mangled) genToplevel
return (defns
, Map.fromList cpsForm
, Map.fromList uvLifted
, Map.fromList mangled
, cSource)
putStrLn "/*"
pprScDefns ast
putStrLn (take 78 (repeat '*'))
pprScDefns cps
putStrLn (take 78 (repeat '*'))
pprScDefns uvl
putStrLn (take 78 (repeat '*'))
pprScDefns mgd
putStrLn (take 78 (repeat '*'))
putStrLn "*/"
putStrLn "#include \"scm_runtime.h\""
putStrLn cSrc
return ()