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

import System.Exit

import qualified CC.Parser
import qualified CC.Typecheck
import CC.Types


-- 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, Show e) => (Context -> a -> Either e b) -> Pass a b
pass f ctx a = either (Left . show) Right (f ctx a)

passJoin :: (Read a, Show b, Read b, 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 CC.Parser.runPass
        typecheck = pass CC.Typecheck.runPass

    let combined = parse `passJoin` typecheck

    source <- getContents
    let context = Context "<stdin>"
    case combined context (read source) of
        Right prog -> print prog
        Left err -> die (show err)