]> ruin.nu Git - proglang.git/blob - Compiler.hs
minor change
[proglang.git] / Compiler.hs
1 -- automatically generated by BNF Converter
2 module Main where
3
4
5 import IO ( stdin, hGetContents )
6 import System ( getArgs, getProgName )
7
8 import Lexsyntax
9 import Parsyntax
10 import Skelsyntax
11 import Printsyntax
12 import Abssyntax
13
14 import Typecheck
15 import Compile
16 import Control.Monad.State
17 import Data.Map as Map hiding (showTree,map)
18
19 import ErrM
20
21 type ParseFun a = [Token] -> Err a
22
23 myLLexer = myLexer
24
25 type Verbosity = Int
26
27 cHeader = "#include <stdio.h>\nint read(){\nint n;\nscanf(\"%d\",&n);\nreturn n;\n}\nint main(void){\n"
28
29 cFooter = "return 0;}"
30
31 putStrV :: Verbosity -> String -> IO ()
32 putStrV v s = if v > 1 then putStrLn s else return ()
33
34 runFile :: Verbosity -> ParseFun Stms -> FilePath -> IO ()
35 runFile v p f = readFile f >>= run v p
36
37 run :: Verbosity -> ParseFun Stms -> String -> IO ()
38 run v p s = let ts = myLLexer s in case p ts of
39         Bad s    -> do
40                 putStrLn "\nParse              Failed...\n"
41                 putStrV v "Tokens:"
42                 putStrV v $ show ts
43                 putStrLn s
44         Ok (Program s) -> do
45                 runStateT (mapM typeCheckStm s) [empty]
46                 putStr $ cHeader++concat (map compileStm s)++cFooter
47                 return ()
48
49 showTree :: (Show a, Print a) => Int -> a -> IO ()
50 showTree v tree
51  = do
52       putStrV v $ "\n[Abstract Syntax]\n\n" ++ show tree
53       putStrV v $ "\n[Linearized tree]\n\n" ++ printTree tree
54
55 main :: IO ()
56 main = do args <- getArgs
57           case args of
58             [] -> hGetContents stdin >>= run 2 pStms
59             "-s":fs -> mapM_ (runFile 0 pStms) fs
60             fs -> mapM_ (runFile 2 pStms) fs
61
62
63
64
65