diff --git a/Epic/Bytecode.lhs b/Epic/Bytecode.lhs
--- a/Epic/Bytecode.lhs
+++ b/Epic/Bytecode.lhs
@@ -20,6 +20,10 @@
 >             | ADDARGS TmpVar TmpVar [TmpVar]
 >             | FOREIGN Type TmpVar String [(TmpVar, Type)]
 >             | VAR TmpVar Local
+>             | GROWROOT Int
+>             | ADDVARROOT Local
+>             | ADDTMPROOT TmpVar
+>             | DROPROOTS Int
 >             | ASSIGN Local TmpVar
 >             | TMPASSIGN TmpVar TmpVar
 >             | NOASSIGN Local TmpVar -- No-op, but flag not to eval the register
@@ -44,6 +48,11 @@
 >             | LABEL Int
 >             | WHILE Bytecode Bytecode
 >             | WHILEACC Bytecode TmpVar Bytecode
+>               -- MEMORY allocates a pool of (2nd) TmpVar bytes, runs the 
+>               -- code using that pool for allocation, then copies the 
+>               -- result (1st TmpVar) into the previously active pool and 
+>               -- deallocates the used pool.
+>             | MEMORY Allocator TmpVar TmpVar Bytecode 
 >             | BREAKFALSE TmpVar
 >             | JFALSE TmpVar Int
 >             | JUMP Int
@@ -59,7 +68,7 @@
 
 > type Bytecode = [ByteOp]
 
-> data FunCode = Code [Type] Bytecode
+> data FunCode = Code Int [Type] Bytecode
 >   deriving Show
 
 > data CompileState = CS { arg_types :: [Type],
@@ -72,9 +81,9 @@
 > compile :: Context -> Name -> Func -> FunCode
 > compile ctxt fname fn@(Bind args locals def flags) = 
 >     let cs = (CS (map snd args) (length args) 1 [] 1 0)
->         code = evalState (scompile ctxt fname fn) cs 
+>         (code, state) = runState (scompile ctxt fname fn) cs 
 >         opt = peephole' evalled code in
->               Code (map snd args) opt
+>               Code (num_locals state + next_tmp state) (map snd args) opt
 >   where evalled | elem Strict flags = [] --take locals [0..]
 >                 | otherwise = []
 
@@ -86,7 +95,9 @@
 >        code <- ecomp (False, True) Tail def 0 (length args)
 >        cs <- get
 >        return $ (LOCALS (num_locals cs)):
+>                 (GROWROOT (num_locals cs + next_tmp cs)):
 >                 (TRACE (show fname) [0..(length args)-1]):
+>                 map ADDVARROOT [0..(length args)-1] ++
 >                 (TMPS (max_tmp cs)):(CONSTS (string_pool cs)):code ++
 >                   [RETURN 0]
 
@@ -143,23 +154,24 @@
 >       savetmp <- get_tmp
 >       code <- acomp tcall lazy (R x) [] reg vs
 >       set_tmp savetmp
->       return code
+>       return (code ++ [ADDTMPROOT reg])
 >     ecomp lazy tcall (App f as) reg vs = do
 >       savetmp <- get_tmp
 >       code <- acomp tcall lazy f as reg vs
 >       set_tmp savetmp
->       return code
+>       return (code ++ [ADDTMPROOT reg])
 >     ecomp (lazy, update) tcall (Lazy e) reg vs = ecomp (True, update) tcall e reg vs
 >     ecomp (lazy, update) tcall (Effect e) reg vs = 
 >         do ecode <- ecomp (lazy, False) tcall e reg vs
->            return (ecode ++ [EVAL reg False])
+>            return (ecode ++ [EVAL reg False, ADDTMPROOT reg])
 >     ecomp lazy tcall (Con t as) reg vs = 
 >         do (argcode, argregs) <- ecomps lazy as vs
->            return $ argcode ++ [CON reg t argregs]
+>            return $ argcode ++ [CON reg t argregs, ADDTMPROOT reg]
 >     ecomp lazy tcall (Proj con i) reg vs =
 >         do reg' <- new_tmp
 >            concode <- ecomp lazy Middle con reg' vs
->            return $ concode ++ [EVAL reg' (snd lazy), PROJ reg reg' i]
+>            return $ concode ++ [EVAL reg' (snd lazy), PROJ reg reg' i,
+>                                 ADDTMPROOT reg]
 >     ecomp lazy tcall (Const c) reg vs = ccomp c reg
 >     ecomp lazy tcall (Case scrutinee alts) reg vs =
 >         do screg <- new_tmp
@@ -172,6 +184,11 @@
 >            tcode <- ecomp lazy tcall t reg vs
 >            ecode <- ecomp lazy tcall e reg vs
 >            return $ acode ++ [EVAL areg (snd lazy), IF areg tcode ecode]
+>     ecomp lazy tcall (WithMem a e val) reg vs =
+>         do ereg <- new_tmp
+>            ecode <- ecomp lazy Middle e ereg vs
+>            valcode <- ecomp lazy Middle val reg vs
+>            return $ ecode ++ [EVAL ereg (snd lazy), MEMORY a reg ereg valcode]
 >     ecomp lazy tcall (While t b) reg vs =
 >         do savetmp <- get_tmp
 >            start <- new_label
@@ -211,7 +228,8 @@
 >            rcode <- ecomp lazy Middle r rreg vs
 >            set_tmp savetmp
 >            return $ lcode ++ [EVAL lreg (snd lazy)] ++ 
->                     rcode ++ [EVAL rreg (snd lazy), OP reg op lreg rreg]
+>                     rcode ++ [EVAL rreg (snd lazy), OP reg op lreg rreg,
+>                               ADDTMPROOT reg]
 >     ecomp lazy tcall (Let nm ty val scope) reg vs =
 >         do loc <- new_locals 1
 >            reg' <- new_tmp
@@ -220,7 +238,7 @@
 >            let assigncode = case ty of
 >                               TyUnit -> [ASSIGN vs reg']
 >                               _ -> [ASSIGN vs reg']
->            return $ valcode ++ assigncode ++ scopecode
+>            return $ valcode ++ assigncode ++ (ADDVARROOT vs):scopecode
 >     ecomp lazy tcall (Error str) reg vs = return [ERROR str]
 >     ecomp lazy tcall Impossible reg vs = return [ERROR "The impossible happened."]
 >     ecomp lazy tcall (ForeignCall ty fn argtypes) reg vs = do
@@ -229,13 +247,15 @@
 >           (argcode, argregs) <- ecompsEv lazy args vs
 >           -- let evalcode = if (snd lazy) then [] else map (\x -> EVAL x (snd lazy)) argregs
 >           set_tmp savetmp
->           return $ argcode ++ [FOREIGN ty reg fn (zip argregs types)]
+>           return $ argcode ++ [FOREIGN ty reg fn (zip argregs types),
+>                                ADDTMPROOT reg]
 >     ecomp lazy tcall (LazyForeignCall ty fn argtypes) reg vs = do
 >           savetmp <- get_tmp
 >           let (args,types) = unzip argtypes
 >           (argcode, argregs) <- ecomps lazy args vs
 >           set_tmp savetmp
->           return $ argcode ++ [FOREIGN ty reg fn (zip argregs types)]
+>           return $ argcode ++ [FOREIGN ty reg fn (zip argregs types),
+>                                ADDTMPROOT reg]
 
 >     ecomps :: (Bool, Bool) -> [Expr] -> Int -> State CompileState (Bytecode, [TmpVar])
 >     ecomps lazy e vs = ecomps' lazy [] [] e vs
diff --git a/Epic/CodegenC.lhs b/Epic/CodegenC.lhs
--- a/Epic/CodegenC.lhs
+++ b/Epic/CodegenC.lhs
@@ -65,6 +65,7 @@
 >     quickcall fname ++ "(" ++
 >     wrapperArgs (length args) ++ ");\n}\n\n" ++
 >     wrappers xs
+> wrappers (decl@(CType n):xs) = exportC decl
 > wrappers (_:xs) = wrappers xs
 
 > wrapperArgs 0 = ""
@@ -87,7 +88,7 @@
 > thunk fn = "_wrap_" ++ showC fn
 
 > compileBody :: FunCode -> String
-> compileBody (Code args bytecode) = 
+> compileBody (Code numlocs args bytecode) = 
 >     let (code, b) = runState (cgs bytecode) 0 in
 >         if (b>0) then "void** block;\n" ++ code else code --  = EMALLOC("++show b++"*sizeof(void*));\n"++code else code
 >   where
@@ -102,8 +103,9 @@
 
 >    cg (CALL t fn args) = return $ tmp t ++ " = " ++ quickcall fn ++ 
 >                          targs "(" args ++ ");"
->    cg (TAILCALL t fn args) = return $ "return " ++ quickcall fn ++ 
->                          targs "(" args ++ ");"
+>    cg (TAILCALL t fn args) 
+>           = return $ "DROPROOTS; return " ++ 
+>                      quickcall fn ++ targs "(" args ++ ");"
 >    cg (THUNK t ar fn []) = do
 >        return $ tmp t ++ 
 >           " = (void*)CLOSURE(" ++ thunk fn ++ ", " ++ 
@@ -121,6 +123,10 @@
 >                                   (fn ++ "(" ++ foreignArgs args ++ ")")
 >                                   ++ ";"
 >    cg (VAR t l) = return $ tmp t ++ " = " ++ loc l ++ ";"
+>    cg (GROWROOT i) = return $ "GROWROOT;"
+>    cg (ADDVARROOT l) = return $ "ADDROOT(" ++ loc l ++ ");"
+>    cg (ADDTMPROOT l) = return $ "ADDROOT(" ++ tmp l ++ ");"
+>    cg (DROPROOTS i) = return $ "DROPROOTS;"
 >    cg (ASSIGN l t) = return $ loc l ++ " = " ++ tmp t ++ ";"
 >    cg (TMPASSIGN t1 t2) = return $ tmp t1 ++ " = " ++ tmp t2 ++ ";"
 >    cg (NOASSIGN l t) = return $ "// " ++ loc l ++ " = " ++ tmp t ++ ";"
@@ -143,6 +149,13 @@
 >    cg (BREAKFALSE t) 
 >           = return $ -- "assertInt(" ++ tmp t ++ ");\n" ++
 >                      "if (!GETINT(" ++ tmp t ++ ")) break;"
+>    cg (MEMORY alloc r t b) = 
+>              do bcode <- cgs b
+>                 return $ pool alloc ++ "(" ++ tmp t ++ ");\n" ++
+>                          bcode ++
+>                          "CLEARPOOL(" ++ tmp r ++ ");\n"
+>       where pool FixedPool = "NEWFIXEDPOOL"
+>             pool GrowablePool = "NEWGROWABLEPOOL"
 >    cg (WHILE t b) = do tcode <- cgs t
 >                        bcode <- cgs b
 >                        return $ "while (1) { " ++ tcode ++ "\n" ++ bcode ++ "}"
@@ -178,8 +191,8 @@
 >    cg (EVAL v False) = return $ tmp v ++ "=(void*)EVAL_NOUP((VAL)"++tmp v++");"
 >    cg (EVALINT v True) = return $ tmp v ++ "=(void*)EVALINT((VAL)"++tmp v++");"
 >    cg (EVALINT v False) = return $ tmp v ++ "=(void*)EVALINT_NOUP((VAL)"++tmp v++");"
->    cg (RETURN t) = return $ "return "++tmp t++";"
->    cg DRETURN = return $ "return NULL;"
+>    cg (RETURN t) = return $ "DROPROOTS; return "++tmp t++";"
+>    cg DRETURN = return $ "DROPROOTS; return NULL;"
 >    cg (ERROR s) = return $ "ERROR("++show s++");"
 >    cg (COMMENT s) = return $ " // " ++ show s
 >    cg (TRACE s args) = return $ "TRACE {\n\tprintf(\"%s\\n\", " ++ show s ++ ");\n" ++
@@ -258,6 +271,7 @@
 > cToEpic var TyInt = "MKINT(INTTOEINT(" ++ var ++ "))"
 > cToEpic var TyPtr = "MKPTR(" ++ var ++ ")"
 > cToEpic var TyBigInt = "MKBIGINT((mpz_t*)(" ++ var ++ "))"
+> cToEpic var TyFloat = "MKFLOAT(" ++ var ++ ")"
 > cToEpic var TyUnit = "NULL"
 > cToEpic var _ = "(void*)(" ++ var ++")"
 
@@ -275,7 +289,9 @@
 > epicToC t TyInt = "EINTTOINT(GETINT("++ t ++"))"
 > epicToC t TyBigInt = "*(GETBIGINT("++ t ++"))"
 > epicToC t TyString = "GETSTR("++ t ++")"
+> epicToC t TyFloat = "GETFLOAT(" ++ t ++ ")"
 > epicToC t TyPtr = "GETPTR("++ t ++")"
+> epicToC t TyChar = "EINTTOINT(GETINT("++ t ++"))"
 > epicToC t _ = t
 
 > foreignArg (t, ty) = epicToC (tmp t) ty
@@ -290,6 +306,10 @@
 > doOp t Minus l r = tmp t ++ " = INTOP(-,"++tmp l ++ ", "++tmp r++");"
 > doOp t Times l r = tmp t ++ " = MULT("++tmp l ++ ", "++tmp r++");"
 > doOp t Divide l r = tmp t ++ " = INTOP(/,"++tmp l ++ ", "++tmp r++");"
+> doOp t FPlus l r = tmp t ++ " = FLOATOP(+,"++tmp l ++ ", "++tmp r++");"
+> doOp t FMinus l r = tmp t ++ " = FLOATOP(-,"++tmp l ++ ", "++tmp r++");"
+> doOp t FTimes l r = tmp t ++ " = FLOATOP(*,"++tmp l ++ ", "++tmp r++");"
+> doOp t FDivide l r = tmp t ++ " = FLOATOP(/,"++tmp l ++ ", "++tmp r++");"
 > doOp t ShL l r = tmp t ++ " = INTOP(<<,"++tmp l ++ ", "++tmp r++");"
 > doOp t ShR l r = tmp t ++ " = INTOP(>>,"++tmp l ++ ", "++tmp r++");"
 > doOp t OpEQ l r = tmp t ++ " = INTOP(==,"++tmp l ++ ", "++tmp r++");"
@@ -297,6 +317,11 @@
 > doOp t OpLT l r = tmp t ++ " = INTOP(<,"++tmp l ++ ", "++tmp r++");"
 > doOp t OpGE l r = tmp t ++ " = INTOP(>=,"++tmp l ++ ", "++tmp r++");"
 > doOp t OpLE l r = tmp t ++ " = INTOP(<=,"++tmp l ++ ", "++tmp r++");"
+> doOp t OpFEQ l r = tmp t ++ " = FLOATBOP(==,"++tmp l ++ ", "++tmp r++");"
+> doOp t OpFGT l r = tmp t ++ " = FLOATBOP(>,"++tmp l ++ ", "++tmp r++");"
+> doOp t OpFLT l r = tmp t ++ " = FLOATBOP(<,"++tmp l ++ ", "++tmp r++");"
+> doOp t OpFGE l r = tmp t ++ " = FLOATBOP(>=,"++tmp l ++ ", "++tmp r++");"
+> doOp t OpFLE l r = tmp t ++ " = FLOATBOP(<=,"++tmp l ++ ", "++tmp r++");"
 
 Write out code for an export
 
@@ -305,6 +330,7 @@
 > cty TyBool = "int"
 > cty TyString = "char*"
 > cty TyUnit = "void"
+> cty (TyCType n) = n
 > cty _ = "void*"
 
 > ctys [] = ""
@@ -321,6 +347,7 @@
 >         ";\n\n" ++
 >     "}"
 >   where conv (nm, ty) = cToEpic (showuser nm) ty
+> exportC (CType n) = "typedef void* " ++ n ++ ";\n"
 > exportC _ = ""
 
 ... and in the header file
@@ -328,4 +355,6 @@
 > exportH :: Decl -> String
 > exportH (Decl nm rt (Bind args _ _ _) (Just cname) _) =
 >     cty rt ++ " " ++ cname ++ "(" ++ ctys args ++ ");\n"
+> exportH (CType n) = "typedef void* " ++ n ++ ";\n"
 > exportH _ = ""
+
diff --git a/Epic/Compiler.lhs b/Epic/Compiler.lhs
--- a/Epic/Compiler.lhs
+++ b/Epic/Compiler.lhs
@@ -30,16 +30,6 @@
 
 > import Paths_epic
 
-> -- | (Debugging) options to give to compiler
-> data CompileOptions = KeepC -- ^ Keep intermediate C file
->                     | Trace -- ^ Generate trace at run-time (debug)
->                     | ShowBytecode -- ^ Show generated code
->                     | ShowParseTree -- ^ Show parse tree
->                     | MakeHeader FilePath -- ^ Output a .h file too
->                     | GCCOpt String -- ^ Extra GCC option
->                     | Debug -- ^ Generate debug info
->   deriving Eq
-
 > addGCC :: [CompileOptions] -> String
 > addGCC [] = ""
 > addGCC ((GCCOpt s):xs) = s ++ " " ++ addGCC xs
@@ -80,13 +70,13 @@
 >              Success ds -> do
 >                 (tmpn,tmph) <- tempfile
 >                 let hdr = outputHeader opts
->                 scchecked <- checkAll ds
+>                 scchecked <- checkAll opts ds
 >                 let simplified = simplifyAll scchecked
 >                 checked <- compileDecls simplified tmph hdr
 >                 fp <- getDataFileName "evm/closure.h"
 >                 let libdir = trimLast fp
 >                 let dbg = if (elem Debug opts) then "-g" else "-O3"
->                 let cmd = "gcc -c " ++ dbg ++ " -foptimize-sibling-calls -x c " ++ tmpn ++ " -I" ++ libdir ++ " -o " ++ outf ++ " " ++ addGCC opts ++ doTrace opts
+>                 let cmd = "gcc -DUSE_BOEHM -c " ++ dbg ++ " -foptimize-sibling-calls -x c " ++ tmpn ++ " -I" ++ libdir ++ " -o " ++ outf ++ " " ++ addGCC opts ++ doTrace opts
 >                 -- putStrLn $ cmd
 >                 -- putStrLn $ fp
 >                 exit <- system cmd
@@ -130,7 +120,7 @@
 >     fp <- getDataFileName "evm/closure.h"
 >     let libdir = trimLast fp
 >     let dbg = if (elem Debug opts) then "-g" else "-O3"
->     let cmd = "gcc -x c " ++ dbg ++ " -foptimize-sibling-calls " ++ mainprog ++ " -x none -L" ++
+>     let cmd = "gcc -DUSE_BOEHM -x c " ++ dbg ++ " -foptimize-sibling-calls " ++ mainprog ++ " -x none -L" ++
 >               libdir++" -I"++libdir ++ " " ++
 >               (concat (map (++" ") infs)) ++ 
 >               " -levm -lgc -lpthread -lgmp -o "++outf
diff --git a/Epic/Language.lhs b/Epic/Language.lhs
--- a/Epic/Language.lhs
+++ b/Epic/Language.lhs
@@ -2,6 +2,17 @@
 
 > import Control.Monad
 
+> -- | (Debugging) options to give to compiler
+> data CompileOptions = KeepC -- ^ Keep intermediate C file
+>                     | Trace -- ^ Generate trace at run-time (debug)
+>                     | ShowBytecode -- ^ Show generated code
+>                     | ShowParseTree -- ^ Show parse tree
+>                     | MakeHeader FilePath -- ^ Output a .h file too
+>                     | GCCOpt String -- ^ Extra GCC option
+>                     | Debug -- ^ Generate debug info
+>                     | Checking Int -- ^ Checking level (0 none)
+>   deriving Eq
+
 Raw data types. Int, Char, Bool are unboxed.
 
 > data Type = TyInt
@@ -15,6 +26,7 @@
 >           | TyUnit
 >           | TyAny -- unchecked, polymorphic
 >           | TyData -- generic data type
+>           | TyCType String -- Exported, C typedef
 >           | TyFun -- any function
 >   deriving Eq
 
@@ -30,6 +42,7 @@
 >     show TyUnit = "Unit"
 >     show TyAny = "Any"
 >     show TyData = "Data"
+>     show (TyCType s) = "CType " ++ s
 >     show TyFun = "Fun"
 
 > data Const = MkInt Int
@@ -91,6 +104,7 @@
 >           | Let Name Type Expr Expr -- Let binding
 >           | Error String -- Exit with error message
 >           | Impossible -- Claimed impossible to reach code
+>           | WithMem Allocator Expr Expr -- evaluate with manual allocation
 >           | ForeignCall Type String [(Expr, Type)] -- Foreign function call
 >           | LazyForeignCall Type String [(Expr, Type)] -- Foreign function call
 >   deriving Eq
@@ -110,7 +124,12 @@
 >    compare (DefaultCase _) (Alt _ _ _) = GT
 >    compare _ _ = EQ
 
+> data Allocator = FixedPool | GrowablePool
+>   deriving Eq
+
 > data Op = Plus | Minus | Times | Divide | OpEQ | OpLT | OpLE | OpGT | OpGE
+>         | FPlus | FMinus | FTimes | FDivide
+>         | OpFEQ | OpFLT | OpFLE | OpFGT | OpFGE
 >         | ShL  | ShR
 >   deriving (Show, Eq)
 
@@ -138,10 +157,15 @@
 >                          show v ++ " in " ++ show e
 >     show (Error e) = "error(" ++ show e ++ ")"
 >     show Impossible = "Impossible"
+>     show (WithMem a m e) = "%memory(" ++ show a ++ "," ++ show m ++ ", " ++ show e ++ ")"
 >     show (ForeignCall t s as) = "foreign " ++ show t ++ " " ++
 >                                 show s ++ show as
 >     show (LazyForeignCall t s as) = "lazy foreign " ++ show t ++ " " ++
 >                                     show s ++ show as
+
+> instance Show Allocator where
+>     show FixedPool = "%fixed"
+>     show GrowablePool = "%growable"
                              
 Supercombinator definitions
 
@@ -164,7 +188,7 @@
 >                      fargs :: [Type] }
 >           | Include String
 >           | Link String
->           | CType Name
+>           | CType String
 >   deriving Show
 
 > data CGFlag = Inline | Strict
@@ -199,6 +223,10 @@
 
 > appForm _ = False
 
+> checkLevel :: [CompileOptions] -> Int
+> checkLevel [] = 0
+> checkLevel (Checking i:_) = i
+> checkLevel (_:xs) = checkLevel xs
 
 
 Some tests
diff --git a/Epic/Lexer.lhs b/Epic/Lexer.lhs
--- a/Epic/Lexer.lhs
+++ b/Epic/Lexer.lhs
@@ -63,6 +63,7 @@
 >       | TokenUnitType
 >       | TokenAnyType
 >       | TokenDataType
+>       | TokenTyCType
 >       | TokenFunType
 >       | TokenForeign
 >       | TokenCInclude
@@ -78,12 +79,21 @@
 >       | TokenMinus
 >       | TokenTimes
 >       | TokenDivide
+>       | TokenFPlus
+>       | TokenFMinus
+>       | TokenFTimes
+>       | TokenFDivide
 >       | TokenEquals
 >       | TokenEQ
 >       | TokenGE
 >       | TokenLE
 >       | TokenGT
 >       | TokenLT
+>       | TokenFEQ
+>       | TokenFGE
+>       | TokenFLE
+>       | TokenFGT
+>       | TokenFLT
 >       | TokenShL
 >       | TokenShR
 >       | TokenArrow
@@ -112,6 +122,9 @@
 >       | TokenComma
 >       | TokenBar
 >       | TokenExtern
+>       | TokenMemory
+>       | TokenFixed
+>       | TokenGrowable
 >       | TokenInclude
 >       | TokenEOF
 >  deriving (Show, Eq)
@@ -136,10 +149,19 @@
 > lexer cont ('}':cs) = cont TokenCCB cs
 > lexer cont ('[':cs) = cont TokenOSB cs
 > lexer cont (']':cs) = cont TokenCSB cs
+> lexer cont ('+':'.':cs) = cont TokenFPlus cs
+> lexer cont ('-':'.':cs) = cont TokenFMinus cs
+> lexer cont ('*':'.':cs) = cont TokenFTimes cs
+> lexer cont ('/':'.':cs) = cont TokenFDivide cs
 > lexer cont ('+':cs) = cont TokenPlus cs
 > lexer cont ('-':cs) = cont TokenMinus cs
 > lexer cont ('*':cs) = cont TokenTimes cs
 > lexer cont ('/':cs) = cont TokenDivide cs
+> lexer cont ('=':'=':'.':cs) = cont TokenFEQ cs
+> lexer cont ('>':'=':'.':cs) = cont TokenFGE cs
+> lexer cont ('<':'=':'.':cs) = cont TokenFLE cs
+> lexer cont ('>':'.':cs) = cont TokenFGT cs
+> lexer cont ('<':'.':cs) = cont TokenFLT cs
 > lexer cont ('=':'=':cs) = cont TokenEQ cs
 > lexer cont ('>':'=':cs) = cont TokenGE cs
 > lexer cont ('<':'=':cs) = cont TokenLE cs
@@ -156,7 +178,7 @@
 > lexer cont ('%':cs) = lexSpecial cont cs
 > lexer cont (c:cs) = lexError c cs
  
-> lexError c s l = failP (show l ++ ": Unrecognised token '" ++ [c] ++ "'\n") s l
+> lexError c s f l = failP (show l ++ ": Unrecognised token '" ++ [c] ++ "'\n") s f l
 
 > lexerEatComment nls cont ('-':'}':cs)
 >     = \fn line -> lexer cont cs fn (line+nls)
@@ -219,6 +241,7 @@
 >       ("Ptr",rest) -> cont TokenPtrType rest
 >       ("Unit",rest) -> cont TokenUnitType rest
 >       ("Data",rest) -> cont TokenDataType rest
+>       ("CType",rest) -> cont TokenTyCType rest
 >       ("Fun",rest) -> cont TokenFunType rest
 >       ("Any",rest) -> cont TokenAnyType rest
 > -- values
@@ -253,6 +276,9 @@
 >       ("effect",rest) -> cont TokenEffect rest
 >       ("strict",rest) -> cont TokenStrict rest
 >       ("while",rest) -> cont TokenWhile rest
+>       ("memory",rest) -> cont TokenMemory rest
+>       ("fixed",rest) -> cont TokenFixed rest
+>       ("growable",rest) -> cont TokenGrowable rest
 >       ("unused", rest) -> cont TokenUnused rest
 >       (thing,rest) -> lexError '%' rest
  
diff --git a/Epic/Parser.y b/Epic/Parser.y
--- a/Epic/Parser.y
+++ b/Epic/Parser.y
@@ -38,6 +38,7 @@
       unittype        { TokenUnitType }
       funtype         { TokenFunType }
       datatype        { TokenDataType }
+      tyctype         { TokenTyCType }
       anytype         { TokenAnyType }
       unit            { TokenUnit }
       con             { TokenCon }
@@ -49,6 +50,9 @@
       then            { TokenThen }
       else            { TokenElse }
       while           { TokenWhile }
+      memory          { TokenMemory }
+      fixed           { TokenFixed }
+      growable        { TokenGrowable }
       unused          { TokenUnused }
       in              { TokenIn }
       lazy            { TokenLazy }
@@ -67,14 +71,23 @@
       '-'             { TokenMinus }
       '*'             { TokenTimes }
       '/'             { TokenDivide }
+      fplus           { TokenFPlus }
+      fminus          { TokenFMinus }
+      ftimes          { TokenFTimes }
+      fdiv            { TokenFDivide }
       '='             { TokenEquals }
       eq              { TokenEQ }
       le              { TokenLE }
       ge              { TokenGE }
+      feq             { TokenFEQ }
+      fle             { TokenFLE }
+      fge             { TokenFGE }
       shl             { TokenShL }
       shr             { TokenShR }
       '<'             { TokenLT }
       '>'             { TokenGT }
+      flt             { TokenFLT }
+      fgt             { TokenFGT }
       ':'             { TokenColon }
       '!'             { TokenProj }
       ';'             { TokenSemi }
@@ -92,12 +105,12 @@
 %nonassoc lazy
 %left LET
 %left IF
-%left eq
+%left eq feq
 %left ';'
-%left '<' '>' le ge
+%left '<' '>' le ge flt fgt fle fge
 %left shl shr
-%left '+' '-'
-%left '*' '/'
+%left '+' '-' fplus fminus
+%left '*' '/' ftimes fdiv
 %left NEG
 %left '!'
 %nonassoc '('
@@ -128,6 +141,7 @@
      | unittype { TyUnit }
      | anytype { TyAny }
      | datatype { TyData }
+     | tyctype string { TyCType $2 }
      | funtype { TyFun }
 
 Declaration :: { Decl }
@@ -136,6 +150,7 @@
            | extern name '(' TypeList ')' arrow Type
                { mkExtern $2 (map snd $4) $7 (map fst $4) }
            | cinclude string { Include $2 }
+           | ctype string { CType $2 }
 
 Flags :: { [CGFlag] }
 Flags : { [] }
@@ -169,6 +184,7 @@
      | if Expr then Expr else Expr %prec IF { If $2 $4 $6 }
      | while '(' Expr ',' Expr ')' { While $3 $5 }
      | while '(' Expr ',' Expr ',' Expr ')' { WhileAcc $3 $5 $7 }
+     | memory '(' Allocator ',' Expr ',' Expr ')' { WithMem $3 $5 $7 }
      | CaseExpr { $1 }
      | MathExpr { $1 }
      | errorcode string { Error $2 }
@@ -178,6 +194,10 @@
      | lazy foreign Type string '(' ExprTypeList ')' 
           { LazyForeignCall $3 $4 $6 }
 
+Allocator :: { Allocator }
+Allocator : fixed { FixedPool }
+          | growable { GrowablePool }
+
 CaseExpr :: { Expr }
 CaseExpr : case Expr of '{' Alts '}' { Case $2 $5 }
 
@@ -199,6 +219,13 @@
          | '-' Expr %prec NEG { Op Minus (Const (MkInt 0)) $2 }
          | Expr '*' Expr { Op Times $1 $3 }
          | Expr '/' Expr { Op Divide $1 $3 }
+
+         | Expr fplus Expr { Op FPlus $1 $3 }
+         | Expr fminus Expr { Op FMinus $1 $3 }
+         | fminus Expr %prec NEG { Op FMinus (Const (MkInt 0)) $2 }
+         | Expr ftimes Expr { Op FTimes $1 $3 }
+         | Expr fdiv Expr { Op FDivide $1 $3 }
+
          | Expr shl Expr { Op ShL $1 $3 }
          | Expr shr Expr { Op ShR $1 $3 }
          | Expr '<' Expr { Op OpLT $1 $3 }
@@ -206,6 +233,12 @@
          | Expr le Expr { Op OpLE $1 $3 }
          | Expr ge Expr { Op OpGE $1 $3 }
          | Expr eq Expr { Op OpEQ $1 $3 }
+
+         | Expr flt Expr { Op OpFLT $1 $3 }
+         | Expr fgt Expr { Op OpFGT $1 $3 }
+         | Expr fle Expr { Op OpFLE $1 $3 }
+         | Expr fge Expr { Op OpFGE $1 $3 }
+         | Expr feq Expr { Op OpFEQ $1 $3 }
 
 ExprList :: { [Expr] }
 ExprList : { [] }
diff --git a/Epic/Scopecheck.lhs b/Epic/Scopecheck.lhs
--- a/Epic/Scopecheck.lhs
+++ b/Epic/Scopecheck.lhs
@@ -10,13 +10,13 @@
 
 > import Debug.Trace
 
-> checkAll :: Monad m => [Decl] -> m (Context, [Decl])
-> checkAll xs = do let ctxt = mkContext xs
->                  ds <- ca (mkContext xs) xs
->                  return (mkContext ds,ds)
+> checkAll :: Monad m => [CompileOptions] -> [Decl] -> m (Context, [Decl])
+> checkAll opts xs = do let ctxt = mkContext xs
+>                       ds <- ca (mkContext xs) xs
+>                       return (mkContext ds,ds)
 >    where ca ctxt [] = return []
 >          ca ctxt ((Decl nm rt fn exp fl):xs) = 
->              do (fn', newds) <- scopecheck ctxt nm fn
+>              do (fn', newds) <- scopecheck (checkLevel opts) ctxt nm fn
 >                 xs' <- ca ctxt (newds ++ xs)
 >                 return $ (Decl nm rt fn' exp fl):xs'
 >          ca ctxt (x:xs) =
@@ -35,8 +35,8 @@
 a new function. Returns the modified function, and a list of new declarations. The new 
 declarations will *not* have been scopechecked.
 
-> scopecheck :: Monad m => Context -> Name -> Func -> m (Func, [Decl])
-> scopecheck ctxt nm (Bind args locs exp fl) = do
+> scopecheck :: Monad m => Int -> Context -> Name -> Func -> m (Func, [Decl])
+> scopecheck checking ctxt nm (Bind args locs exp fl) = do
 >        (exp', (locs', _, ds)) <- runStateT (tc (v_ise args 0) exp) (length args, 0, [])
 >        return $ (Bind args locs' exp' fl, ds)
 >  where
@@ -44,8 +44,8 @@
 >    getRoot (MN nm i) = "_" ++ nm ++ "_" ++ show i
 >    tc env (R n) = case lookup n env of
 >                      Nothing -> case lookup n ctxt of
->                         Nothing -> return $ Const (MkInt 1234567890)
->                                    -- lift $ fail $ "Unknown name " ++ showuser n
+>                         Nothing -> if (checking > 0) then lift $ fail $ "Unknown name " ++ showuser n
+>                                    else return $ Const (MkInt 1234567890)
 >                         (Just _) -> return $ R n
 >                      (Just i) -> return $ V i
 >    tc env (Let n ty v sc) = do
diff --git a/Main.lhs b/Main.lhs
deleted file mode 100644
--- a/Main.lhs
+++ /dev/null
@@ -1,144 +0,0 @@
-> module Main where
-
-> import System
-> import System.Directory
-> import System.Environment
-> import System.IO
-> import Distribution.Version
-> import Monad
-
-> import Epic.Compiler
-> import Paths_epic
-
-> versionString = showV (versionBranch version)
->   where
->     showV [] = ""
->     showV [a] = show a
->     showV (x:xs) = show x ++ "." ++ showV xs
-
-> main = do args <- getArgs
->           (fns, opts) <- getInput args
->           outfile <- getOutput opts
->           ofiles <- compileFiles fns (mkOpts opts)
->           copts <- getCOpts opts
->           extras <- getExtra opts
->           if ((length ofiles) > 0 && (not (elem Obj opts)))
->              then link (ofiles ++ copts) extras outfile (not (elem ExtMain opts)) (mkOpts opts)
->              else return ()
->   where mkOpts (KeepInt:xs) = KeepC:(mkOpts xs)
->         mkOpts (TraceOn:xs) = Trace:(mkOpts xs)
->         mkOpts (Header f:xs) = MakeHeader f:(mkOpts xs)
->         mkOpts (_:xs) = mkOpts xs
->         mkOpts [] = []
-
-> compileFiles [] _ = return []
-> compileFiles (fn:xs) opts
->     | isDotE fn = do
->        let ofile = getRoot fn ++ ".o"
->        compileOpts fn ofile (Just (getRoot fn ++ ".ei")) opts
->        rest <- compileFiles xs opts
->        return (ofile:rest)
->     | isDotO fn = do
->        rest <- compileFiles xs opts
->        return (fn:rest)
->     | otherwise = do -- probably autogenerated, just build it.
->        let ofile = fn ++ ".o"
->        compileOpts fn ofile Nothing opts
->        rest <- compileFiles xs opts
->        return (ofile:rest)
-
-> isDotE ('.':'e':[]) = True
-> isDotE (_:xs) = isDotE xs
-> isDotE [] = False
-
-> isDotC ('.':'c':[]) = True
-> isDotC (_:xs) = isDotC xs
-> isDotC [] = False
-
-> isDotO ('.':'o':[]) = True
-> isDotO (_:xs) = isDotO xs
-> isDotO [] = False
-
-> mkExecname fn = case span (/='.') fn of
->     (stem,".e") -> stem
->     (stem,_) -> fn ++ ".exe"
-
-> getRoot fn = case span (/='.') fn of
->     (stem,_) -> stem
-
-> getInput :: [String] -> IO ([FilePath],[Option])
-> getInput args = do let opts = parseArgs args
->                    processFlags opts False
->                    fns <- getFile opts
->                    if (length fns == 0) 
->                       then do showUsage
->                               return (fns,opts)
->                       else return (fns,opts)
-
-> showUsage = do putStrLn $ "Epigram Supercombinator Compiler version " ++ versionString
->                putStrLn "Usage:\n\tepic <input file> [options]"
->                exitWith (ExitFailure 1)
-
-> data Option = KeepInt -- Don't delete intermediate file
->             | TraceOn -- Trace while running (debug option)
->             | Obj -- Just make the .o, don't link
->             | File String -- File to send the compiler
->             | Output String -- Output filename
->             | Header String -- Header output filename
->             | ExtraInc String -- extra files to inlude
->             | COpt String -- option to send straight to gcc
->             | ExtMain -- external main (i.e. in a .o)
->             | CFlags -- output include flags
->             | LibFlags -- output linker flags
->             | DbgInfo -- generate debug info
->   deriving Eq
-
-> parseArgs :: [String] -> [Option]
-> parseArgs [] = []
-> parseArgs ("-keepc":args) = KeepInt:(parseArgs args)
-> parseArgs ("-trace":args) = TraceOn:(parseArgs args)
-> parseArgs ("-c":args) = Obj:(parseArgs args)
-> parseArgs ("-extmain":args) = ExtMain:(parseArgs args)
-> parseArgs ("-o":name:args) = (Output name):(parseArgs args)
-> parseArgs ("-h":name:args) = (Header name):(parseArgs args)
-> parseArgs ("-i":inc:args) = (ExtraInc inc):(parseArgs args)
-> parseArgs ("-includedirs":args) = CFlags:(parseArgs args)
-> parseArgs ("-libdirs":args) = LibFlags:(parseArgs args)
-> parseArgs ("-g":args) = DbgInfo:(parseArgs args)
-> parseArgs (('$':x):args) = (COpt (x ++ concat (map (" "++) args))):[]
-> parseArgs (('-':x):args) = (COpt x):(parseArgs args)
-> parseArgs (x:args) = (File x):(parseArgs args)
-
-> getFile :: [Option] -> IO [FilePath]
-> getFile ((File x):xs) = do fns <- getFile xs
->                            return (x:fns)
-> getFile (_:xs) = getFile xs
-> getFile [] = return []
-
-> getOutput :: [Option] -> IO FilePath
-> getOutput ((Output fn):xs) = return fn
-> getOutput (_:xs) = getOutput xs
-> getOutput [] = return "a.out"
-
-> getCOpts :: [Option] -> IO [String]
-> getCOpts ((COpt x):xs) = do fns <- getCOpts xs
->                             return (x:fns)
-> getCOpts (_:xs) = getCOpts xs
-> getCOpts [] = return []
-
-> getExtra :: [Option] -> IO [String]
-> getExtra ((ExtraInc x):xs) = do fns <- getExtra xs
->                                 return (x:fns)
-> getExtra (_:xs) = getExtra xs
-> getExtra [] = return []
-
-> processFlags :: [Option] -> Bool -> IO ()
-> processFlags [] True = do putStrLn ""; exitWith ExitSuccess
-> processFlags [] False = return ()
-> processFlags (LibFlags:xs) _ = do datadir <- getDataDir
->                                   putStr $ "-L"++datadir++"/evm "
->                                   processFlags xs True
-> processFlags (CFlags:xs) _ = do datadir <- getDataDir
->                                 putStr $ "-I"++datadir++"/evm "
->                                 processFlags xs True
-> processFlags (_:xs) quit = processFlags xs quit
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -7,12 +7,16 @@
 
 -- After Epic is built, we need a run time system.
 
+system' cmd = do 
+    exit <- system cmd
+    case exit of
+      ExitSuccess -> return ()
+      ExitFailure _ -> exitWith exit
 -- FIXME: This is probably all done the wrong way, I don't really understand
 -- Cabal properly...
 
 buildLib args flags desc local 
-    = do exit <- system "make -C evm"
-         return ()
+    = system' "make -C evm"
 
 -- This is a hack. I don't know how to tell cabal that a data file needs
 -- installing but shouldn't be in the distribution. And it won't make the
@@ -20,15 +24,13 @@
 -- the file after configure.
 
 postConfLib args flags desc local
-    = do exit <- system "make -C evm clean"
-         return ()
+    = system' "make -C evm clean"
 
 addPrefix pfx var c = "export " ++ var ++ "=" ++ show pfx ++ "/" ++ c ++ ":$" ++ var
 
 postInstLib args flags desc local
     = do let pfx = prefix (installDirTemplates local)
-         exit <- system $ "make -C evm install PREFIX=" ++ show pfx
-         return ()
+         system' $ "make -C evm install PREFIX=" ++ show pfx
 
 main = defaultMainWithHooks (simpleUserHooks { postBuild = buildLib,
                                                postConf = postConfLib,
diff --git a/dist/build/Epic/Parser.hs b/dist/build/Epic/Parser.hs
deleted file mode 100644
--- a/dist/build/Epic/Parser.hs
+++ /dev/null
@@ -1,1368 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
-{-# OPTIONS -fglasgow-exts -cpp #-}
--- -*-Haskell-*-
-{-# OPTIONS_GHC -fglasgow-exts #-}
-
-module Epic.Parser where
-
-import Char
-import System.IO.Unsafe
-
-import Epic.Language
-import Epic.Lexer
-#if __GLASGOW_HASKELL__ >= 503
-import qualified Data.Array as Happy_Data_Array
-#else
-import qualified Array as Happy_Data_Array
-#endif
-#if __GLASGOW_HASKELL__ >= 503
-import qualified GHC.Exts as Happy_GHC_Exts
-#else
-import qualified GlaExts as Happy_GHC_Exts
-#endif
-
--- parser produced by Happy Version 1.18.4
-
-newtype HappyAbsSyn  = HappyAbsSyn HappyAny
-#if __GLASGOW_HASKELL__ >= 607
-type HappyAny = Happy_GHC_Exts.Any
-#else
-type HappyAny = forall a . a
-#endif
-happyIn4 :: ([Decl]) -> (HappyAbsSyn )
-happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn4 #-}
-happyOut4 :: (HappyAbsSyn ) -> ([Decl])
-happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut4 #-}
-happyIn5 :: (Type) -> (HappyAbsSyn )
-happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn5 #-}
-happyOut5 :: (HappyAbsSyn ) -> (Type)
-happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut5 #-}
-happyIn6 :: (Decl) -> (HappyAbsSyn )
-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn6 #-}
-happyOut6 :: (HappyAbsSyn ) -> (Decl)
-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut6 #-}
-happyIn7 :: ([CGFlag]) -> (HappyAbsSyn )
-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn7 #-}
-happyOut7 :: (HappyAbsSyn ) -> ([CGFlag])
-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut7 #-}
-happyIn8 :: (CGFlag) -> (HappyAbsSyn )
-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn8 #-}
-happyOut8 :: (HappyAbsSyn ) -> (CGFlag)
-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut8 #-}
-happyIn9 :: (Maybe String) -> (HappyAbsSyn )
-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn9 #-}
-happyOut9 :: (HappyAbsSyn ) -> (Maybe String)
-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut9 #-}
-happyIn10 :: ([(Name,Type)]) -> (HappyAbsSyn )
-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn10 #-}
-happyOut10 :: (HappyAbsSyn ) -> ([(Name,Type)])
-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut10 #-}
-happyIn11 :: (Expr) -> (HappyAbsSyn )
-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn11 #-}
-happyOut11 :: (HappyAbsSyn ) -> (Expr)
-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut11 #-}
-happyIn12 :: (Expr) -> (HappyAbsSyn )
-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn12 #-}
-happyOut12 :: (HappyAbsSyn ) -> (Expr)
-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut12 #-}
-happyIn13 :: ([CaseAlt]) -> (HappyAbsSyn )
-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn13 #-}
-happyOut13 :: (HappyAbsSyn ) -> ([CaseAlt])
-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut13 #-}
-happyIn14 :: (CaseAlt) -> (HappyAbsSyn )
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn ) -> (CaseAlt)
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (Expr) -> (HappyAbsSyn )
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn ) -> (Expr)
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: ([Expr]) -> (HappyAbsSyn )
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn ) -> ([Expr])
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: ([(Expr,Type)]) -> (HappyAbsSyn )
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn ) -> ([(Expr,Type)])
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (Const) -> (HappyAbsSyn )
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn ) -> (Const)
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: (LineNumber) -> (HappyAbsSyn )
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn ) -> (LineNumber)
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: (String) -> (HappyAbsSyn )
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn ) -> (String)
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyInTok :: (Token) -> (HappyAbsSyn )
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn ) -> (Token)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\x2d\x01\x1f\x00\x00\x00\xdf\xff\x52\x01\x4d\x01\x4b\x01\xfe\x00\xf5\x01\x40\x01\x2d\x01\x00\x00\x00\x00\x16\x01\x00\x00\x3b\x01\xdf\xff\x00\x00\x00\x00\x00\x00\x14\x01\x2a\x01\x00\x00\x00\x00\x08\x01\xf1\x00\x28\x01\xf0\x00\x69\x01\xdb\x00\x69\x01\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x69\x01\x15\x01\x00\x00\x00\x00\xe0\x00\x01\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x03\x01\x01\x00\x01\x00\xdc\x00\x00\x00\xf1\xff\xda\x00\x69\x01\x00\x01\x00\x00\x01\x00\x01\x00\x01\x00\xe7\xff\x86\x00\xd0\x00\xed\x00\x00\x00\xf2\x00\x01\x00\x69\x01\x01\x00\x01\x00\x18\x00\x03\x00\xb6\x00\xc5\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\xd7\x00\x01\x00\x23\x01\x00\x00\x35\x01\x35\x01\xe4\xff\xe4\xff\x35\x01\x35\x01\x11\x01\xe7\xff\xe7\xff\x37\x01\x37\x01\xc6\x00\x01\x00\x69\x01\xc4\x00\x01\x00\x74\x00\xd8\x00\xdd\x00\xc3\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\xb1\x00\x00\x00\x01\x00\x34\x00\x2a\x00\x96\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x9b\x00\x8b\x00\x8f\x00\xbc\x00\x79\x00\x01\x00\x62\x00\x01\x00\xae\x00\x8a\x00\x00\x00\x69\x01\x89\x00\x00\x00\x01\x00\xff\x00\x01\x00\x7e\x00\x01\x00\x2a\x00\x00\x00\x4d\x00\x01\x00\x00\x00\xff\x00\x9f\x00\xff\x00\x9c\x00\x00\x00\x63\x00\x01\x00\x00\x00\x6b\x00\xff\x00\x50\x00\x00\x00\x01\x00\xff\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\x37\x02\x0b\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x78\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x25\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x02\x1b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x19\x02\x97\x01\x11\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x02\x48\x00\x07\x02\x05\x02\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x01\xfd\x01\xfb\x01\xf3\x01\xf1\x01\xe9\x01\xe7\x01\xdf\x01\xdd\x01\xd5\x01\xd3\x01\xcb\x01\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x01\x43\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x77\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x00\x00\x00\x00\xad\x01\x00\x00\xab\x01\x00\x00\xa3\x01\x39\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\xe8\xff\x00\x00\x00\x00\xec\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe8\xff\x00\x00\xe8\xff\xfd\xff\xe7\xff\x00\x00\xed\xff\x00\x00\xec\xff\xe9\xff\xea\xff\xeb\xff\x00\x00\xe6\xff\xac\xff\xfc\xff\x00\x00\x00\x00\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xfb\xff\xfa\xff\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf0\xff\xf1\xff\xf2\xff\x00\x00\x00\x00\xe6\xff\xee\xff\xe4\xff\x00\x00\x00\x00\xef\xff\xd5\xff\xd4\xff\xdc\xff\xe3\xff\xb0\xff\xb6\xff\xb5\xff\xb3\xff\xb2\xff\xb1\xff\xb4\xff\xaf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\x00\x00\xbc\xff\x00\x00\xc6\xff\xbb\xff\x00\x00\x00\x00\xd3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\xdb\xff\xc0\xff\xc1\xff\xc2\xff\xc3\xff\xbe\xff\xbf\xff\xbd\xff\xc4\xff\xc5\xff\xc7\xff\xc8\xff\x00\x00\xbc\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\xe0\xff\xbc\xff\xba\xff\xb9\xff\xde\xff\x00\x00\xdf\xff\x00\x00\x00\x00\xce\xff\x00\x00\x00\x00\xe1\xff\xdd\xff\x00\x00\x00\x00\xcd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xff\x00\x00\x00\x00\xd1\xff\x00\x00\x00\x00\xd7\xff\x00\x00\xd8\xff\x00\x00\x00\x00\x00\x00\xce\xff\xcf\xff\x00\x00\x00\x00\xcc\xff\xca\xff\xe6\xff\xc9\xff\x00\x00\xd0\xff\xb8\xff\xb9\xff\xd6\xff\x00\x00\xda\xff\x00\x00\xb7\xff\x00\x00\xcb\xff"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x22\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x00\x00\x27\x00\x02\x00\x02\x00\x27\x00\x05\x00\x05\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x24\x00\x15\x00\x16\x00\x27\x00\x18\x00\x19\x00\x06\x00\x1b\x00\x1a\x00\x3a\x00\x1e\x00\x1f\x00\x3a\x00\x21\x00\x44\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x27\x00\x02\x00\x2b\x00\x03\x00\x05\x00\x2e\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x01\x00\x3a\x00\x3b\x00\x27\x00\x16\x00\x17\x00\x09\x00\x0a\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x01\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1d\x00\x3a\x00\x3b\x00\x09\x00\x0a\x00\x07\x00\x08\x00\x03\x00\x04\x00\x0b\x00\x27\x00\x0d\x00\x0e\x00\x3f\x00\x40\x00\x41\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x01\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x20\x00\x3a\x00\x3b\x00\x01\x00\x07\x00\x08\x00\x06\x00\x27\x00\x0b\x00\x01\x00\x0d\x00\x0e\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x10\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x06\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x03\x00\x04\x00\x06\x00\x3e\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x28\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x3c\x00\x3c\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x27\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x3c\x00\x28\x00\x28\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x03\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x28\x00\x2a\x00\x28\x00\x31\x00\x3d\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x27\x00\x27\x00\x03\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x27\x00\x29\x00\x28\x00\x39\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2c\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x27\x00\x02\x00\x27\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x03\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x31\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x01\x00\x3e\x00\x28\x00\x3e\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x01\x00\x39\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x28\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x27\x00\x01\x00\x27\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\x45\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x02\x00\x01\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\xff\xff\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x27\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x35\x00\x36\x00\x3f\x00\x40\x00\x41\x00\x3a\x00\x43\x00\x3a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\xff\xff\x0d\x00\x0e\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\x0c\x00\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x3f\x00\x40\x00\x41\x00\x00\x00\x43\x00\x02\x00\x45\x00\xff\xff\x05\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
-
-happyTable :: HappyAddr
-happyTable = HappyA# "\x00\x00\x12\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x16\x00\x5d\x00\x08\x00\x02\x00\x5d\x00\x03\x00\x03\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x56\x00\x40\x00\x41\x00\x57\x00\x42\x00\x43\x00\xb1\x00\x44\x00\x7b\x00\x69\x00\x45\x00\x46\x00\x69\x00\x47\x00\x13\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x0b\x00\x5d\x00\x08\x00\x4d\x00\x94\x00\x03\x00\x4e\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x7c\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xae\x00\x69\x00\x6a\x00\x5d\x00\x95\x00\x96\x00\xa8\x00\x92\x00\x8c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x7e\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x97\x00\x69\x00\x6a\x00\x91\x00\x92\x00\x99\x00\x34\x00\x13\x00\x10\x00\x35\x00\x5d\x00\xb4\x00\x36\x00\x05\x00\x06\x00\x07\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x53\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xa8\x00\x69\x00\x6a\x00\x31\x00\x99\x00\x34\x00\x30\x00\x5d\x00\x35\x00\x2f\x00\x9d\x00\x36\x00\x1f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x17\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x1b\x00\x69\x00\x6a\x00\x5d\x00\x9f\x00\x0f\x00\x10\x00\x18\x00\xb6\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xb4\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\xa0\x00\xb0\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xab\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x8a\x00\xae\x00\x9c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xa2\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xa3\x00\x69\x00\x6a\x00\x84\x00\x5d\x00\xb1\x00\xa6\x00\x90\x00\x91\x00\xa5\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xa4\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x99\x00\x86\x00\x6c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x88\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x9d\x00\x69\x00\x6a\x00\x5d\x00\x87\x00\x79\x00\x8c\x00\x8f\x00\x7a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x81\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x83\x00\x69\x00\x6a\x00\x5d\x00\x89\x00\x55\x00\x53\x00\x58\x00\x5b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x5c\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x33\x00\x69\x00\x6a\x00\x5d\x00\x82\x00\x1a\x00\x2e\x00\x2d\x00\x1f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x2f\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x1a\x00\x1d\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1e\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x1b\x00\x15\x00\x16\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x0b\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x0d\x00\x0e\x00\x00\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x0f\x00\x00\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x60\x00\x61\x00\x00\x00\x00\x00\x65\x00\x66\x00\x05\x00\x06\x00\x07\x00\x69\x00\x0a\x00\x69\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x99\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x9a\x00\x36\x00\x4f\x00\x34\x00\x00\x00\x00\x00\x35\x00\x84\x00\x00\x00\x36\x00\x4f\x00\x34\x00\x00\x00\x00\x00\x35\x00\x8d\x00\x00\x00\x36\x00\x4f\x00\x34\x00\x00\x00\x00\x00\x35\x00\x77\x00\x00\x00\x36\x00\x4f\x00\x34\x00\xb6\x00\x34\x00\x35\x00\x50\x00\x35\x00\x36\x00\x00\x00\x36\x00\xb2\x00\x34\x00\xa9\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\xab\x00\x34\x00\xac\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\xa0\x00\x34\x00\xa6\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x97\x00\x34\x00\x8a\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x6a\x00\x34\x00\x6c\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x6d\x00\x34\x00\x6e\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x6f\x00\x34\x00\x70\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x71\x00\x34\x00\x72\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x73\x00\x34\x00\x74\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x75\x00\x34\x00\x76\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x7c\x00\x34\x00\x7d\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x7f\x00\x34\x00\x4e\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x51\x00\x34\x00\x58\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x59\x00\x34\x00\x33\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x05\x00\x06\x00\x07\x00\x07\x00\x0a\x00\x08\x00\xfe\xff\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyReduceArr = Happy_Data_Array.array (1, 83) [
-	(1 , happyReduce_1),
-	(2 , happyReduce_2),
-	(3 , happyReduce_3),
-	(4 , happyReduce_4),
-	(5 , happyReduce_5),
-	(6 , happyReduce_6),
-	(7 , happyReduce_7),
-	(8 , happyReduce_8),
-	(9 , happyReduce_9),
-	(10 , happyReduce_10),
-	(11 , happyReduce_11),
-	(12 , happyReduce_12),
-	(13 , happyReduce_13),
-	(14 , happyReduce_14),
-	(15 , happyReduce_15),
-	(16 , happyReduce_16),
-	(17 , happyReduce_17),
-	(18 , happyReduce_18),
-	(19 , happyReduce_19),
-	(20 , happyReduce_20),
-	(21 , happyReduce_21),
-	(22 , happyReduce_22),
-	(23 , happyReduce_23),
-	(24 , happyReduce_24),
-	(25 , happyReduce_25),
-	(26 , happyReduce_26),
-	(27 , happyReduce_27),
-	(28 , happyReduce_28),
-	(29 , happyReduce_29),
-	(30 , happyReduce_30),
-	(31 , happyReduce_31),
-	(32 , happyReduce_32),
-	(33 , happyReduce_33),
-	(34 , happyReduce_34),
-	(35 , happyReduce_35),
-	(36 , happyReduce_36),
-	(37 , happyReduce_37),
-	(38 , happyReduce_38),
-	(39 , happyReduce_39),
-	(40 , happyReduce_40),
-	(41 , happyReduce_41),
-	(42 , happyReduce_42),
-	(43 , happyReduce_43),
-	(44 , happyReduce_44),
-	(45 , happyReduce_45),
-	(46 , happyReduce_46),
-	(47 , happyReduce_47),
-	(48 , happyReduce_48),
-	(49 , happyReduce_49),
-	(50 , happyReduce_50),
-	(51 , happyReduce_51),
-	(52 , happyReduce_52),
-	(53 , happyReduce_53),
-	(54 , happyReduce_54),
-	(55 , happyReduce_55),
-	(56 , happyReduce_56),
-	(57 , happyReduce_57),
-	(58 , happyReduce_58),
-	(59 , happyReduce_59),
-	(60 , happyReduce_60),
-	(61 , happyReduce_61),
-	(62 , happyReduce_62),
-	(63 , happyReduce_63),
-	(64 , happyReduce_64),
-	(65 , happyReduce_65),
-	(66 , happyReduce_66),
-	(67 , happyReduce_67),
-	(68 , happyReduce_68),
-	(69 , happyReduce_69),
-	(70 , happyReduce_70),
-	(71 , happyReduce_71),
-	(72 , happyReduce_72),
-	(73 , happyReduce_73),
-	(74 , happyReduce_74),
-	(75 , happyReduce_75),
-	(76 , happyReduce_76),
-	(77 , happyReduce_77),
-	(78 , happyReduce_78),
-	(79 , happyReduce_79),
-	(80 , happyReduce_80),
-	(81 , happyReduce_81),
-	(82 , happyReduce_82),
-	(83 , happyReduce_83)
-	]
-
-happy_n_terms = 70 :: Int
-happy_n_nonterms = 17 :: Int
-
-happyReduce_1 = happySpecReduce_1  0# happyReduction_1
-happyReduction_1 happy_x_1
-	 =  case happyOut6 happy_x_1 of { happy_var_1 -> 
-	happyIn4
-		 ([happy_var_1]
-	)}
-
-happyReduce_2 = happySpecReduce_2  0# happyReduction_2
-happyReduction_2 happy_x_2
-	happy_x_1
-	 =  case happyOut6 happy_x_1 of { happy_var_1 -> 
-	case happyOut4 happy_x_2 of { happy_var_2 -> 
-	happyIn4
-		 (happy_var_1:happy_var_2
-	)}}
-
-happyReduce_3 = happyMonadReduce 4# 0# happyReduction_3
-happyReduction_3 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	case happyOut4 happy_x_3 of { happy_var_3 -> 
-	case happyOut20 happy_x_4 of { happy_var_4 -> 
-	(
- 	   let rest = happy_var_3 in
-	   let pt = unsafePerformIO (readFile happy_var_2) in
-		case (parse pt happy_var_4) of
-		   Success x -> returnP (x ++ rest)
-		   Failure err file ln -> failP err)}}}
-	) (\r -> happyReturn (happyIn4 r))
-
-happyReduce_4 = happySpecReduce_1  1# happyReduction_4
-happyReduction_4 happy_x_1
-	 =  happyIn5
-		 (TyInt
-	)
-
-happyReduce_5 = happySpecReduce_1  1# happyReduction_5
-happyReduction_5 happy_x_1
-	 =  happyIn5
-		 (TyBigInt
-	)
-
-happyReduce_6 = happySpecReduce_1  1# happyReduction_6
-happyReduction_6 happy_x_1
-	 =  happyIn5
-		 (TyChar
-	)
-
-happyReduce_7 = happySpecReduce_1  1# happyReduction_7
-happyReduction_7 happy_x_1
-	 =  happyIn5
-		 (TyBool
-	)
-
-happyReduce_8 = happySpecReduce_1  1# happyReduction_8
-happyReduction_8 happy_x_1
-	 =  happyIn5
-		 (TyFloat
-	)
-
-happyReduce_9 = happySpecReduce_1  1# happyReduction_9
-happyReduction_9 happy_x_1
-	 =  happyIn5
-		 (TyBigFloat
-	)
-
-happyReduce_10 = happySpecReduce_1  1# happyReduction_10
-happyReduction_10 happy_x_1
-	 =  happyIn5
-		 (TyString
-	)
-
-happyReduce_11 = happySpecReduce_1  1# happyReduction_11
-happyReduction_11 happy_x_1
-	 =  happyIn5
-		 (TyPtr
-	)
-
-happyReduce_12 = happySpecReduce_1  1# happyReduction_12
-happyReduction_12 happy_x_1
-	 =  happyIn5
-		 (TyUnit
-	)
-
-happyReduce_13 = happySpecReduce_1  1# happyReduction_13
-happyReduction_13 happy_x_1
-	 =  happyIn5
-		 (TyAny
-	)
-
-happyReduce_14 = happySpecReduce_1  1# happyReduction_14
-happyReduction_14 happy_x_1
-	 =  happyIn5
-		 (TyData
-	)
-
-happyReduce_15 = happySpecReduce_1  1# happyReduction_15
-happyReduction_15 happy_x_1
-	 =  happyIn5
-		 (TyFun
-	)
-
-happyReduce_16 = happyReduce 10# 2# happyReduction_16
-happyReduction_16 (happy_x_10 `HappyStk`
-	happy_x_9 `HappyStk`
-	happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut9 happy_x_1 of { happy_var_1 -> 
-	case happyOut7 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokenName happy_var_3) -> 
-	case happyOut10 happy_x_5 of { happy_var_5 -> 
-	case happyOut5 happy_x_8 of { happy_var_8 -> 
-	case happyOut11 happy_x_10 of { happy_var_10 -> 
-	happyIn6
-		 (mkBind happy_var_3 (map snd happy_var_5) happy_var_8 (map fst happy_var_5) happy_var_10 happy_var_1 happy_var_2
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_17 = happyReduce 7# 2# happyReduction_17
-happyReduction_17 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenName happy_var_2) -> 
-	case happyOut10 happy_x_4 of { happy_var_4 -> 
-	case happyOut5 happy_x_7 of { happy_var_7 -> 
-	happyIn6
-		 (mkExtern happy_var_2 (map snd happy_var_4) happy_var_7 (map fst happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_18 = happySpecReduce_2  2# happyReduction_18
-happyReduction_18 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	happyIn6
-		 (Include happy_var_2
-	)}
-
-happyReduce_19 = happySpecReduce_0  3# happyReduction_19
-happyReduction_19  =  happyIn7
-		 ([]
-	)
-
-happyReduce_20 = happySpecReduce_2  3# happyReduction_20
-happyReduction_20 happy_x_2
-	happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	case happyOut7 happy_x_2 of { happy_var_2 -> 
-	happyIn7
-		 (happy_var_1:happy_var_2
-	)}}
-
-happyReduce_21 = happySpecReduce_1  4# happyReduction_21
-happyReduction_21 happy_x_1
-	 =  happyIn8
-		 (Inline
-	)
-
-happyReduce_22 = happySpecReduce_1  4# happyReduction_22
-happyReduction_22 happy_x_1
-	 =  happyIn8
-		 (Strict
-	)
-
-happyReduce_23 = happySpecReduce_0  5# happyReduction_23
-happyReduction_23  =  happyIn9
-		 (Nothing
-	)
-
-happyReduce_24 = happySpecReduce_2  5# happyReduction_24
-happyReduction_24 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	happyIn9
-		 (Just happy_var_2
-	)}
-
-happyReduce_25 = happySpecReduce_0  6# happyReduction_25
-happyReduction_25  =  happyIn10
-		 ([]
-	)
-
-happyReduce_26 = happySpecReduce_3  6# happyReduction_26
-happyReduction_26 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	happyIn10
-		 ([(happy_var_1,happy_var_3)]
-	)}}
-
-happyReduce_27 = happyReduce 5# 6# happyReduction_27
-happyReduction_27 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	case happyOut10 happy_x_5 of { happy_var_5 -> 
-	happyIn10
-		 ((happy_var_1,happy_var_3):happy_var_5
-	) `HappyStk` happyRest}}}
-
-happyReduce_28 = happySpecReduce_1  7# happyReduction_28
-happyReduction_28 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> 
-	happyIn11
-		 (R happy_var_1
-	)}
-
-happyReduce_29 = happySpecReduce_3  7# happyReduction_29
-happyReduction_29 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_2 of { happy_var_2 -> 
-	happyIn11
-		 (happy_var_2
-	)}
-
-happyReduce_30 = happyReduce 4# 7# happyReduction_30
-happyReduction_30 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut16 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (App happy_var_1 happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_31 = happySpecReduce_3  7# happyReduction_31
-happyReduction_31 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn11
-		 (Con 0 happy_var_2
-	)}
-
-happyReduce_32 = happyReduce 4# 7# happyReduction_32
-happyReduction_32 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Lazy happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_33 = happyReduce 4# 7# happyReduction_33
-happyReduction_33 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Effect happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_34 = happyReduce 5# 7# happyReduction_34
-happyReduction_34 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> 
-	case happyOut16 happy_x_4 of { happy_var_4 -> 
-	happyIn11
-		 (Con happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}
-
-happyReduce_35 = happySpecReduce_1  7# happyReduction_35
-happyReduction_35 happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (Const happy_var_1
-	)}
-
-happyReduce_36 = happySpecReduce_3  7# happyReduction_36
-happyReduction_36 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_3 of { (TokenInt happy_var_3) -> 
-	happyIn11
-		 (Proj happy_var_1 happy_var_3
-	)}}
-
-happyReduce_37 = happyReduce 8# 7# happyReduction_37
-happyReduction_37 (happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenName happy_var_2) -> 
-	case happyOut5 happy_x_4 of { happy_var_4 -> 
-	case happyOut11 happy_x_6 of { happy_var_6 -> 
-	case happyOut11 happy_x_8 of { happy_var_8 -> 
-	happyIn11
-		 (Let happy_var_2 happy_var_4 happy_var_6 happy_var_8
-	) `HappyStk` happyRest}}}}
-
-happyReduce_38 = happySpecReduce_3  7# happyReduction_38
-happyReduction_38 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Let (MN "unused" 0) TyUnit happy_var_1 happy_var_3
-	)}}
-
-happyReduce_39 = happyReduce 6# 7# happyReduction_39
-happyReduction_39 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut11 happy_x_4 of { happy_var_4 -> 
-	case happyOut11 happy_x_6 of { happy_var_6 -> 
-	happyIn11
-		 (If happy_var_2 happy_var_4 happy_var_6
-	) `HappyStk` happyRest}}}
-
-happyReduce_40 = happyReduce 6# 7# happyReduction_40
-happyReduction_40 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	case happyOut11 happy_x_5 of { happy_var_5 -> 
-	happyIn11
-		 (While happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}
-
-happyReduce_41 = happyReduce 8# 7# happyReduction_41
-happyReduction_41 (happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	case happyOut11 happy_x_5 of { happy_var_5 -> 
-	case happyOut11 happy_x_7 of { happy_var_7 -> 
-	happyIn11
-		 (WhileAcc happy_var_3 happy_var_5 happy_var_7
-	) `HappyStk` happyRest}}}
-
-happyReduce_42 = happySpecReduce_1  7# happyReduction_42
-happyReduction_42 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (happy_var_1
-	)}
-
-happyReduce_43 = happySpecReduce_1  7# happyReduction_43
-happyReduction_43 happy_x_1
-	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (happy_var_1
-	)}
-
-happyReduce_44 = happySpecReduce_2  7# happyReduction_44
-happyReduction_44 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	happyIn11
-		 (Error happy_var_2
-	)}
-
-happyReduce_45 = happySpecReduce_1  7# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  happyIn11
-		 (Impossible
-	)
-
-happyReduce_46 = happyReduce 6# 7# happyReduction_46
-happyReduction_46 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut5 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokenString happy_var_3) -> 
-	case happyOut17 happy_x_5 of { happy_var_5 -> 
-	happyIn11
-		 (ForeignCall happy_var_2 happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}}
-
-happyReduce_47 = happyReduce 7# 7# happyReduction_47
-happyReduction_47 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut5 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokenString happy_var_4) -> 
-	case happyOut17 happy_x_6 of { happy_var_6 -> 
-	happyIn11
-		 (LazyForeignCall happy_var_3 happy_var_4 happy_var_6
-	) `HappyStk` happyRest}}}
-
-happyReduce_48 = happyReduce 6# 8# happyReduction_48
-happyReduction_48 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut13 happy_x_5 of { happy_var_5 -> 
-	happyIn12
-		 (Case happy_var_2 happy_var_5
-	) `HappyStk` happyRest}}
-
-happyReduce_49 = happySpecReduce_0  9# happyReduction_49
-happyReduction_49  =  happyIn13
-		 ([]
-	)
-
-happyReduce_50 = happySpecReduce_1  9# happyReduction_50
-happyReduction_50 happy_x_1
-	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
-	happyIn13
-		 ([happy_var_1]
-	)}
-
-happyReduce_51 = happySpecReduce_3  9# happyReduction_51
-happyReduction_51 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
-	case happyOut13 happy_x_3 of { happy_var_3 -> 
-	happyIn13
-		 (happy_var_1:happy_var_3
-	)}}
-
-happyReduce_52 = happyReduce 7# 10# happyReduction_52
-happyReduction_52 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> 
-	case happyOut10 happy_x_4 of { happy_var_4 -> 
-	case happyOut11 happy_x_7 of { happy_var_7 -> 
-	happyIn14
-		 (Alt happy_var_2 happy_var_4 happy_var_7
-	) `HappyStk` happyRest}}}
-
-happyReduce_53 = happySpecReduce_3  10# happyReduction_53
-happyReduction_53 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenInt happy_var_1) -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn14
-		 (ConstAlt happy_var_1 happy_var_3
-	)}}
-
-happyReduce_54 = happySpecReduce_3  10# happyReduction_54
-happyReduction_54 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn14
-		 (DefaultCase happy_var_3
-	)}
-
-happyReduce_55 = happySpecReduce_3  11# happyReduction_55
-happyReduction_55 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Plus happy_var_1 happy_var_3
-	)}}
-
-happyReduce_56 = happySpecReduce_3  11# happyReduction_56
-happyReduction_56 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Minus happy_var_1 happy_var_3
-	)}}
-
-happyReduce_57 = happySpecReduce_2  11# happyReduction_57
-happyReduction_57 happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_2 of { happy_var_2 -> 
-	happyIn15
-		 (Op Minus (Const (MkInt 0)) happy_var_2
-	)}
-
-happyReduce_58 = happySpecReduce_3  11# happyReduction_58
-happyReduction_58 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Times happy_var_1 happy_var_3
-	)}}
-
-happyReduce_59 = happySpecReduce_3  11# happyReduction_59
-happyReduction_59 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Divide happy_var_1 happy_var_3
-	)}}
-
-happyReduce_60 = happySpecReduce_3  11# happyReduction_60
-happyReduction_60 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op ShL happy_var_1 happy_var_3
-	)}}
-
-happyReduce_61 = happySpecReduce_3  11# happyReduction_61
-happyReduction_61 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op ShR happy_var_1 happy_var_3
-	)}}
-
-happyReduce_62 = happySpecReduce_3  11# happyReduction_62
-happyReduction_62 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpLT happy_var_1 happy_var_3
-	)}}
-
-happyReduce_63 = happySpecReduce_3  11# happyReduction_63
-happyReduction_63 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpGT happy_var_1 happy_var_3
-	)}}
-
-happyReduce_64 = happySpecReduce_3  11# happyReduction_64
-happyReduction_64 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpLE happy_var_1 happy_var_3
-	)}}
-
-happyReduce_65 = happySpecReduce_3  11# happyReduction_65
-happyReduction_65 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpGE happy_var_1 happy_var_3
-	)}}
-
-happyReduce_66 = happySpecReduce_3  11# happyReduction_66
-happyReduction_66 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpEQ happy_var_1 happy_var_3
-	)}}
-
-happyReduce_67 = happySpecReduce_0  12# happyReduction_67
-happyReduction_67  =  happyIn16
-		 ([]
-	)
-
-happyReduce_68 = happySpecReduce_1  12# happyReduction_68
-happyReduction_68 happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 ([happy_var_1]
-	)}
-
-happyReduce_69 = happySpecReduce_3  12# happyReduction_69
-happyReduction_69 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut16 happy_x_3 of { happy_var_3 -> 
-	happyIn16
-		 (happy_var_1:happy_var_3
-	)}}
-
-happyReduce_70 = happySpecReduce_0  13# happyReduction_70
-happyReduction_70  =  happyIn17
-		 ([]
-	)
-
-happyReduce_71 = happySpecReduce_3  13# happyReduction_71
-happyReduction_71 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	happyIn17
-		 ([(happy_var_1,happy_var_3)]
-	)}}
-
-happyReduce_72 = happyReduce 5# 13# happyReduction_72
-happyReduction_72 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	case happyOut17 happy_x_5 of { happy_var_5 -> 
-	happyIn17
-		 ((happy_var_1,happy_var_3):happy_var_5
-	) `HappyStk` happyRest}}}
-
-happyReduce_73 = happySpecReduce_1  14# happyReduction_73
-happyReduction_73 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenInt happy_var_1) -> 
-	happyIn18
-		 (MkInt happy_var_1
-	)}
-
-happyReduce_74 = happySpecReduce_1  14# happyReduction_74
-happyReduction_74 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenBigInt happy_var_1) -> 
-	happyIn18
-		 (MkBigInt happy_var_1
-	)}
-
-happyReduce_75 = happySpecReduce_1  14# happyReduction_75
-happyReduction_75 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenChar happy_var_1) -> 
-	happyIn18
-		 (MkChar happy_var_1
-	)}
-
-happyReduce_76 = happySpecReduce_1  14# happyReduction_76
-happyReduction_76 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenBool happy_var_1) -> 
-	happyIn18
-		 (MkBool happy_var_1
-	)}
-
-happyReduce_77 = happySpecReduce_1  14# happyReduction_77
-happyReduction_77 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenFloat happy_var_1) -> 
-	happyIn18
-		 (MkFloat happy_var_1
-	)}
-
-happyReduce_78 = happySpecReduce_1  14# happyReduction_78
-happyReduction_78 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenBigFloat happy_var_1) -> 
-	happyIn18
-		 (MkBigFloat happy_var_1
-	)}
-
-happyReduce_79 = happySpecReduce_1  14# happyReduction_79
-happyReduction_79 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenString happy_var_1) -> 
-	happyIn18
-		 (MkString happy_var_1
-	)}
-
-happyReduce_80 = happySpecReduce_1  14# happyReduction_80
-happyReduction_80 happy_x_1
-	 =  happyIn18
-		 (MkUnit
-	)
-
-happyReduce_81 = happySpecReduce_1  14# happyReduction_81
-happyReduction_81 happy_x_1
-	 =  happyIn18
-		 (MkUnused
-	)
-
-happyReduce_82 = happyMonadReduce 0# 15# happyReduction_82
-happyReduction_82 (happyRest) tk
-	 = happyThen (( getLineNo)
-	) (\r -> happyReturn (happyIn19 r))
-
-happyReduce_83 = happyMonadReduce 0# 16# happyReduction_83
-happyReduction_83 (happyRest) tk
-	 = happyThen (( getFileName)
-	) (\r -> happyReturn (happyIn20 r))
-
-happyNewToken action sts stk
-	= lexer(\tk -> 
-	let cont i = happyDoAction i tk action sts stk in
-	case tk of {
-	TokenEOF -> happyDoAction 69# tk action sts stk;
-	TokenName happy_dollar_dollar -> cont 1#;
-	TokenString happy_dollar_dollar -> cont 2#;
-	TokenInt happy_dollar_dollar -> cont 3#;
-	TokenBigInt happy_dollar_dollar -> cont 4#;
-	TokenBool happy_dollar_dollar -> cont 5#;
-	TokenFloat happy_dollar_dollar -> cont 6#;
-	TokenBigFloat happy_dollar_dollar -> cont 7#;
-	TokenChar happy_dollar_dollar -> cont 8#;
-	TokenIntType -> cont 9#;
-	TokenBigIntType -> cont 10#;
-	TokenCharType -> cont 11#;
-	TokenBoolType -> cont 12#;
-	TokenFloatType -> cont 13#;
-	TokenBigFloatType -> cont 14#;
-	TokenStringType -> cont 15#;
-	TokenPtrType -> cont 16#;
-	TokenUnitType -> cont 17#;
-	TokenFunType -> cont 18#;
-	TokenDataType -> cont 19#;
-	TokenAnyType -> cont 20#;
-	TokenUnit -> cont 21#;
-	TokenCon -> cont 22#;
-	TokenDefault -> cont 23#;
-	TokenLet -> cont 24#;
-	TokenCase -> cont 25#;
-	TokenOf -> cont 26#;
-	TokenIf -> cont 27#;
-	TokenThen -> cont 28#;
-	TokenElse -> cont 29#;
-	TokenWhile -> cont 30#;
-	TokenUnused -> cont 31#;
-	TokenIn -> cont 32#;
-	TokenLazy -> cont 33#;
-	TokenStrict -> cont 34#;
-	TokenEffect -> cont 35#;
-	TokenForeign -> cont 36#;
-	TokenError -> cont 37#;
-	TokenImpossible -> cont 38#;
-	TokenOB -> cont 39#;
-	TokenCB -> cont 40#;
-	TokenOCB -> cont 41#;
-	TokenCCB -> cont 42#;
-	TokenOSB -> cont 43#;
-	TokenCSB -> cont 44#;
-	TokenPlus -> cont 45#;
-	TokenMinus -> cont 46#;
-	TokenTimes -> cont 47#;
-	TokenDivide -> cont 48#;
-	TokenEquals -> cont 49#;
-	TokenEQ -> cont 50#;
-	TokenLE -> cont 51#;
-	TokenGE -> cont 52#;
-	TokenShL -> cont 53#;
-	TokenShR -> cont 54#;
-	TokenLT -> cont 55#;
-	TokenGT -> cont 56#;
-	TokenColon -> cont 57#;
-	TokenProj -> cont 58#;
-	TokenSemi -> cont 59#;
-	TokenComma -> cont 60#;
-	TokenBar -> cont 61#;
-	TokenArrow -> cont 62#;
-	TokenCInclude -> cont 63#;
-	TokenExtern -> cont 64#;
-	TokenExport -> cont 65#;
-	TokenCType -> cont 66#;
-	TokenInclude -> cont 67#;
-	TokenInline -> cont 68#;
-	_ -> happyError' tk
-	})
-
-happyError_ tk = happyError' tk
-
-happyThen :: () => P a -> (a -> P b) -> P b
-happyThen = (thenP)
-happyReturn :: () => a -> P a
-happyReturn = (returnP)
-happyThen1 = happyThen
-happyReturn1 :: () => a -> P a
-happyReturn1 = happyReturn
-happyError' :: () => (Token) -> P a
-happyError' tk = (\token -> happyError) tk
-
-mkparse = happySomeParser where
-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut4 x))
-
-happySeq = happyDontSeq
-
-
-mkBind :: Name -> [Type] -> Type -> [Name] -> Expr -> Maybe String -> [CGFlag] -> Decl
-mkBind n tys ret ns expr export fl = Decl n ret (Bind (zip ns tys) 0 expr fl) export fl
-
-mkExtern :: Name -> [Type] -> Type -> [Name] -> Decl
-mkExtern n tys ret ns = Extern n ret tys
-
-parse :: String -> FilePath -> Result [Decl]
-parse s fn = mkparse s fn 1
-
-parseFile :: FilePath -> IO (Result [Decl])
-parseFile fn = do s <- readFile fn
-                  let x = parse s fn
-                  return x
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command line>" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
-
-{-# LINE 28 "templates/GenericTemplate.hs" #-}
-
-
-data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
-
-
-
-
-
-{-# LINE 49 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 59 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 68 "templates/GenericTemplate.hs" #-}
-
-infixr 9 `HappyStk`
-data HappyStk a = HappyStk a (HappyStk a)
-
------------------------------------------------------------------------------
--- starting the parse
-
-happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
-
------------------------------------------------------------------------------
--- Accepting the parse
-
--- If the current token is 0#, it means we've just accepted a partial
--- parse (a %partial parser).  We must ignore the saved token on the top of
--- the stack in this case.
-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
-	happyReturn1 ans
-happyAccept j tk st sts (HappyStk ans _) = 
-	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
-
------------------------------------------------------------------------------
--- Arrays only: do the next action
-
-
-
-happyDoAction i tk st
-	= {- nothing -}
-
-
-	  case action of
-		0#		  -> {- nothing -}
-				     happyFail i tk st
-		-1# 	  -> {- nothing -}
-				     happyAccept i tk st
-		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
-
-				     (happyReduceArr Happy_Data_Array.! rule) i tk st
-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
-		n		  -> {- nothing -}
-
-
-				     happyShift new_state i tk st
-				     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
-   where off    = indexShortOffAddr happyActOffsets st
-	 off_i  = (off Happy_GHC_Exts.+# i)
-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
-			else False
- 	 action | check     = indexShortOffAddr happyTable off_i
-		| otherwise = indexShortOffAddr happyDefActions st
-
-{-# LINE 127 "templates/GenericTemplate.hs" #-}
-
-
-indexShortOffAddr (HappyA# arr) off =
-#if __GLASGOW_HASKELL__ > 500
-	Happy_GHC_Exts.narrow16Int# i
-#elif __GLASGOW_HASKELL__ == 500
-	Happy_GHC_Exts.intToInt16# i
-#else
-	Happy_GHC_Exts.iShiftRA# (Happy_GHC_Exts.iShiftL# i 16#) 16#
-#endif
-  where
-#if __GLASGOW_HASKELL__ >= 503
-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
-#else
-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.shiftL# high 8#) low)
-#endif
-	high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
-	low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
-	off' = off Happy_GHC_Exts.*# 2#
-
-
-
-
-
-data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
-
-
-
-
------------------------------------------------------------------------------
--- HappyState data type (not arrays)
-
-{-# LINE 170 "templates/GenericTemplate.hs" #-}
-
------------------------------------------------------------------------------
--- Shifting a token
-
-happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
---     trace "shifting the error token" $
-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
-
-happyShift new_state i tk st sts stk =
-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
-
--- happyReduce is specialised for the common cases.
-
-happySpecReduce_0 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_0 nt fn j tk st@((action)) sts stk
-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
-
-happySpecReduce_1 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
-     = let r = fn v1 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_2 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
-     = let r = fn v1 v2 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_3 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
-     = let r = fn v1 v2 v3 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happyReduce k i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyReduce k nt fn j tk st sts stk
-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
-	 sts1@((HappyCons (st1@(action)) (_))) ->
-        	let r = fn stk in  -- it doesn't hurt to always seq here...
-       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
-
-happyMonadReduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonadReduce k nt fn j tk st sts stk =
-        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
-       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
-
-happyMonad2Reduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonad2Reduce k nt fn j tk st sts stk =
-       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
-       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
-
-             off    = indexShortOffAddr happyGotoOffsets st1
-             off_i  = (off Happy_GHC_Exts.+# nt)
-             new_state = indexShortOffAddr happyTable off_i
-
-
-
-
-happyDrop 0# l = l
-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
-
-happyDropStk 0# l = l
-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
-
------------------------------------------------------------------------------
--- Moving to a new state after a reduction
-
-
-happyGoto nt j tk st = 
-   {- nothing -}
-   happyDoAction j tk new_state
-   where off    = indexShortOffAddr happyGotoOffsets st
-	 off_i  = (off Happy_GHC_Exts.+# nt)
- 	 new_state = indexShortOffAddr happyTable off_i
-
-
-
-
------------------------------------------------------------------------------
--- Error recovery (0# is the error token)
-
--- parse error if we are in recovery and we fail again
-happyFail  0# tk old_st _ stk =
---	trace "failing" $ 
-    	happyError_ tk
-
-{-  We don't need state discarding for our restricted implementation of
-    "error".  In fact, it can cause some bogus parses, so I've disabled it
-    for now --SDM
-
--- discard a state
-happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
-						(saved_tok `HappyStk` _ `HappyStk` stk) =
---	trace ("discarding state, depth " ++ show (length stk))  $
-	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
--}
-
--- Enter error recovery: generate an error token,
---                       save the old token and carry on.
-happyFail  i tk (action) sts stk =
---      trace "entering error recovery" $
-	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
-
--- Internal happy errors:
-
-notHappyAtAll = error "Internal Happy error\n"
-
------------------------------------------------------------------------------
--- Hack to get the typechecker to accept our action functions
-
-
-happyTcHack :: Happy_GHC_Exts.Int# -> a -> a
-happyTcHack x y = y
-{-# INLINE happyTcHack #-}
-
-
------------------------------------------------------------------------------
--- Seq-ing.  If the --strict flag is given, then Happy emits 
---	happySeq = happyDoSeq
--- otherwise it emits
--- 	happySeq = happyDontSeq
-
-happyDoSeq, happyDontSeq :: a -> b -> b
-happyDoSeq   a b = a `seq` b
-happyDontSeq a b = b
-
------------------------------------------------------------------------------
--- Don't inline any functions from the template.  GHC has a nasty habit
--- of deciding to inline happyGoto everywhere, which increases the size of
--- the generated parser quite a bit.
-
-
-{-# NOINLINE happyDoAction #-}
-{-# NOINLINE happyTable #-}
-{-# NOINLINE happyCheck #-}
-{-# NOINLINE happyActOffsets #-}
-{-# NOINLINE happyGotoOffsets #-}
-{-# NOINLINE happyDefActions #-}
-
-{-# NOINLINE happyShift #-}
-{-# NOINLINE happySpecReduce_0 #-}
-{-# NOINLINE happySpecReduce_1 #-}
-{-# NOINLINE happySpecReduce_2 #-}
-{-# NOINLINE happySpecReduce_3 #-}
-{-# NOINLINE happyReduce #-}
-{-# NOINLINE happyMonadReduce #-}
-{-# NOINLINE happyGoto #-}
-{-# NOINLINE happyFail #-}
-
--- end of Happy Template.
diff --git a/dist/build/Epic/epic-tmp/Epic/Parser.hs b/dist/build/Epic/epic-tmp/Epic/Parser.hs
deleted file mode 100644
--- a/dist/build/Epic/epic-tmp/Epic/Parser.hs
+++ /dev/null
@@ -1,1368 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
-{-# OPTIONS -fglasgow-exts -cpp #-}
--- -*-Haskell-*-
-{-# OPTIONS_GHC -fglasgow-exts #-}
-
-module Epic.Parser where
-
-import Char
-import System.IO.Unsafe
-
-import Epic.Language
-import Epic.Lexer
-#if __GLASGOW_HASKELL__ >= 503
-import qualified Data.Array as Happy_Data_Array
-#else
-import qualified Array as Happy_Data_Array
-#endif
-#if __GLASGOW_HASKELL__ >= 503
-import qualified GHC.Exts as Happy_GHC_Exts
-#else
-import qualified GlaExts as Happy_GHC_Exts
-#endif
-
--- parser produced by Happy Version 1.18.4
-
-newtype HappyAbsSyn  = HappyAbsSyn HappyAny
-#if __GLASGOW_HASKELL__ >= 607
-type HappyAny = Happy_GHC_Exts.Any
-#else
-type HappyAny = forall a . a
-#endif
-happyIn4 :: ([Decl]) -> (HappyAbsSyn )
-happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn4 #-}
-happyOut4 :: (HappyAbsSyn ) -> ([Decl])
-happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut4 #-}
-happyIn5 :: (Type) -> (HappyAbsSyn )
-happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn5 #-}
-happyOut5 :: (HappyAbsSyn ) -> (Type)
-happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut5 #-}
-happyIn6 :: (Decl) -> (HappyAbsSyn )
-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn6 #-}
-happyOut6 :: (HappyAbsSyn ) -> (Decl)
-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut6 #-}
-happyIn7 :: ([CGFlag]) -> (HappyAbsSyn )
-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn7 #-}
-happyOut7 :: (HappyAbsSyn ) -> ([CGFlag])
-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut7 #-}
-happyIn8 :: (CGFlag) -> (HappyAbsSyn )
-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn8 #-}
-happyOut8 :: (HappyAbsSyn ) -> (CGFlag)
-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut8 #-}
-happyIn9 :: (Maybe String) -> (HappyAbsSyn )
-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn9 #-}
-happyOut9 :: (HappyAbsSyn ) -> (Maybe String)
-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut9 #-}
-happyIn10 :: ([(Name,Type)]) -> (HappyAbsSyn )
-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn10 #-}
-happyOut10 :: (HappyAbsSyn ) -> ([(Name,Type)])
-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut10 #-}
-happyIn11 :: (Expr) -> (HappyAbsSyn )
-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn11 #-}
-happyOut11 :: (HappyAbsSyn ) -> (Expr)
-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut11 #-}
-happyIn12 :: (Expr) -> (HappyAbsSyn )
-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn12 #-}
-happyOut12 :: (HappyAbsSyn ) -> (Expr)
-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut12 #-}
-happyIn13 :: ([CaseAlt]) -> (HappyAbsSyn )
-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn13 #-}
-happyOut13 :: (HappyAbsSyn ) -> ([CaseAlt])
-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut13 #-}
-happyIn14 :: (CaseAlt) -> (HappyAbsSyn )
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn ) -> (CaseAlt)
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (Expr) -> (HappyAbsSyn )
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn ) -> (Expr)
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: ([Expr]) -> (HappyAbsSyn )
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn ) -> ([Expr])
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: ([(Expr,Type)]) -> (HappyAbsSyn )
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn ) -> ([(Expr,Type)])
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (Const) -> (HappyAbsSyn )
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn ) -> (Const)
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: (LineNumber) -> (HappyAbsSyn )
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn ) -> (LineNumber)
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: (String) -> (HappyAbsSyn )
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn ) -> (String)
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyInTok :: (Token) -> (HappyAbsSyn )
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn ) -> (Token)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\x2d\x01\x1f\x00\x00\x00\xdf\xff\x52\x01\x4d\x01\x4b\x01\xfe\x00\xf5\x01\x40\x01\x2d\x01\x00\x00\x00\x00\x16\x01\x00\x00\x3b\x01\xdf\xff\x00\x00\x00\x00\x00\x00\x14\x01\x2a\x01\x00\x00\x00\x00\x08\x01\xf1\x00\x28\x01\xf0\x00\x69\x01\xdb\x00\x69\x01\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x69\x01\x15\x01\x00\x00\x00\x00\xe0\x00\x01\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x03\x01\x01\x00\x01\x00\xdc\x00\x00\x00\xf1\xff\xda\x00\x69\x01\x00\x01\x00\x00\x01\x00\x01\x00\x01\x00\xe7\xff\x86\x00\xd0\x00\xed\x00\x00\x00\xf2\x00\x01\x00\x69\x01\x01\x00\x01\x00\x18\x00\x03\x00\xb6\x00\xc5\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\xd7\x00\x01\x00\x23\x01\x00\x00\x35\x01\x35\x01\xe4\xff\xe4\xff\x35\x01\x35\x01\x11\x01\xe7\xff\xe7\xff\x37\x01\x37\x01\xc6\x00\x01\x00\x69\x01\xc4\x00\x01\x00\x74\x00\xd8\x00\xdd\x00\xc3\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\xb1\x00\x00\x00\x01\x00\x34\x00\x2a\x00\x96\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x9b\x00\x8b\x00\x8f\x00\xbc\x00\x79\x00\x01\x00\x62\x00\x01\x00\xae\x00\x8a\x00\x00\x00\x69\x01\x89\x00\x00\x00\x01\x00\xff\x00\x01\x00\x7e\x00\x01\x00\x2a\x00\x00\x00\x4d\x00\x01\x00\x00\x00\xff\x00\x9f\x00\xff\x00\x9c\x00\x00\x00\x63\x00\x01\x00\x00\x00\x6b\x00\xff\x00\x50\x00\x00\x00\x01\x00\xff\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\x37\x02\x0b\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x78\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x25\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x02\x1b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x19\x02\x97\x01\x11\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x02\x48\x00\x07\x02\x05\x02\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x01\xfd\x01\xfb\x01\xf3\x01\xf1\x01\xe9\x01\xe7\x01\xdf\x01\xdd\x01\xd5\x01\xd3\x01\xcb\x01\x00\x00\xc9\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x01\x43\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x77\x01\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x00\x00\x00\x00\xad\x01\x00\x00\xab\x01\x00\x00\xa3\x01\x39\x00\x00\x00\x00\x00\xa1\x01\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\xe8\xff\x00\x00\x00\x00\xec\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe8\xff\x00\x00\xe8\xff\xfd\xff\xe7\xff\x00\x00\xed\xff\x00\x00\xec\xff\xe9\xff\xea\xff\xeb\xff\x00\x00\xe6\xff\xac\xff\xfc\xff\x00\x00\x00\x00\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xfb\xff\xfa\xff\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf0\xff\xf1\xff\xf2\xff\x00\x00\x00\x00\xe6\xff\xee\xff\xe4\xff\x00\x00\x00\x00\xef\xff\xd5\xff\xd4\xff\xdc\xff\xe3\xff\xb0\xff\xb6\xff\xb5\xff\xb3\xff\xb2\xff\xb1\xff\xb4\xff\xaf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\x00\x00\xbc\xff\x00\x00\xc6\xff\xbb\xff\x00\x00\x00\x00\xd3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\xdb\xff\xc0\xff\xc1\xff\xc2\xff\xc3\xff\xbe\xff\xbf\xff\xbd\xff\xc4\xff\xc5\xff\xc7\xff\xc8\xff\x00\x00\xbc\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\xe0\xff\xbc\xff\xba\xff\xb9\xff\xde\xff\x00\x00\xdf\xff\x00\x00\x00\x00\xce\xff\x00\x00\x00\x00\xe1\xff\xdd\xff\x00\x00\x00\x00\xcd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xff\x00\x00\x00\x00\xd1\xff\x00\x00\x00\x00\xd7\xff\x00\x00\xd8\xff\x00\x00\x00\x00\x00\x00\xce\xff\xcf\xff\x00\x00\x00\x00\xcc\xff\xca\xff\xe6\xff\xc9\xff\x00\x00\xd0\xff\xb8\xff\xb9\xff\xd6\xff\x00\x00\xda\xff\x00\x00\xb7\xff\x00\x00\xcb\xff"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x22\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x00\x00\x27\x00\x02\x00\x02\x00\x27\x00\x05\x00\x05\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x24\x00\x15\x00\x16\x00\x27\x00\x18\x00\x19\x00\x06\x00\x1b\x00\x1a\x00\x3a\x00\x1e\x00\x1f\x00\x3a\x00\x21\x00\x44\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x27\x00\x02\x00\x2b\x00\x03\x00\x05\x00\x2e\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x01\x00\x3a\x00\x3b\x00\x27\x00\x16\x00\x17\x00\x09\x00\x0a\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x01\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1d\x00\x3a\x00\x3b\x00\x09\x00\x0a\x00\x07\x00\x08\x00\x03\x00\x04\x00\x0b\x00\x27\x00\x0d\x00\x0e\x00\x3f\x00\x40\x00\x41\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x01\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x20\x00\x3a\x00\x3b\x00\x01\x00\x07\x00\x08\x00\x06\x00\x27\x00\x0b\x00\x01\x00\x0d\x00\x0e\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x10\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x06\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x03\x00\x04\x00\x06\x00\x3e\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x28\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x3c\x00\x3c\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x27\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x3c\x00\x28\x00\x28\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x03\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x28\x00\x2a\x00\x28\x00\x31\x00\x3d\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x27\x00\x27\x00\x03\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x27\x00\x29\x00\x28\x00\x39\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2c\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x27\x00\x02\x00\x27\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x03\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x31\x00\x3a\x00\x3b\x00\x27\x00\x28\x00\x01\x00\x3e\x00\x28\x00\x3e\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x3c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x01\x00\x39\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x28\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x27\x00\x01\x00\x27\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\x45\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x3b\x00\x02\x00\x01\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x02\x00\xff\xff\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x27\x00\x3a\x00\x27\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x35\x00\x36\x00\x3f\x00\x40\x00\x41\x00\x3a\x00\x43\x00\x3a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\xff\xff\x0d\x00\x0e\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\x07\x00\x08\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\x0c\x00\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0b\x00\xff\xff\x0b\x00\x0e\x00\xff\xff\x0e\x00\x3f\x00\x40\x00\x41\x00\x00\x00\x43\x00\x02\x00\x45\x00\xff\xff\x05\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
-
-happyTable :: HappyAddr
-happyTable = HappyA# "\x00\x00\x12\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x16\x00\x5d\x00\x08\x00\x02\x00\x5d\x00\x03\x00\x03\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x56\x00\x40\x00\x41\x00\x57\x00\x42\x00\x43\x00\xb1\x00\x44\x00\x7b\x00\x69\x00\x45\x00\x46\x00\x69\x00\x47\x00\x13\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x0b\x00\x5d\x00\x08\x00\x4d\x00\x94\x00\x03\x00\x4e\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x7c\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xae\x00\x69\x00\x6a\x00\x5d\x00\x95\x00\x96\x00\xa8\x00\x92\x00\x8c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x7e\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x97\x00\x69\x00\x6a\x00\x91\x00\x92\x00\x99\x00\x34\x00\x13\x00\x10\x00\x35\x00\x5d\x00\xb4\x00\x36\x00\x05\x00\x06\x00\x07\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x53\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xa8\x00\x69\x00\x6a\x00\x31\x00\x99\x00\x34\x00\x30\x00\x5d\x00\x35\x00\x2f\x00\x9d\x00\x36\x00\x1f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x17\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x1b\x00\x69\x00\x6a\x00\x5d\x00\x9f\x00\x0f\x00\x10\x00\x18\x00\xb6\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xb4\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\xa0\x00\xb0\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xab\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x8a\x00\xae\x00\x9c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xa2\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xa3\x00\x69\x00\x6a\x00\x84\x00\x5d\x00\xb1\x00\xa6\x00\x90\x00\x91\x00\xa5\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xa4\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x99\x00\x86\x00\x6c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x88\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x9d\x00\x69\x00\x6a\x00\x5d\x00\x87\x00\x79\x00\x8c\x00\x8f\x00\x7a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x81\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x83\x00\x69\x00\x6a\x00\x5d\x00\x89\x00\x55\x00\x53\x00\x58\x00\x5b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x5c\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x33\x00\x69\x00\x6a\x00\x5d\x00\x82\x00\x1a\x00\x2e\x00\x2d\x00\x1f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x2f\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x1a\x00\x1d\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1e\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x1b\x00\x15\x00\x16\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x0b\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x6a\x00\x0d\x00\x0e\x00\x00\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x0f\x00\x00\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\x69\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x60\x00\x61\x00\x00\x00\x00\x00\x65\x00\x66\x00\x05\x00\x06\x00\x07\x00\x69\x00\x0a\x00\x69\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x99\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x9a\x00\x36\x00\x4f\x00\x34\x00\x00\x00\x00\x00\x35\x00\x84\x00\x00\x00\x36\x00\x4f\x00\x34\x00\x00\x00\x00\x00\x35\x00\x8d\x00\x00\x00\x36\x00\x4f\x00\x34\x00\x00\x00\x00\x00\x35\x00\x77\x00\x00\x00\x36\x00\x4f\x00\x34\x00\xb6\x00\x34\x00\x35\x00\x50\x00\x35\x00\x36\x00\x00\x00\x36\x00\xb2\x00\x34\x00\xa9\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\xab\x00\x34\x00\xac\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\xa0\x00\x34\x00\xa6\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x97\x00\x34\x00\x8a\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x6a\x00\x34\x00\x6c\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x6d\x00\x34\x00\x6e\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x6f\x00\x34\x00\x70\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x71\x00\x34\x00\x72\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x73\x00\x34\x00\x74\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x75\x00\x34\x00\x76\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x7c\x00\x34\x00\x7d\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x7f\x00\x34\x00\x4e\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x51\x00\x34\x00\x58\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x59\x00\x34\x00\x33\x00\x34\x00\x35\x00\x00\x00\x35\x00\x36\x00\x00\x00\x36\x00\x05\x00\x06\x00\x07\x00\x07\x00\x0a\x00\x08\x00\xfe\xff\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyReduceArr = Happy_Data_Array.array (1, 83) [
-	(1 , happyReduce_1),
-	(2 , happyReduce_2),
-	(3 , happyReduce_3),
-	(4 , happyReduce_4),
-	(5 , happyReduce_5),
-	(6 , happyReduce_6),
-	(7 , happyReduce_7),
-	(8 , happyReduce_8),
-	(9 , happyReduce_9),
-	(10 , happyReduce_10),
-	(11 , happyReduce_11),
-	(12 , happyReduce_12),
-	(13 , happyReduce_13),
-	(14 , happyReduce_14),
-	(15 , happyReduce_15),
-	(16 , happyReduce_16),
-	(17 , happyReduce_17),
-	(18 , happyReduce_18),
-	(19 , happyReduce_19),
-	(20 , happyReduce_20),
-	(21 , happyReduce_21),
-	(22 , happyReduce_22),
-	(23 , happyReduce_23),
-	(24 , happyReduce_24),
-	(25 , happyReduce_25),
-	(26 , happyReduce_26),
-	(27 , happyReduce_27),
-	(28 , happyReduce_28),
-	(29 , happyReduce_29),
-	(30 , happyReduce_30),
-	(31 , happyReduce_31),
-	(32 , happyReduce_32),
-	(33 , happyReduce_33),
-	(34 , happyReduce_34),
-	(35 , happyReduce_35),
-	(36 , happyReduce_36),
-	(37 , happyReduce_37),
-	(38 , happyReduce_38),
-	(39 , happyReduce_39),
-	(40 , happyReduce_40),
-	(41 , happyReduce_41),
-	(42 , happyReduce_42),
-	(43 , happyReduce_43),
-	(44 , happyReduce_44),
-	(45 , happyReduce_45),
-	(46 , happyReduce_46),
-	(47 , happyReduce_47),
-	(48 , happyReduce_48),
-	(49 , happyReduce_49),
-	(50 , happyReduce_50),
-	(51 , happyReduce_51),
-	(52 , happyReduce_52),
-	(53 , happyReduce_53),
-	(54 , happyReduce_54),
-	(55 , happyReduce_55),
-	(56 , happyReduce_56),
-	(57 , happyReduce_57),
-	(58 , happyReduce_58),
-	(59 , happyReduce_59),
-	(60 , happyReduce_60),
-	(61 , happyReduce_61),
-	(62 , happyReduce_62),
-	(63 , happyReduce_63),
-	(64 , happyReduce_64),
-	(65 , happyReduce_65),
-	(66 , happyReduce_66),
-	(67 , happyReduce_67),
-	(68 , happyReduce_68),
-	(69 , happyReduce_69),
-	(70 , happyReduce_70),
-	(71 , happyReduce_71),
-	(72 , happyReduce_72),
-	(73 , happyReduce_73),
-	(74 , happyReduce_74),
-	(75 , happyReduce_75),
-	(76 , happyReduce_76),
-	(77 , happyReduce_77),
-	(78 , happyReduce_78),
-	(79 , happyReduce_79),
-	(80 , happyReduce_80),
-	(81 , happyReduce_81),
-	(82 , happyReduce_82),
-	(83 , happyReduce_83)
-	]
-
-happy_n_terms = 70 :: Int
-happy_n_nonterms = 17 :: Int
-
-happyReduce_1 = happySpecReduce_1  0# happyReduction_1
-happyReduction_1 happy_x_1
-	 =  case happyOut6 happy_x_1 of { happy_var_1 -> 
-	happyIn4
-		 ([happy_var_1]
-	)}
-
-happyReduce_2 = happySpecReduce_2  0# happyReduction_2
-happyReduction_2 happy_x_2
-	happy_x_1
-	 =  case happyOut6 happy_x_1 of { happy_var_1 -> 
-	case happyOut4 happy_x_2 of { happy_var_2 -> 
-	happyIn4
-		 (happy_var_1:happy_var_2
-	)}}
-
-happyReduce_3 = happyMonadReduce 4# 0# happyReduction_3
-happyReduction_3 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	case happyOut4 happy_x_3 of { happy_var_3 -> 
-	case happyOut20 happy_x_4 of { happy_var_4 -> 
-	(
- 	   let rest = happy_var_3 in
-	   let pt = unsafePerformIO (readFile happy_var_2) in
-		case (parse pt happy_var_4) of
-		   Success x -> returnP (x ++ rest)
-		   Failure err file ln -> failP err)}}}
-	) (\r -> happyReturn (happyIn4 r))
-
-happyReduce_4 = happySpecReduce_1  1# happyReduction_4
-happyReduction_4 happy_x_1
-	 =  happyIn5
-		 (TyInt
-	)
-
-happyReduce_5 = happySpecReduce_1  1# happyReduction_5
-happyReduction_5 happy_x_1
-	 =  happyIn5
-		 (TyBigInt
-	)
-
-happyReduce_6 = happySpecReduce_1  1# happyReduction_6
-happyReduction_6 happy_x_1
-	 =  happyIn5
-		 (TyChar
-	)
-
-happyReduce_7 = happySpecReduce_1  1# happyReduction_7
-happyReduction_7 happy_x_1
-	 =  happyIn5
-		 (TyBool
-	)
-
-happyReduce_8 = happySpecReduce_1  1# happyReduction_8
-happyReduction_8 happy_x_1
-	 =  happyIn5
-		 (TyFloat
-	)
-
-happyReduce_9 = happySpecReduce_1  1# happyReduction_9
-happyReduction_9 happy_x_1
-	 =  happyIn5
-		 (TyBigFloat
-	)
-
-happyReduce_10 = happySpecReduce_1  1# happyReduction_10
-happyReduction_10 happy_x_1
-	 =  happyIn5
-		 (TyString
-	)
-
-happyReduce_11 = happySpecReduce_1  1# happyReduction_11
-happyReduction_11 happy_x_1
-	 =  happyIn5
-		 (TyPtr
-	)
-
-happyReduce_12 = happySpecReduce_1  1# happyReduction_12
-happyReduction_12 happy_x_1
-	 =  happyIn5
-		 (TyUnit
-	)
-
-happyReduce_13 = happySpecReduce_1  1# happyReduction_13
-happyReduction_13 happy_x_1
-	 =  happyIn5
-		 (TyAny
-	)
-
-happyReduce_14 = happySpecReduce_1  1# happyReduction_14
-happyReduction_14 happy_x_1
-	 =  happyIn5
-		 (TyData
-	)
-
-happyReduce_15 = happySpecReduce_1  1# happyReduction_15
-happyReduction_15 happy_x_1
-	 =  happyIn5
-		 (TyFun
-	)
-
-happyReduce_16 = happyReduce 10# 2# happyReduction_16
-happyReduction_16 (happy_x_10 `HappyStk`
-	happy_x_9 `HappyStk`
-	happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut9 happy_x_1 of { happy_var_1 -> 
-	case happyOut7 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokenName happy_var_3) -> 
-	case happyOut10 happy_x_5 of { happy_var_5 -> 
-	case happyOut5 happy_x_8 of { happy_var_8 -> 
-	case happyOut11 happy_x_10 of { happy_var_10 -> 
-	happyIn6
-		 (mkBind happy_var_3 (map snd happy_var_5) happy_var_8 (map fst happy_var_5) happy_var_10 happy_var_1 happy_var_2
-	) `HappyStk` happyRest}}}}}}
-
-happyReduce_17 = happyReduce 7# 2# happyReduction_17
-happyReduction_17 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenName happy_var_2) -> 
-	case happyOut10 happy_x_4 of { happy_var_4 -> 
-	case happyOut5 happy_x_7 of { happy_var_7 -> 
-	happyIn6
-		 (mkExtern happy_var_2 (map snd happy_var_4) happy_var_7 (map fst happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_18 = happySpecReduce_2  2# happyReduction_18
-happyReduction_18 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	happyIn6
-		 (Include happy_var_2
-	)}
-
-happyReduce_19 = happySpecReduce_0  3# happyReduction_19
-happyReduction_19  =  happyIn7
-		 ([]
-	)
-
-happyReduce_20 = happySpecReduce_2  3# happyReduction_20
-happyReduction_20 happy_x_2
-	happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	case happyOut7 happy_x_2 of { happy_var_2 -> 
-	happyIn7
-		 (happy_var_1:happy_var_2
-	)}}
-
-happyReduce_21 = happySpecReduce_1  4# happyReduction_21
-happyReduction_21 happy_x_1
-	 =  happyIn8
-		 (Inline
-	)
-
-happyReduce_22 = happySpecReduce_1  4# happyReduction_22
-happyReduction_22 happy_x_1
-	 =  happyIn8
-		 (Strict
-	)
-
-happyReduce_23 = happySpecReduce_0  5# happyReduction_23
-happyReduction_23  =  happyIn9
-		 (Nothing
-	)
-
-happyReduce_24 = happySpecReduce_2  5# happyReduction_24
-happyReduction_24 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	happyIn9
-		 (Just happy_var_2
-	)}
-
-happyReduce_25 = happySpecReduce_0  6# happyReduction_25
-happyReduction_25  =  happyIn10
-		 ([]
-	)
-
-happyReduce_26 = happySpecReduce_3  6# happyReduction_26
-happyReduction_26 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	happyIn10
-		 ([(happy_var_1,happy_var_3)]
-	)}}
-
-happyReduce_27 = happyReduce 5# 6# happyReduction_27
-happyReduction_27 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	case happyOut10 happy_x_5 of { happy_var_5 -> 
-	happyIn10
-		 ((happy_var_1,happy_var_3):happy_var_5
-	) `HappyStk` happyRest}}}
-
-happyReduce_28 = happySpecReduce_1  7# happyReduction_28
-happyReduction_28 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> 
-	happyIn11
-		 (R happy_var_1
-	)}
-
-happyReduce_29 = happySpecReduce_3  7# happyReduction_29
-happyReduction_29 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_2 of { happy_var_2 -> 
-	happyIn11
-		 (happy_var_2
-	)}
-
-happyReduce_30 = happyReduce 4# 7# happyReduction_30
-happyReduction_30 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut16 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (App happy_var_1 happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_31 = happySpecReduce_3  7# happyReduction_31
-happyReduction_31 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
-	happyIn11
-		 (Con 0 happy_var_2
-	)}
-
-happyReduce_32 = happyReduce 4# 7# happyReduction_32
-happyReduction_32 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Lazy happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_33 = happyReduce 4# 7# happyReduction_33
-happyReduction_33 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Effect happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_34 = happyReduce 5# 7# happyReduction_34
-happyReduction_34 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> 
-	case happyOut16 happy_x_4 of { happy_var_4 -> 
-	happyIn11
-		 (Con happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}
-
-happyReduce_35 = happySpecReduce_1  7# happyReduction_35
-happyReduction_35 happy_x_1
-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (Const happy_var_1
-	)}
-
-happyReduce_36 = happySpecReduce_3  7# happyReduction_36
-happyReduction_36 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_3 of { (TokenInt happy_var_3) -> 
-	happyIn11
-		 (Proj happy_var_1 happy_var_3
-	)}}
-
-happyReduce_37 = happyReduce 8# 7# happyReduction_37
-happyReduction_37 (happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenName happy_var_2) -> 
-	case happyOut5 happy_x_4 of { happy_var_4 -> 
-	case happyOut11 happy_x_6 of { happy_var_6 -> 
-	case happyOut11 happy_x_8 of { happy_var_8 -> 
-	happyIn11
-		 (Let happy_var_2 happy_var_4 happy_var_6 happy_var_8
-	) `HappyStk` happyRest}}}}
-
-happyReduce_38 = happySpecReduce_3  7# happyReduction_38
-happyReduction_38 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn11
-		 (Let (MN "unused" 0) TyUnit happy_var_1 happy_var_3
-	)}}
-
-happyReduce_39 = happyReduce 6# 7# happyReduction_39
-happyReduction_39 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut11 happy_x_4 of { happy_var_4 -> 
-	case happyOut11 happy_x_6 of { happy_var_6 -> 
-	happyIn11
-		 (If happy_var_2 happy_var_4 happy_var_6
-	) `HappyStk` happyRest}}}
-
-happyReduce_40 = happyReduce 6# 7# happyReduction_40
-happyReduction_40 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	case happyOut11 happy_x_5 of { happy_var_5 -> 
-	happyIn11
-		 (While happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}
-
-happyReduce_41 = happyReduce 8# 7# happyReduction_41
-happyReduction_41 (happy_x_8 `HappyStk`
-	happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_3 of { happy_var_3 -> 
-	case happyOut11 happy_x_5 of { happy_var_5 -> 
-	case happyOut11 happy_x_7 of { happy_var_7 -> 
-	happyIn11
-		 (WhileAcc happy_var_3 happy_var_5 happy_var_7
-	) `HappyStk` happyRest}}}
-
-happyReduce_42 = happySpecReduce_1  7# happyReduction_42
-happyReduction_42 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (happy_var_1
-	)}
-
-happyReduce_43 = happySpecReduce_1  7# happyReduction_43
-happyReduction_43 happy_x_1
-	 =  case happyOut15 happy_x_1 of { happy_var_1 -> 
-	happyIn11
-		 (happy_var_1
-	)}
-
-happyReduce_44 = happySpecReduce_2  7# happyReduction_44
-happyReduction_44 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> 
-	happyIn11
-		 (Error happy_var_2
-	)}
-
-happyReduce_45 = happySpecReduce_1  7# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  happyIn11
-		 (Impossible
-	)
-
-happyReduce_46 = happyReduce 6# 7# happyReduction_46
-happyReduction_46 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut5 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (TokenString happy_var_3) -> 
-	case happyOut17 happy_x_5 of { happy_var_5 -> 
-	happyIn11
-		 (ForeignCall happy_var_2 happy_var_3 happy_var_5
-	) `HappyStk` happyRest}}}
-
-happyReduce_47 = happyReduce 7# 7# happyReduction_47
-happyReduction_47 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut5 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (TokenString happy_var_4) -> 
-	case happyOut17 happy_x_6 of { happy_var_6 -> 
-	happyIn11
-		 (LazyForeignCall happy_var_3 happy_var_4 happy_var_6
-	) `HappyStk` happyRest}}}
-
-happyReduce_48 = happyReduce 6# 8# happyReduction_48
-happyReduction_48 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut13 happy_x_5 of { happy_var_5 -> 
-	happyIn12
-		 (Case happy_var_2 happy_var_5
-	) `HappyStk` happyRest}}
-
-happyReduce_49 = happySpecReduce_0  9# happyReduction_49
-happyReduction_49  =  happyIn13
-		 ([]
-	)
-
-happyReduce_50 = happySpecReduce_1  9# happyReduction_50
-happyReduction_50 happy_x_1
-	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
-	happyIn13
-		 ([happy_var_1]
-	)}
-
-happyReduce_51 = happySpecReduce_3  9# happyReduction_51
-happyReduction_51 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
-	case happyOut13 happy_x_3 of { happy_var_3 -> 
-	happyIn13
-		 (happy_var_1:happy_var_3
-	)}}
-
-happyReduce_52 = happyReduce 7# 10# happyReduction_52
-happyReduction_52 (happy_x_7 `HappyStk`
-	happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> 
-	case happyOut10 happy_x_4 of { happy_var_4 -> 
-	case happyOut11 happy_x_7 of { happy_var_7 -> 
-	happyIn14
-		 (Alt happy_var_2 happy_var_4 happy_var_7
-	) `HappyStk` happyRest}}}
-
-happyReduce_53 = happySpecReduce_3  10# happyReduction_53
-happyReduction_53 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenInt happy_var_1) -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn14
-		 (ConstAlt happy_var_1 happy_var_3
-	)}}
-
-happyReduce_54 = happySpecReduce_3  10# happyReduction_54
-happyReduction_54 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn14
-		 (DefaultCase happy_var_3
-	)}
-
-happyReduce_55 = happySpecReduce_3  11# happyReduction_55
-happyReduction_55 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Plus happy_var_1 happy_var_3
-	)}}
-
-happyReduce_56 = happySpecReduce_3  11# happyReduction_56
-happyReduction_56 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Minus happy_var_1 happy_var_3
-	)}}
-
-happyReduce_57 = happySpecReduce_2  11# happyReduction_57
-happyReduction_57 happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_2 of { happy_var_2 -> 
-	happyIn15
-		 (Op Minus (Const (MkInt 0)) happy_var_2
-	)}
-
-happyReduce_58 = happySpecReduce_3  11# happyReduction_58
-happyReduction_58 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Times happy_var_1 happy_var_3
-	)}}
-
-happyReduce_59 = happySpecReduce_3  11# happyReduction_59
-happyReduction_59 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op Divide happy_var_1 happy_var_3
-	)}}
-
-happyReduce_60 = happySpecReduce_3  11# happyReduction_60
-happyReduction_60 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op ShL happy_var_1 happy_var_3
-	)}}
-
-happyReduce_61 = happySpecReduce_3  11# happyReduction_61
-happyReduction_61 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op ShR happy_var_1 happy_var_3
-	)}}
-
-happyReduce_62 = happySpecReduce_3  11# happyReduction_62
-happyReduction_62 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpLT happy_var_1 happy_var_3
-	)}}
-
-happyReduce_63 = happySpecReduce_3  11# happyReduction_63
-happyReduction_63 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpGT happy_var_1 happy_var_3
-	)}}
-
-happyReduce_64 = happySpecReduce_3  11# happyReduction_64
-happyReduction_64 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpLE happy_var_1 happy_var_3
-	)}}
-
-happyReduce_65 = happySpecReduce_3  11# happyReduction_65
-happyReduction_65 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpGE happy_var_1 happy_var_3
-	)}}
-
-happyReduce_66 = happySpecReduce_3  11# happyReduction_66
-happyReduction_66 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 (Op OpEQ happy_var_1 happy_var_3
-	)}}
-
-happyReduce_67 = happySpecReduce_0  12# happyReduction_67
-happyReduction_67  =  happyIn16
-		 ([]
-	)
-
-happyReduce_68 = happySpecReduce_1  12# happyReduction_68
-happyReduction_68 happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 ([happy_var_1]
-	)}
-
-happyReduce_69 = happySpecReduce_3  12# happyReduction_69
-happyReduction_69 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut16 happy_x_3 of { happy_var_3 -> 
-	happyIn16
-		 (happy_var_1:happy_var_3
-	)}}
-
-happyReduce_70 = happySpecReduce_0  13# happyReduction_70
-happyReduction_70  =  happyIn17
-		 ([]
-	)
-
-happyReduce_71 = happySpecReduce_3  13# happyReduction_71
-happyReduction_71 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	happyIn17
-		 ([(happy_var_1,happy_var_3)]
-	)}}
-
-happyReduce_72 = happyReduce 5# 13# happyReduction_72
-happyReduction_72 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut5 happy_x_3 of { happy_var_3 -> 
-	case happyOut17 happy_x_5 of { happy_var_5 -> 
-	happyIn17
-		 ((happy_var_1,happy_var_3):happy_var_5
-	) `HappyStk` happyRest}}}
-
-happyReduce_73 = happySpecReduce_1  14# happyReduction_73
-happyReduction_73 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenInt happy_var_1) -> 
-	happyIn18
-		 (MkInt happy_var_1
-	)}
-
-happyReduce_74 = happySpecReduce_1  14# happyReduction_74
-happyReduction_74 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenBigInt happy_var_1) -> 
-	happyIn18
-		 (MkBigInt happy_var_1
-	)}
-
-happyReduce_75 = happySpecReduce_1  14# happyReduction_75
-happyReduction_75 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenChar happy_var_1) -> 
-	happyIn18
-		 (MkChar happy_var_1
-	)}
-
-happyReduce_76 = happySpecReduce_1  14# happyReduction_76
-happyReduction_76 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenBool happy_var_1) -> 
-	happyIn18
-		 (MkBool happy_var_1
-	)}
-
-happyReduce_77 = happySpecReduce_1  14# happyReduction_77
-happyReduction_77 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenFloat happy_var_1) -> 
-	happyIn18
-		 (MkFloat happy_var_1
-	)}
-
-happyReduce_78 = happySpecReduce_1  14# happyReduction_78
-happyReduction_78 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenBigFloat happy_var_1) -> 
-	happyIn18
-		 (MkBigFloat happy_var_1
-	)}
-
-happyReduce_79 = happySpecReduce_1  14# happyReduction_79
-happyReduction_79 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (TokenString happy_var_1) -> 
-	happyIn18
-		 (MkString happy_var_1
-	)}
-
-happyReduce_80 = happySpecReduce_1  14# happyReduction_80
-happyReduction_80 happy_x_1
-	 =  happyIn18
-		 (MkUnit
-	)
-
-happyReduce_81 = happySpecReduce_1  14# happyReduction_81
-happyReduction_81 happy_x_1
-	 =  happyIn18
-		 (MkUnused
-	)
-
-happyReduce_82 = happyMonadReduce 0# 15# happyReduction_82
-happyReduction_82 (happyRest) tk
-	 = happyThen (( getLineNo)
-	) (\r -> happyReturn (happyIn19 r))
-
-happyReduce_83 = happyMonadReduce 0# 16# happyReduction_83
-happyReduction_83 (happyRest) tk
-	 = happyThen (( getFileName)
-	) (\r -> happyReturn (happyIn20 r))
-
-happyNewToken action sts stk
-	= lexer(\tk -> 
-	let cont i = happyDoAction i tk action sts stk in
-	case tk of {
-	TokenEOF -> happyDoAction 69# tk action sts stk;
-	TokenName happy_dollar_dollar -> cont 1#;
-	TokenString happy_dollar_dollar -> cont 2#;
-	TokenInt happy_dollar_dollar -> cont 3#;
-	TokenBigInt happy_dollar_dollar -> cont 4#;
-	TokenBool happy_dollar_dollar -> cont 5#;
-	TokenFloat happy_dollar_dollar -> cont 6#;
-	TokenBigFloat happy_dollar_dollar -> cont 7#;
-	TokenChar happy_dollar_dollar -> cont 8#;
-	TokenIntType -> cont 9#;
-	TokenBigIntType -> cont 10#;
-	TokenCharType -> cont 11#;
-	TokenBoolType -> cont 12#;
-	TokenFloatType -> cont 13#;
-	TokenBigFloatType -> cont 14#;
-	TokenStringType -> cont 15#;
-	TokenPtrType -> cont 16#;
-	TokenUnitType -> cont 17#;
-	TokenFunType -> cont 18#;
-	TokenDataType -> cont 19#;
-	TokenAnyType -> cont 20#;
-	TokenUnit -> cont 21#;
-	TokenCon -> cont 22#;
-	TokenDefault -> cont 23#;
-	TokenLet -> cont 24#;
-	TokenCase -> cont 25#;
-	TokenOf -> cont 26#;
-	TokenIf -> cont 27#;
-	TokenThen -> cont 28#;
-	TokenElse -> cont 29#;
-	TokenWhile -> cont 30#;
-	TokenUnused -> cont 31#;
-	TokenIn -> cont 32#;
-	TokenLazy -> cont 33#;
-	TokenStrict -> cont 34#;
-	TokenEffect -> cont 35#;
-	TokenForeign -> cont 36#;
-	TokenError -> cont 37#;
-	TokenImpossible -> cont 38#;
-	TokenOB -> cont 39#;
-	TokenCB -> cont 40#;
-	TokenOCB -> cont 41#;
-	TokenCCB -> cont 42#;
-	TokenOSB -> cont 43#;
-	TokenCSB -> cont 44#;
-	TokenPlus -> cont 45#;
-	TokenMinus -> cont 46#;
-	TokenTimes -> cont 47#;
-	TokenDivide -> cont 48#;
-	TokenEquals -> cont 49#;
-	TokenEQ -> cont 50#;
-	TokenLE -> cont 51#;
-	TokenGE -> cont 52#;
-	TokenShL -> cont 53#;
-	TokenShR -> cont 54#;
-	TokenLT -> cont 55#;
-	TokenGT -> cont 56#;
-	TokenColon -> cont 57#;
-	TokenProj -> cont 58#;
-	TokenSemi -> cont 59#;
-	TokenComma -> cont 60#;
-	TokenBar -> cont 61#;
-	TokenArrow -> cont 62#;
-	TokenCInclude -> cont 63#;
-	TokenExtern -> cont 64#;
-	TokenExport -> cont 65#;
-	TokenCType -> cont 66#;
-	TokenInclude -> cont 67#;
-	TokenInline -> cont 68#;
-	_ -> happyError' tk
-	})
-
-happyError_ tk = happyError' tk
-
-happyThen :: () => P a -> (a -> P b) -> P b
-happyThen = (thenP)
-happyReturn :: () => a -> P a
-happyReturn = (returnP)
-happyThen1 = happyThen
-happyReturn1 :: () => a -> P a
-happyReturn1 = happyReturn
-happyError' :: () => (Token) -> P a
-happyError' tk = (\token -> happyError) tk
-
-mkparse = happySomeParser where
-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut4 x))
-
-happySeq = happyDontSeq
-
-
-mkBind :: Name -> [Type] -> Type -> [Name] -> Expr -> Maybe String -> [CGFlag] -> Decl
-mkBind n tys ret ns expr export fl = Decl n ret (Bind (zip ns tys) 0 expr fl) export fl
-
-mkExtern :: Name -> [Type] -> Type -> [Name] -> Decl
-mkExtern n tys ret ns = Extern n ret tys
-
-parse :: String -> FilePath -> Result [Decl]
-parse s fn = mkparse s fn 1
-
-parseFile :: FilePath -> IO (Result [Decl])
-parseFile fn = do s <- readFile fn
-                  let x = parse s fn
-                  return x
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command line>" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
-
-{-# LINE 28 "templates/GenericTemplate.hs" #-}
-
-
-data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
-
-
-
-
-
-{-# LINE 49 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 59 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 68 "templates/GenericTemplate.hs" #-}
-
-infixr 9 `HappyStk`
-data HappyStk a = HappyStk a (HappyStk a)
-
------------------------------------------------------------------------------
--- starting the parse
-
-happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
-
------------------------------------------------------------------------------
--- Accepting the parse
-
--- If the current token is 0#, it means we've just accepted a partial
--- parse (a %partial parser).  We must ignore the saved token on the top of
--- the stack in this case.
-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
-	happyReturn1 ans
-happyAccept j tk st sts (HappyStk ans _) = 
-	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
-
------------------------------------------------------------------------------
--- Arrays only: do the next action
-
-
-
-happyDoAction i tk st
-	= {- nothing -}
-
-
-	  case action of
-		0#		  -> {- nothing -}
-				     happyFail i tk st
-		-1# 	  -> {- nothing -}
-				     happyAccept i tk st
-		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
-
-				     (happyReduceArr Happy_Data_Array.! rule) i tk st
-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
-		n		  -> {- nothing -}
-
-
-				     happyShift new_state i tk st
-				     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
-   where off    = indexShortOffAddr happyActOffsets st
-	 off_i  = (off Happy_GHC_Exts.+# i)
-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
-			else False
- 	 action | check     = indexShortOffAddr happyTable off_i
-		| otherwise = indexShortOffAddr happyDefActions st
-
-{-# LINE 127 "templates/GenericTemplate.hs" #-}
-
-
-indexShortOffAddr (HappyA# arr) off =
-#if __GLASGOW_HASKELL__ > 500
-	Happy_GHC_Exts.narrow16Int# i
-#elif __GLASGOW_HASKELL__ == 500
-	Happy_GHC_Exts.intToInt16# i
-#else
-	Happy_GHC_Exts.iShiftRA# (Happy_GHC_Exts.iShiftL# i 16#) 16#
-#endif
-  where
-#if __GLASGOW_HASKELL__ >= 503
-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
-#else
-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.shiftL# high 8#) low)
-#endif
-	high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
-	low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
-	off' = off Happy_GHC_Exts.*# 2#
-
-
-
-
-
-data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
-
-
-
-
------------------------------------------------------------------------------
--- HappyState data type (not arrays)
-
-{-# LINE 170 "templates/GenericTemplate.hs" #-}
-
------------------------------------------------------------------------------
--- Shifting a token
-
-happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in
---     trace "shifting the error token" $
-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
-
-happyShift new_state i tk st sts stk =
-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
-
--- happyReduce is specialised for the common cases.
-
-happySpecReduce_0 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_0 nt fn j tk st@((action)) sts stk
-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
-
-happySpecReduce_1 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
-     = let r = fn v1 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_2 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
-     = let r = fn v1 v2 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_3 i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
-     = let r = fn v1 v2 v3 in
-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
-
-happyReduce k i fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyReduce k nt fn j tk st sts stk
-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of
-	 sts1@((HappyCons (st1@(action)) (_))) ->
-        	let r = fn stk in  -- it doesn't hurt to always seq here...
-       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
-
-happyMonadReduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonadReduce k nt fn j tk st sts stk =
-        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
-       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
-
-happyMonad2Reduce k nt fn 0# tk st sts stk
-     = happyFail 0# tk st sts stk
-happyMonad2Reduce k nt fn j tk st sts stk =
-       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
-       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
-             drop_stk = happyDropStk k stk
-
-             off    = indexShortOffAddr happyGotoOffsets st1
-             off_i  = (off Happy_GHC_Exts.+# nt)
-             new_state = indexShortOffAddr happyTable off_i
-
-
-
-
-happyDrop 0# l = l
-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
-
-happyDropStk 0# l = l
-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs
-
------------------------------------------------------------------------------
--- Moving to a new state after a reduction
-
-
-happyGoto nt j tk st = 
-   {- nothing -}
-   happyDoAction j tk new_state
-   where off    = indexShortOffAddr happyGotoOffsets st
-	 off_i  = (off Happy_GHC_Exts.+# nt)
- 	 new_state = indexShortOffAddr happyTable off_i
-
-
-
-
------------------------------------------------------------------------------
--- Error recovery (0# is the error token)
-
--- parse error if we are in recovery and we fail again
-happyFail  0# tk old_st _ stk =
---	trace "failing" $ 
-    	happyError_ tk
-
-{-  We don't need state discarding for our restricted implementation of
-    "error".  In fact, it can cause some bogus parses, so I've disabled it
-    for now --SDM
-
--- discard a state
-happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
-						(saved_tok `HappyStk` _ `HappyStk` stk) =
---	trace ("discarding state, depth " ++ show (length stk))  $
-	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
--}
-
--- Enter error recovery: generate an error token,
---                       save the old token and carry on.
-happyFail  i tk (action) sts stk =
---      trace "entering error recovery" $
-	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
-
--- Internal happy errors:
-
-notHappyAtAll = error "Internal Happy error\n"
-
------------------------------------------------------------------------------
--- Hack to get the typechecker to accept our action functions
-
-
-happyTcHack :: Happy_GHC_Exts.Int# -> a -> a
-happyTcHack x y = y
-{-# INLINE happyTcHack #-}
-
-
------------------------------------------------------------------------------
--- Seq-ing.  If the --strict flag is given, then Happy emits 
---	happySeq = happyDoSeq
--- otherwise it emits
--- 	happySeq = happyDontSeq
-
-happyDoSeq, happyDontSeq :: a -> b -> b
-happyDoSeq   a b = a `seq` b
-happyDontSeq a b = b
-
------------------------------------------------------------------------------
--- Don't inline any functions from the template.  GHC has a nasty habit
--- of deciding to inline happyGoto everywhere, which increases the size of
--- the generated parser quite a bit.
-
-
-{-# NOINLINE happyDoAction #-}
-{-# NOINLINE happyTable #-}
-{-# NOINLINE happyCheck #-}
-{-# NOINLINE happyActOffsets #-}
-{-# NOINLINE happyGotoOffsets #-}
-{-# NOINLINE happyDefActions #-}
-
-{-# NOINLINE happyShift #-}
-{-# NOINLINE happySpecReduce_0 #-}
-{-# NOINLINE happySpecReduce_1 #-}
-{-# NOINLINE happySpecReduce_2 #-}
-{-# NOINLINE happySpecReduce_3 #-}
-{-# NOINLINE happyReduce #-}
-{-# NOINLINE happyMonadReduce #-}
-{-# NOINLINE happyGoto #-}
-{-# NOINLINE happyFail #-}
-
--- end of Happy Template.
diff --git a/epic.cabal b/epic.cabal
--- a/epic.cabal
+++ b/epic.cabal
@@ -1,5 +1,5 @@
 Name:		epic
-Version:	0.1.5
+Version:	0.1.7
 Author:		Edwin Brady
 License:	BSD3
 License-file:	LICENSE
@@ -16,10 +16,10 @@
                 (<http://www.cs.st-and.ac.uk/~eb/Idris>).
 	        It can be invoked either as a library or an application.
 
-Data-files:    evm/libevm.a evm/closure.h evm/stdfuns.h evm/stdfuns.c evm/mainprog.c 
-Extra-source-files: evm/closure.c evm/closure.h evm/stdfuns.h evm/mainprog.c evm/stdfuns.c evm/Makefile 
+Data-files:    evm/libevm.a evm/closure.h evm/stdfuns.h evm/stdfuns.c evm/mainprog.c evm/emalloc.h evm/gc_header.h
+Extra-source-files: evm/closure.c evm/closure.h evm/stdfuns.h evm/mainprog.c evm/stdfuns.c evm/Makefile evm/emalloc.c evm/emalloc.h evm/gc_header.h
 
-Cabal-Version:  >= 1.2.3
+Cabal-Version:  >= 1.8.0.4
 Build-type:     Custom
 
 Library
@@ -32,8 +32,7 @@
 
 Executable     epic
                Main-is: Main.lhs
-               Other-modules: Epic.Bytecode Epic.Parser Epic.Scopecheck
-                              Epic.Language Epic.Lexer Epic.CodegenC
-                              Epic.OTTLang Epic.Simplify Paths_epic
-               Build-depends:	base >=4 && <5, haskell98, mtl, Cabal, array, directory
+               hs-source-dirs: main
+               Other-modules: Paths_epic
+               Build-depends: base >=4 && <5, haskell98, Cabal, directory, epic
 
diff --git a/evm/Makefile b/evm/Makefile
--- a/evm/Makefile
+++ b/evm/Makefile
@@ -1,7 +1,7 @@
 CC = gcc
 #CFLAGS = -Wall -g
-CFLAGS = -Wall -O3
-OBJS = closure.o stdfuns.o
+CFLAGS = -Wall -O3 -DUSE_BOEHM
+OBJS = closure.o stdfuns.o emalloc.o
 INSTALLDIR = ${PREFIX}/lib/evm
 
 TARGET = libevm.a
@@ -19,5 +19,6 @@
 clean:
 	rm -f ${OBJS} ${TARGET}
 
-closure.o : closure.h
-stdfuns.o : stdfuns.h closure.h
+closure.o : closure.h emalloc.h
+stdfuns.o : stdfuns.h closure.h emalloc.h
+emalloc.o : closure.h emalloc.h
diff --git a/evm/closure.c b/evm/closure.c
--- a/evm/closure.c
+++ b/evm/closure.c
@@ -1,4 +1,6 @@
 #include "closure.h"
+#include "emalloc.h"
+
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
@@ -7,6 +9,14 @@
 
 VAL one;
 VAL* zcon;
+int v_argc;
+VAL* v_argv;
+
+ALLOCATOR allocate;
+REALLOCATOR reallocate;
+pool_t** pools = NULL;
+pool_t* pool = NULL;
+
 //void* blob = NULL;
 //int blobnext = 0;
 
@@ -96,6 +106,177 @@
     if (!ISINT(c)) { dumpClosure(c); assert(0); }
 }
 
+void* pool_malloc(size_t size) {
+    if ((size & 7)!=0) {
+	size = 8 + ((size >> 3) << 3);
+    }
+    *((size_t*)(pool->block_loc)) = size;
+    void* mem = (void*)(((size_t*)(pool->block_loc))+2);
+    pool->block_loc = pool->block_loc+size+sizeof(size_t)*2;
+
+    return mem;
+}
+
+void* pool_realloc(void* ptr, size_t size) {
+    if ((size & 7)!=0) {
+	size = 8 + ((size >> 3) << 3);
+    }
+    *((size_t*)(pool->block_loc)) = size;
+    void* mem = (void*)(((size_t*)(pool->block_loc))+2);
+    pool->block_loc = pool->block_loc+size+sizeof(size_t)*2;
+
+    size_t orig_size = *(((size_t*)ptr)-2);
+    memcpy(mem, ptr, orig_size);
+
+    return mem;
+}
+
+void* pool_grow_malloc(size_t size) {
+    // TODO: if we're out of space, make a new pool, with a pointer to
+    // the old pool so we can free it when we're ready.
+
+    if ((size & 7)!=0) {
+	size = 8 + ((size >> 3) << 3);
+    }
+    *((size_t*)(pool->block_loc)) = size;
+    void* mem = (void*)(((size_t*)(pool->block_loc))+2);
+    pool->block_loc = pool->block_loc+size+sizeof(size_t)*2;
+
+    return mem;
+}
+
+void* pool_grow_realloc(void* ptr, size_t size) {
+    if ((size & 7)!=0) {
+	size = 8 + ((size >> 3) << 3);
+    }
+    *((size_t*)(pool->block_loc)) = size;
+    void* mem = (void*)(((size_t*)(pool->block_loc))+2);
+    pool->block_loc = pool->block_loc+size+sizeof(size_t)*2;
+
+    size_t orig_size = *(((size_t*)ptr)-2);
+    memcpy(mem, ptr, orig_size);
+
+    return mem;
+}
+
+void freePool(pool_t* pool)
+{
+    free(pool->block);
+    if (pool->grow!=NULL) {
+	freePool((pool_t*)(pool->grow));
+    }
+    free(pool);
+}
+
+
+VAL copyFun(fun* f, pool_t* oldpool) {
+    VAL c = EMALLOC(sizeof(Closure)+sizeof(fun));
+    fun* fn = (fun*)(c+1);
+    fn->fn = f->fn;
+    fn->arity = f->arity;
+    int args = f->arg_end - f->args;
+    fn->args = MKARGS(args);
+    fn->arg_end = fn->args + args;
+    void** p = fn->args;
+    void** a;
+
+    for(a = f->args; a < f->arg_end; ++a, ++p) {
+	*p = copy((VAL)(*a), oldpool);
+    }
+    
+    SETTY(c, FUN);
+    c->info = (void*)fn;
+    EREADY(c);
+    return c;
+}
+
+VAL copyThunk(thunk* t, pool_t* oldpool) {
+    VAL c = EMALLOC(sizeof(Closure)+sizeof(fun));
+    thunk* fn = (thunk*)(c+1);
+    
+    fn->fn = t->fn;
+    fn->args = MKARGS(t->numargs);
+    fn->numargs = t->numargs;
+
+    void** a = t->args;
+    void** p = fn->args;
+    int i;
+
+    for(i=0; i < t->numargs; ++i, ++a, ++p) {
+	*p = copy((VAL)(*a), oldpool);
+    }
+
+    SETTY(c,THUNK);
+    c->info = (void*)fn;
+    EREADY(c);
+    return c;
+}
+
+VAL copyCon(con* c, pool_t* oldpool) {
+    int arity = c->tag >> 16;
+//    printf("COPY CON %d %d\n", c->tag & 65535, arity);
+
+    VAL nc = EMALLOC(sizeof(Closure)+sizeof(con));
+    con* cn = (con*)(nc+1);
+
+    cn->tag = c->tag;
+    cn->args = MKARGS(arity);
+    
+    void** a = c->args;
+    void** p = cn->args;
+    int i;
+
+    for(i=0; i<arity; ++i, ++a, ++p) {
+//	printf("COPY ARG %d\n", *a);
+	*p = copy((VAL)(*a), oldpool);
+    }
+
+    SETTY(nc, CON);
+    nc->info = (void*)cn;
+    EREADY(nc);
+    return nc;
+}
+
+
+// TODO: Preserve sharing. But this function isn't really intended for that
+// sort of thing.
+
+VAL copy(VAL x, pool_t* oldpool) {
+    // only copy things that were allocated in the given pool.
+    // TODO: also need to check whether it was allocated in pool->grow
+
+    if (x>=(VAL)(oldpool->block) && x<(VAL)(oldpool->block_end)) {
+	switch(GETTY(x)) {
+	case FUN:
+	    return copyFun((fun*)x->info, oldpool);
+	case THUNK:
+	    return copyThunk((thunk*)x->info, oldpool);
+	case CON:
+	    return copyCon((con*)x->info, oldpool);
+	case INT:
+	    return x;
+	case BIGINT:
+	    return MKBIGINT((mpz_t*)(x->info));
+	case FLOAT:
+	    return MKFLOAT(*((double*)x->info));
+	case BIGFLOAT:
+	    assert(0); // NOT IMPLEMENTED YET
+	case STRING:
+	    return MKSTR((char*)x->info);
+	case UNIT:
+	    return MKUNIT;
+	case PTR:
+	    return MKPTR(x->info);
+	case FREEVAR:
+	    assert(0); // NOT IMPLEMENTED
+	}
+	return x;
+    }
+    else {
+	return x;
+    }
+}
+
 inline VAL CLOSURE(func x, int arity, int args, void** block)
 {
     VAL c = EMALLOC(sizeof(Closure)+sizeof(fun)); // MKCLOSURE;
@@ -158,6 +339,7 @@
     SETTY(c,CON);
     c->info = (void*)cn;
     EREADY(c);
+
     return c;
 }
 
@@ -702,6 +884,21 @@
     return c;
 }
 
+void* MKFLOAT(double f)
+{
+    VAL c = EMALLOC(sizeof(Closure)+sizeof(double));
+    double* num = (double*)(c+1);
+    *num = f;
+
+    SETTY(c, FLOAT);
+    c->info = (void*)num;
+    EREADY(c);
+
+    return c;
+}
+
+
+
 /*
 int GETINT(void* x)
 {
@@ -711,9 +908,13 @@
 
 mpz_t* GETBIGINT(void* x)
 {
-    return ((mpz_t*)(((VAL)x)->info));
+    return (mpz_t*)(((VAL)x)->info);
 }
 
+double GETFLOAT(void* x)
+{
+    return *((double*)(((VAL)x)->info));
+}
 
 void* MKSTR(char* x)
 {
@@ -760,8 +961,29 @@
     return c;
 }
 
-void init_evm()
+VAL evm_getArg(int i) {
+    if (i>=0 && i<v_argc) 
+	return v_argv[i];
+    else
+	return MKSTR("");
+}
+
+int evm_numArgs() {
+    return v_argc;
+}
+
+VMState* init_evm(int argc, char* argv[])
 {
+    allocate = GC_malloc;
+    reallocate = GC_realloc;
+
+    pools = malloc(sizeof(pool_t*)*1024);
+    pool = malloc(sizeof(pool_t));
+    *pools = pool;
+    pool->block = NULL;
+    pool->allocate = GC_malloc;
+    pool->reallocate = GC_realloc;
+
     int i;
     one = MKINT(1);
     zcon = EMALLOC(sizeof(Closure)*255);
@@ -769,4 +991,35 @@
 	zcon[i] = CONSTRUCTORn(i,0,0);
     }
     EREADY(zcon);
+
+    v_argc = argc;
+    v_argv = EMALLOC(sizeof(Closure)*v_argc);
+
+    for(i=0;i<=argc;++i) {
+	v_argv[i] = MKSTR(argv[i]);
+    }
+    EREADY(v_argv);
+
+/*
+    VMState* vm = malloc(sizeof(VMState));
+    vm->roots = malloc(sizeof(VAL)*1024);
+    vm->start_roots = vm->roots;
+
+    vm->from_space = malloc(INIT_HEAP_SIZE*2);
+    vm->to_space = malloc(INIT_HEAP_SIZE*2);
+    vm->nursery = malloc(INIT_HEAP_SIZE);
+    vm->heap_size = INIT_HEAP_SIZE;
+    vm->next_nursery = 0;
+    vm->next = 0;
+*/
+    return NULL;
+}
+
+void close_evm(VMState* vm)
+{
+    /*    free(vm->from_space);
+    free(vm->to_space);
+    free(vm->nursery);
+    free(vm->roots);
+    free(vm);*/
 }
diff --git a/evm/closure.h b/evm/closure.h
--- a/evm/closure.h
+++ b/evm/closure.h
@@ -1,14 +1,7 @@
 #ifndef _CLOSURE_H
 #define _CLOSURE_H
 
-# ifndef WIN32
-#  include <pthread.h>
-#  define GC_THREADS
-# else
-#  define GC_WIN32_THREADS
-# endif
-
-#include <gc/gc.h>
+#include "gc_header.h"
 
 //#include <emalloc.h>
 #include <gmp.h>
@@ -16,11 +9,54 @@
 #include <stdlib.h>
 #include <stdint.h>
 
-#define EMALLOC GC_malloc
+typedef void*(*ALLOCATOR)(size_t);
+typedef void*(*REALLOCATOR)(void*,size_t);
+
+typedef struct {
+    char* block;
+    char* block_loc;
+    char* block_end;
+    ALLOCATOR allocate;
+    REALLOCATOR reallocate;
+    void* grow;
+} pool_t;
+
+extern ALLOCATOR allocate;
+extern REALLOCATOR reallocate;
+extern pool_t** pools;
+extern pool_t* pool;
+
+#define EMALLOC(x) pool->allocate(x)
 #define EREADY(x) 
-#define EREALLOC GC_realloc
-#define EFREE GC_free
+#define EREALLOC(ptr,x) pool->reallocate(ptr,x)
+#define EFREE(x)
 
+// Add a new memory pool to the pool stack, using the fixed size pool
+// allocator
+#define NEWFIXEDPOOL(x) \
+    pool=malloc(sizeof(pool_t)); pools++; *pools = pool;		\
+    pool->allocate=pool_malloc;						\
+    pool->reallocate=pool_realloc;					\
+    pool->block = malloc(GETINT(x));					\
+    pool->block_loc = pool->block;					\
+    pool->block_end = pool->block+GETINT(x);				\
+    pool->grow = NULL;
+// Add a new memory pool to the pool stack, using the fixed size pool
+// allocator
+#define NEWGROWABLEPOOL(x) \
+    pool=malloc(sizeof(pool_t)); pools++; *pools = pool;		\
+    pool->allocate=pool_grow_malloc;					\
+    pool->reallocate=pool_grow_realloc;					\
+    pool->block = malloc(GETINT(x));					\
+    pool->block_loc = pool->block;					\
+    pool->block_end = pool->block+GETINT(x);
+// Go back to the previous pool, copying the value x into it
+#define CLEARPOOL(x)							\
+    pools--;								\
+    pool = *pools;							\
+    x=copy(x, *(pools+1));						\
+    freePool(*(pools+1));
+
 typedef intptr_t eint;
 
 //#define EMALLOC malloc
@@ -34,6 +70,8 @@
 #define MKUNIT (void*)0
 
 #define INTOP(op,x,y) MKINT((((eint)x)>>1) op (((eint)y)>>1))
+#define FLOATOP(op,x,y) MKFLOAT(((GETFLOAT(x)) op (GETFLOAT(y))))
+#define FLOATBOP(op,x,y) MKINT(((GETFLOAT(x)) op (GETFLOAT(y))))
 #define ADD(x,y) (void*)(((eint)x)+(((eint)y)-1))
 #define MULT(x,y) (MKINT((((eint)x)>>1) * (((eint)y)>>1)))
 #define CHECKEVALUATED(x) if(ISFUN(x) || ISTHUNK(x) \
@@ -100,6 +138,33 @@
     void** args;
 } con;
 
+typedef struct {
+    VAL* roots;
+    VAL* start_roots;
+    VAL* from_space;
+    VAL* to_space;
+    VAL* nursery;
+
+    int heap_size;
+    int next;
+    int next_nursery;
+} VMState;
+
+extern void* e_malloc(VMState* vm, size_t size);
+extern void* e_realloc(VMState* vm, void* ptr, size_t size);
+
+// Allocate from a non-GCed region
+void* pool_malloc(size_t size);
+void* pool_realloc(void* ptr, size_t size);
+void* pool_grow_malloc(size_t size);
+void* pool_grow_realloc(void* ptr, size_t size);
+// Copy value from the given pool into the currently active region
+VAL copy(VAL x, pool_t* pool);
+
+void freePool(pool_t* pool);
+
+#define INIT_HEAP_SIZE 1000000
+
 #define UPDATE(x,res) if (ISINT(res)) { x = MKINT(GETINT(res)); } else { \
                       SETTY(x, GETTY(res)); x->info=res->info; }
 #define TAG(x) (((con*)((Closure*)x)->info)->tag & 65535)
@@ -173,11 +238,21 @@
 // array of zero arity constructors. We don't need more than one of each...
 extern VAL* zcon;
 
+// Roots for the garbage collector
+extern VMState* vm;
+
 #define MKINT(x) ((void*)((x)<<1)+1)
 #define GETINT(x) ((eint)(x)>>1)
 #define GETPTR(x) ((void*)(((VAL)(x))->info))
 #define GETSTR(x) ((char*)(((VAL)(x))->info))
 
+#define GROWROOT 
+// VAL* rootbase = vm->roots;
+#define ADDROOT(v) 
+// *(vm->roots)=v; vm->roots++;
+#define DROPROOTS 
+// vm->roots=rootbase;
+
 #define INTTOEINT(x) ((eint)(x))
 #define EINTTOINT(x) ((int)(x))
 
@@ -187,11 +262,13 @@
 
 void* MKSTR(char* str);
 void* MKPTR(void* ptr);
+void* MKFLOAT(double x);
 
 // Get values from a closure
 //int GETINT(void* x);
 
 mpz_t* GETBIGINT(void* x);
+double GETFLOAT(void* x);
 //void* GETPTR(void* x);
 
 void* MKFREE(int x);
@@ -199,8 +276,12 @@
 // Exit with fatal error
 void ERROR(char* msg);
 
+VAL evm_getArg(int i);
+int evm_numArgs();
+
 // Initialise everything
-void init_evm();
+VMState* init_evm(int argc, char* argv[]);
+void close_evm(VMState* vm);
 
 void* FASTMALLOC(int size);
 
diff --git a/evm/emalloc.c b/evm/emalloc.c
new file mode 100644
--- /dev/null
+++ b/evm/emalloc.c
@@ -0,0 +1,21 @@
+#include "emalloc.h"
+
+// TMP
+
+// Also make tmps roots when assigned to. Make enough room with GROWROOTS
+
+// When copying, make sure that the addresses stored at the roots are updated.
+
+// Actually, should the root set be the addresses of the local variables? Then
+// when they are copied, they can be updated with the new location.
+
+extern ALLOCATOR allocate;
+extern REALLOCATOR reallocate;
+
+void* e_malloc(VMState* vm, size_t size) {
+    return (VAL)allocate(size);
+}
+
+void* e_realloc(VMState* vm, void* ptr, size_t size) {
+    return (VAL)reallocate(ptr, size);
+}
diff --git a/evm/emalloc.h b/evm/emalloc.h
new file mode 100644
--- /dev/null
+++ b/evm/emalloc.h
@@ -0,0 +1,9 @@
+#ifndef _EMALLOC_H
+#define _EMALLOC_H
+
+#include "closure.h"
+
+void* e_malloc(VMState* vm, size_t size);
+void* e_realloc(VMState* vm, void* ptr, size_t size);
+
+#endif
diff --git a/evm/gc_header.h b/evm/gc_header.h
new file mode 100644
--- /dev/null
+++ b/evm/gc_header.h
@@ -0,0 +1,12 @@
+#ifdef USE_BOEHM
+
+# ifndef WIN32
+#  include <pthread.h>
+#  define GC_THREADS
+# else
+#  define GC_WIN32_THREADS
+# endif
+
+#include <gc/gc.h>
+
+#endif
diff --git a/evm/libevm.a b/evm/libevm.a
Binary files a/evm/libevm.a and b/evm/libevm.a differ
diff --git a/evm/mainprog.c b/evm/mainprog.c
--- a/evm/mainprog.c
+++ b/evm/mainprog.c
@@ -1,22 +1,19 @@
-# ifndef WIN32
-#  include <pthread.h>
-#  define GC_THREADS
-# else
-#  define GC_WIN32_THREADS
-# endif
-
+#include <gc_header.h>
 #include "closure.h"
 
 void* _do__U_main();
 
 void** _epic_top_of_stack;
 
+VMState* vm;
+
 int main(int argc, char* argv[]) {
     void* stacktop = NULL;
     _epic_top_of_stack = (void**)&stacktop;
 
     GC_init();
-    init_evm();
+    vm = init_evm(argc, argv);
+
 //    GC_use_entire_heap = 1;
 //    GC_free_space_divisor = 2;
 //    GC_enable_incremental();
@@ -31,10 +28,19 @@
 
     _do___U__main();
 
-    GC_gcollect();
+//    GC_gcollect();
 /*    fprintf(stderr, "%d\n", GC_gc_no);
     fprintf(stderr, "Heap: %d\n", GC_get_heap_size());
     fprintf(stderr, "Free: %d\n", GC_get_free_bytes());
     fprintf(stderr, "Total: %d\n", GC_get_total_bytes());*/
+
+/*
+    if (vm->start_roots!=vm->roots) {
+	fprintf(stderr, "Warning: roots left %d\n", vm->roots-vm->start_roots);
+    }
+*/
+
+    close_evm(vm);
+
     return 0; 
 }
diff --git a/evm/stdfuns.c b/evm/stdfuns.c
--- a/evm/stdfuns.c
+++ b/evm/stdfuns.c
@@ -11,10 +11,13 @@
 void printBigInt(mpz_t x) { printf("%s\n",mpz_get_str(NULL,10,x)); }
 
 void epicGC() {
+#ifdef USE_BOEHM
     GC_gcollect();
+#endif
 }
 
 void epicMemInfo() {
+#ifdef USE_BOEHM
     GC_gcollect();
     int heap = GC_get_heap_size();
     int free = GC_get_free_bytes();
@@ -23,6 +26,7 @@
     printf("Heap size %d\n", heap);
     printf("Heap used %d\n", heap-free);
     printf("Total allocations %d\n", total);
+#endif
 }
 
 int readInt() {
@@ -47,8 +51,11 @@
     FILE* f = (FILE*)h;
     fgets(bufin,128,f);
     int len = strlen(bufin);
-
+#ifdef USE_BOEHM
     VAL c = GC_MALLOC_ATOMIC(sizeof(Closure)+len*sizeof(char)+sizeof(char)+1);
+#else
+    VAL c = EMALLOC(sizeof(Closure)+len*sizeof(char)+sizeof(char)+1);
+#endif   
     SETTY(c, STRING);
     c->info = ((void*)(c+1));
     char *buf = (char*)(c->info);
@@ -84,6 +91,20 @@
     return buf;
 }
 
+double strToFloat(char* str)
+{
+//    printf("%s, %f\n",str, strtod(str,NULL));
+    return strtod(str,NULL);
+}
+
+char* floatToStr(double x)
+{
+//    printf("%f\n",x);
+    char* buf = EMALLOC(32);
+    sprintf(buf,"%g",x);
+    return buf;
+}
+
 void* getNative(void * fn) {
     return fn;
 }
@@ -112,6 +133,34 @@
     return buf;
 }
 
+char* strrev(char* str) {
+    char* buf = EMALLOC((1+strlen(str))*sizeof(char));
+    int x = strlen(str);
+    buf[x+1]='\0';
+    int y = 0; 
+    while(x>0) {
+	buf[y++] = str[--x];
+    }
+    return buf;
+}
+
+char* substr(char* str, int start, int len) {
+    if (len<0) len=0;
+    char* buf = EMALLOC((len+1)*sizeof(char));
+    strncpy(buf, str+start, len);
+    buf[len]='\0';
+    return buf;
+}
+
+int strFind(char* str, char c) {
+    int i = 0;
+    while(*str!='\0') {
+	if (*str==c) return i;
+	++i; ++str;
+    }
+    return -1;
+}
+
 char* append(char* x, char* y) {
     char* buf = EMALLOC((strlen(x)+strlen(y))*sizeof(char));
     strcpy(buf,x);
@@ -337,4 +386,16 @@
 
 int isNull(void* ptr) {
     return ptr==NULL;
+}
+
+// Command line arguments
+
+int epic_numArgs()
+{
+    return evm_numArgs();
+}
+
+char* epic_getArg(int i)
+{
+    return GETSTR(evm_getArg(i));
 }
diff --git a/evm/stdfuns.h b/evm/stdfuns.h
--- a/evm/stdfuns.h
+++ b/evm/stdfuns.h
@@ -36,6 +36,9 @@
 
 int isNull(void* ptr);
 
+int epic_numArgs();
+char* epic_getArg(int i);
+
 // IORefs
 int newRef();
 void* readRef(int r);
@@ -53,6 +56,9 @@
 int strToInt(char* str);
 char* intToStr(int x);
 
+double strToFloat(char* str);
+char* floatToStr(double x);
+
 mpz_t* strToBigInt(char* str);
 char* bigIntToStr(mpz_t x);
 
@@ -65,6 +71,10 @@
 int strHead(char* str);
 char* strTail(char* str);
 char* strCons(int h, char* str);
+char* strrev(char* str);
+char* substr(char* str, int start, int len);
+int strFind(char* str, char c);
+
 char* append(char* x, char* y);
 
 // Big integer arithmetic
diff --git a/main/Main.lhs b/main/Main.lhs
new file mode 100644
--- /dev/null
+++ b/main/Main.lhs
@@ -0,0 +1,148 @@
+> module Main where
+
+> import System
+> import System.Directory
+> import System.Environment
+> import System.IO
+> import Distribution.Version
+> import Monad
+
+> import Epic.Compiler
+> import Paths_epic
+
+> versionString = showV (versionBranch version)
+>   where
+>     showV [] = ""
+>     showV [a] = show a
+>     showV (x:xs) = show x ++ "." ++ showV xs
+
+> main = do args <- getArgs
+>           (fns, opts) <- getInput args
+>           outfile <- getOutput opts
+>           ofiles <- compileFiles fns (mkOpts opts)
+>           copts <- getCOpts opts
+>           extras <- getExtra opts
+>           if ((length ofiles) > 0 && (not (elem Obj opts)))
+>              then link (ofiles ++ copts) extras outfile (not (elem ExtMain opts)) (mkOpts opts)
+>              else return ()
+>   where mkOpts (KeepInt:xs) = KeepC:(mkOpts xs)
+>         mkOpts (TraceOn:xs) = Trace:(mkOpts xs)
+>         mkOpts (Header f:xs) = MakeHeader f:(mkOpts xs)
+>         mkOpts (DbgInfo:xs) = Debug:(mkOpts xs)
+>         mkOpts (CheckLvl i:xs) = Checking i:(mkOpts xs)
+>         mkOpts (_:xs) = mkOpts xs
+>         mkOpts [] = []
+
+> compileFiles [] _ = return []
+> compileFiles (fn:xs) opts
+>     | isDotE fn = do
+>        let ofile = getRoot fn ++ ".o"
+>        compileOpts fn ofile (Just (getRoot fn ++ ".ei")) opts
+>        rest <- compileFiles xs opts
+>        return (ofile:rest)
+>     | isDotO fn = do
+>        rest <- compileFiles xs opts
+>        return (fn:rest)
+>     | otherwise = do -- probably autogenerated, just build it.
+>        let ofile = fn ++ ".o"
+>        compileOpts fn ofile Nothing opts
+>        rest <- compileFiles xs opts
+>        return (ofile:rest)
+
+> isDotE ('.':'e':[]) = True
+> isDotE (_:xs) = isDotE xs
+> isDotE [] = False
+
+> isDotC ('.':'c':[]) = True
+> isDotC (_:xs) = isDotC xs
+> isDotC [] = False
+
+> isDotO ('.':'o':[]) = True
+> isDotO (_:xs) = isDotO xs
+> isDotO [] = False
+
+> mkExecname fn = case span (/='.') fn of
+>     (stem,".e") -> stem
+>     (stem,_) -> fn ++ ".exe"
+
+> getRoot fn = case span (/='.') fn of
+>     (stem,_) -> stem
+
+> getInput :: [String] -> IO ([FilePath],[Option])
+> getInput args = do let opts = parseArgs args
+>                    processFlags opts False
+>                    fns <- getFile opts
+>                    if (length fns == 0) 
+>                       then do showUsage
+>                               return (fns,opts)
+>                       else return (fns,opts)
+
+> showUsage = do putStrLn $ "Epigram Supercombinator Compiler version " ++ versionString
+>                putStrLn "Usage:\n\tepic <input file> [options]"
+>                exitWith (ExitFailure 1)
+
+> data Option = KeepInt -- Don't delete intermediate file
+>             | TraceOn -- Trace while running (debug option)
+>             | Obj -- Just make the .o, don't link
+>             | File String -- File to send the compiler
+>             | Output String -- Output filename
+>             | Header String -- Header output filename
+>             | ExtraInc String -- extra files to inlude
+>             | COpt String -- option to send straight to gcc
+>             | ExtMain -- external main (i.e. in a .o)
+>             | CFlags -- output include flags
+>             | LibFlags -- output linker flags
+>             | DbgInfo -- generate debug info
+>             | CheckLvl Int -- Checking level, 0 for none, default none
+>   deriving Eq
+
+> parseArgs :: [String] -> [Option]
+> parseArgs [] = []
+> parseArgs ("-keepc":args) = KeepInt:(parseArgs args)
+> parseArgs ("-trace":args) = TraceOn:(parseArgs args)
+> parseArgs ("-c":args) = Obj:(parseArgs args)
+> parseArgs ("-extmain":args) = ExtMain:(parseArgs args)
+> parseArgs ("-o":name:args) = (Output name):(parseArgs args)
+> parseArgs ("-h":name:args) = (Header name):(parseArgs args)
+> parseArgs ("-i":inc:args) = (ExtraInc inc):(parseArgs args)
+> parseArgs ("-includedirs":args) = CFlags:(parseArgs args)
+> parseArgs ("-libdirs":args) = LibFlags:(parseArgs args)
+> parseArgs ("-g":args) = DbgInfo:(parseArgs args)
+> parseArgs ("-checking":lvl:args) = CheckLvl (read lvl):(parseArgs args)
+> parseArgs (('$':x):args) = (COpt (x ++ concat (map (" "++) args))):[]
+> parseArgs (('-':x):args) = (COpt x):(parseArgs args)
+> parseArgs (x:args) = (File x):(parseArgs args)
+
+> getFile :: [Option] -> IO [FilePath]
+> getFile ((File x):xs) = do fns <- getFile xs
+>                            return (x:fns)
+> getFile (_:xs) = getFile xs
+> getFile [] = return []
+
+> getOutput :: [Option] -> IO FilePath
+> getOutput ((Output fn):xs) = return fn
+> getOutput (_:xs) = getOutput xs
+> getOutput [] = return "a.out"
+
+> getCOpts :: [Option] -> IO [String]
+> getCOpts ((COpt x):xs) = do fns <- getCOpts xs
+>                             return (x:fns)
+> getCOpts (_:xs) = getCOpts xs
+> getCOpts [] = return []
+
+> getExtra :: [Option] -> IO [String]
+> getExtra ((ExtraInc x):xs) = do fns <- getExtra xs
+>                                 return (x:fns)
+> getExtra (_:xs) = getExtra xs
+> getExtra [] = return []
+
+> processFlags :: [Option] -> Bool -> IO ()
+> processFlags [] True = do putStrLn ""; exitWith ExitSuccess
+> processFlags [] False = return ()
+> processFlags (LibFlags:xs) _ = do datadir <- getDataDir
+>                                   putStr $ "-L"++datadir++"/evm "
+>                                   processFlags xs True
+> processFlags (CFlags:xs) _ = do datadir <- getDataDir
+>                                 putStr $ "-I"++datadir++"/evm "
+>                                 processFlags xs True
+> processFlags (_:xs) quit = processFlags xs quit
