aboutsummaryrefslogtreecommitdiff
path: root/main/Main.hs
blob: a7e242dcf3a46edc701e2839a6250ec0e809cf5b (plain)
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
module Main where

import System.Exit

import qualified CC.Parser as Parser
import qualified CC.Typecheck as Typecheck
import qualified CC.Backend.Dumb as Backend

import CC.Context
import CC.Pretty


-- Put the passes in a type-level list to be able to run subsequences of
-- passes.


type Pass a b = Context -> a -> Either String b

pass :: (Read a, Show b, Pretty e) => (Context -> a -> Either e b) -> Pass a b
pass f ctx a = either (Left . pretty) Right (f ctx a)

passJoin :: (Read a, Show c) => Pass a b -> Pass b c -> Pass a c
passJoin f1 f2 ctx a = f1 ctx a >>= f2 ctx

main :: IO ()
main = do
    let parse = pass Parser.runPass
        typecheck = pass Typecheck.runPass

    let combined = parse `passJoin` typecheck

    source <- getContents
    let context = Context "<stdin>" Backend.builtins
    case combined context (read source) of
        Right prog -> pprint prog
        Left err -> die err