import Typecheck
import Interpret
import Compile
-import Data.Map as Map hiding (showTree)
import ErrM
myLLexer = myLexer
-
-cHeader = "#include <stdio.h>\nint read(){\nint n;\nscanf(\"%d\",&n);\nreturn n;\n}\nint main(void){\n"
-
-cFooter = "return 0;}"
+splitFunStm :: [FuncStm] -> ([Func],[Stm])
+splitFunStm [] = ([],[])
+splitFunStm ((F f):fss) = let (fs,ss) = splitFunStm fss in (f:fs,ss)
+splitFunStm ((S s):fss) = let (fs,ss) = splitFunStm fss in (fs,s:ss)
putStrV :: Int -> String -> IO ()
putStrV v s = if v > 1 then putStrLn s else return ()
-runFile :: ([Stm] -> IO()) -> ParseFun Stms -> FilePath -> IO ()
+runFile :: ([Func] -> [Stm] -> IO()) -> ParseFun Program -> FilePath -> IO ()
runFile e p f = readFile f >>= run e p
-run :: ([Stm] -> IO()) -> ParseFun Stms -> String -> IO ()
+run :: ([Func] -> [Stm] -> IO()) -> ParseFun Program -> String -> IO ()
run e p s = let ts = myLLexer s in case p ts of
Bad s -> do
putStrLn "\nParse Failed...\n"
putStrLn "Tokens:"
putStrLn $ show ts
putStrLn s
- Ok (Program s) -> do
- typeCheck s
- e s
+ Ok (Program s) -> let (fun,st) = splitFunStm (s) in do
+ typeCheck fun st
+ e fun st
main :: IO ()
main = do
args <- getArgs
case args of
- [] -> hGetContents stdin >>= run interpret pStms
+ [] -> hGetContents stdin >>= run interpret pProgram
- "-c":f:[] -> runFile (\fun st -> writeFile (f++".c") $ compile fun st) pProgram f
+ "-c":f:[] -> let file = (f++".c") in do
+ putStrLn $ "Compiling "++f++" to the C99-compatible file:"++file
- runFile (writeFile file . compile) pStms f
- f:[] -> runFile interpret pStms f
++ runFile (\fun st -> writeFile file $ compile fun st) pProgram f
+ f:[] -> runFile interpret pProgram f
- _ -> print "Too many arguments"
+ _ -> do
+ putStrLn "Usage: ./CompInt [-c] <file>"
+ putStrLn "-c : compile <file> to C99-compatible file"
import Abssyntax
import Prelude hiding (lookup)
--cHeader = "#include <stdio.h>\nint read(){\nint n;\nscanf(\"%d\",&n);\nreturn n;\n}\nint main(void){\n"
++cHeader = "#include <stdio.h>\nint read(){\nint n;\nscanf(\"%d\",&n);\nreturn n;\n}\n"
--cFooter = "return 0;}"
++cMiddle = "\nint main(void){\n"
+
-compile :: [Stm] -> String
-compile s = cHeader++concat (map compileStm s)++cFooter
++cFooter = "return 0;}\n"
+
+compile :: [Func] -> [Stm] -> String
- compile f s = cHeader++concat (map compileStm s)++cFooter
++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 (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"