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