X-Git-Url: https://ruin.nu/git/?p=proglang.git;a=blobdiff_plain;f=Interpreter.hs;fp=Interpreter.hs;h=ae73abba4a1cff690a8bab18e84c977298c73809;hp=694ce2367ea328c1e4b2ebb270ab743a99f5e87a;hb=04f0a9566794cf761b7bcf83190051a400ec3653;hpb=cfe5796efb06251047f77bf9d2295d7093910292 diff --git a/Interpreter.hs b/Interpreter.hs index 694ce23..ae73abb 100644 --- a/Interpreter.hs +++ b/Interpreter.hs @@ -13,8 +13,6 @@ import Abssyntax import Typecheck import Interpret -import Control.Monad.State -import Data.Map as Map hiding (showTree) import ErrM @@ -24,27 +22,32 @@ myLLexer = myLexer type Verbosity = Int +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 :: Verbosity -> String -> IO () putStrV v s = if v > 1 then putStrLn s else return () -runFile :: Verbosity -> ParseFun Stms -> FilePath -> IO () +runFile :: Verbosity -> ParseFun Program -> FilePath -> IO () runFile v p f = putStrLn f >> readFile f >>= run v p -run :: Verbosity -> ParseFun Stms -> String -> IO () +run :: Verbosity -> ParseFun Program -> String -> IO () run v p s = let ts = myLLexer s in case p ts of Bad s -> do putStrLn "\nParse Failed...\n" putStrV v "Tokens:" putStrV v $ show ts putStrLn s - Ok (Program s) -> do - --putStrLn "\nParse Successful!" - --showTree v (Program s) - typeCheck s - --print "The program is type-correct!!" - --print "Running program:" - interpret s - --print "Done running program!" + Ok (Program s) -> let (fun,st) = splitFunStm (s) in do + putStrLn "\nParse Successful!" + showTree v (Program s) + typeCheck fun st + print "The program is type-correct!!" + print "Running program:" + interpret fun st + print "Done running program!" showTree :: (Show a, Print a) => Int -> a -> IO () showTree v tree @@ -55,9 +58,9 @@ showTree v tree main :: IO () main = do args <- getArgs case args of - [] -> hGetContents stdin >>= run 2 pStms - "-s":fs -> mapM_ (runFile 0 pStms) fs - fs -> mapM_ (runFile 2 pStms) fs + [] -> hGetContents stdin >>= run 2 pProgram + "-s":fs -> mapM_ (runFile 0 pProgram) fs + fs -> mapM_ (runFile 2 pProgram) fs