X-Git-Url: https://ruin.nu/git/?p=proglang.git;a=blobdiff_plain;f=CompInt.hs;fp=CompInt.hs;h=1934447c5e1110079dc94f93cf2867a9cfb52c47;hp=298c9f49c8ae3a50fcf220e393bdf99ed994c1bd;hb=cdcd3b92ee3145e646634d428b02118238d47f33;hpb=4ab526ea4f2ad39b6797adbc9df0fd26ac571456 diff --git a/CompInt.hs b/CompInt.hs index 298c9f4..1934447 100644 --- a/CompInt.hs +++ b/CompInt.hs @@ -14,7 +14,6 @@ import Abssyntax import Typecheck import Interpret import Compile -import Data.Map as Map hiding (showTree) import ErrM @@ -22,37 +21,37 @@ type ParseFun a = [Token] -> Err a myLLexer = myLexer - -cHeader = "#include \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:[] -> 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 _ -> do putStrLn "Usage: ./CompInt [-c] " putStrLn "-c : compile to C99-compatible file"