]> ruin.nu Git - proglang.git/blobdiff - CompInt.hs
merged changes to function branch
[proglang.git] / CompInt.hs
diff --git a/CompInt.hs b/CompInt.hs
new file mode 100644 (file)
index 0000000..d5aa2ca
--- /dev/null
@@ -0,0 +1,53 @@
+-- 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:[] -> runFile (\fun st -> writeFile (f++".c") $ compile fun st)  pProgram f
+               f:[] -> runFile interpret pProgram f
+               _ -> print "Too many arguments"