This repository has been archived by the owner on Feb 18, 2020. It is now read-only.
/
Compiler.hs
55 lines (50 loc) · 1.48 KB
/
Compiler.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
{-# LANGUAGE
FlexibleContexts
#-}
module Compiler where
import AlphaConvert
import BetaReduce
import ClosureConvert
import ConstantsFold
import EliminateDefinitions
import Inline
import Immidiate
import KNormal
import LetFlatten
import PatternMatching
import RegAlloc
import X86.Syntax
import Syntax
import TypedSyntax
import TypeInference
import VMCode
import Emit
import CompilerState
import Control.Monad.Error
import Control.Monad.State
compiler :: (MonadIO m, MonadState CompilerState m) =>
Integer -> TypedExpr -> m Prog
compiler t e0 = do
e1 <- compilePatternMatching e0
e2 <- convertToKNormal e1
e3 <- alphaConvert e2
e4 <- liftIO $ betaReduce e3
let e5 = letFlatten e4
e6 <- inline t e5
let e7 = constantsFold e6
e8 <- liftIO $ eliminateDefinitions e7
e9 <- liftIO $ closureConvert e8
e10 <- generateVMCode e9
e11 <- liftIO $ optimizeProgram e10
e12 <- regAllocProgram e11
emitProgram e12
compile :: (MonadIO m, MonadState CompilerState m, MonadError String m) =>
Integer -> Expr -> m Prog
compile inlineTreshold expr = do
t <- typeOfExpression emptyEnv expr
compiler inlineTreshold t
output :: (MonadIO m, MonadState CompilerState m, MonadError String m) =>
Integer -> Expr -> FilePath -> m ()
output inlineTreshold expr path = do
p <- compile inlineTreshold expr
liftIO $ writeFile path (show p)