module Main where
import Scanner
import Parser
import Opts
import Common
import Transform
import Errs
import Control.Monad
import System
import System.IO
main :: IO ()
main = do opts <- commandlineArgs
let path = sourceFile opts
pos = Pos 1 1 path
when (path /= "") $
do str <- readFile path
let tks = tokenize opts path str
pres = parseProgram opts pos tks
when (tokens opts) (putStrLn (show $ ppTokens tks))
case pres of
Left err -> do hPutStrLn stderr err
hFlush stderr
exitFailure
Right ast -> let (errs, txtId, txtTarget, txtGraph) = transform pos opts ast
in do when (pretty opts) (putStrLn txtId)
when (not $ nullErrs errs) $ do
hPutStrLn stderr (errsToStr opts errs)
hFlush stderr
case outputGraph opts of
Just name -> myWriteFile name txtGraph
Nothing -> return ()
if nullErrs errs || forceGen opts
then case outputFile opts of
Just name -> myWriteFile name txtTarget
Nothing -> return ()
else exitFailure
myWriteFile :: FilePath -> String -> IO ()
myWriteFile path txt
= seq (seqChars txt) $ withFile path WriteMode writeHandle
where
seqChars [] = ()
seqChars (c:cs) = seq c (seqChars cs)
writeHandle h = do hPutStrLn h txt
hFlush h