-- automatically generated by BNF Converter module Main where import IO ( stdin, hGetContents ) import System ( getArgs, getProgName ) import Lexsyntax import Parsyntax import Skelsyntax import Printsyntax import Abssyntax import Typecheck import Interpret import Compile import ErrM type ParseFun a = [Token] -> Err a myLLexer = myLexer 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 :: ([Func] -> [Stm] -> IO()) -> ParseFun Program -> FilePath -> IO () runFile e p f = readFile f >>= run e p 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) -> 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 pProgram "-c":f:[] -> let file = (f++".c") in do putStrLn $ "Compiling "++f++" to the C99-compatible file:"++file 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"