-module Compile (compileExp, compileStm) where
+module Compile (compile,compileExp, compileStm) where
import Abssyntax
import Prelude hiding (lookup)
+cHeader = "#include <stdio.h>\nint read(){\nint n;\nscanf(\"%d\",&n);\nreturn n;\n}\n"
+
+cMiddle = "\nint main(void){\n"
+
+cFooter = "return 0;}\n"
+
+compile :: [Func] -> [Stm] -> String
+compile f s = cHeader++concat (map compileFuncDecl f)++concat (map compileFunc f)++cMiddle++concat (map compileStm s)++cFooter
+
compileExp :: Exp -> String
compileExp (EBool True) = "1";
compileExp (EBool False) = "0";
compileExp (EPost (Ident i) Minus) = i++"--"
compileExp EReadI = "read()"
compileExp EReadB = "read()"
+compileExp (EFunc (Ident i) as) = i++"("++(foldl1 (\a b -> a++","++b) (map compileExp as))++")"
op :: Op -> String
op Eq = "=="
TBool -> EBool False
)
compileStm (SDecl t (Ident i) e) = "int "++i++"="++compileExp e++";\n"
+compileStm (SReturn e) = "return "++compileExp e++";"
+
+compileFunc :: Func -> String
+compileFunc (Func _ (Ident i) d ss) = "\nint "++i++"("++(foldl1 (\a b -> a++","++b) (map (\(Decl _ (Ident i)) -> "int "++i) d))++"){\n"++concat (map compileStm ss)++"\n}\n"
+
+compileFuncDecl :: Func -> String
+compileFuncDecl (Func _ (Ident i) d ss) = "\nint "++i++"("++(foldl1 (\a b -> a++","++b) (map (\(Decl _ (Ident i)) -> "int "++i) d))++");\n"