preamble
[minfp.git] / gen.icl
1 implementation module gen
2
3 import StdEnv
4
5 import Data.Either
6 import Data.Func
7 import Text
8
9 import ast
10
11 gen :: AST -> Either [String] [String]
12 gen (AST fs) = Right
13 ["#include \"rts.h\"\n"
14 :genCode fs []
15 ]
16
17 class genCode a :: a [String] -> [String]
18 instance genCode String where genCode s c = [s:c]
19 instance genCode Char where genCode s c = genCode (toString s) c
20 instance genCode [a] | genCode a where
21 genCode [] c = c
22 genCode [a:as] c = genCode a (genCode as c)
23 instance genCode Function where
24 genCode (Function name args body) c
25 = ["struct stackval_t *", toString name, "(":genCode (join ", " ["struct stackval_t *" +++ toString a\\a<-args]) [") { return ":genCode body ["; }\n":c]]]
26 instance genCode Value where
27 genCode (Int i) c = ["lit(",toString i,")":c]
28 genCode (Bool i) c = ["lit(",if i "true" "false",")":c]
29 genCode (Func _ _ _) c = abort "help"
30 instance genCode Expression where
31 genCode (Lit l) c = genCode l c
32 genCode (Var ['if']) c = genCode (Var ['_if']) c
33 genCode (Var v) c = ["var(",toString v,")":c]
34 genCode (App a b) c = ["ap(":genCode a [", ":genCode b [")":c]]]
35 genCode (Lambda a b) c = abort "help"
36 genCode (Builtin b args) c = genCode b ["(":genCode args [")":c]]