packages feed

oberon0-0.0.1: src/Language/Oberon0/MainT1.hs

{-# OPTIONS -fcontext-stack=1000 #-}

module Language.Oberon0.MainT1 where

import System.Environment( getArgs )
import System.Console.GetOpt

import Language.Grammars.Murder
import Language.Grammars.Murder.UUParsing



data Flag  = MaxErr Int | PP (Maybe String) | Gen (Maybe String) 
       deriving (Show, Eq, Ord)
    
options :: [OptDescr Flag]
options =
     [ Option ['p']     ["pretty"]  (OptArg PP               "FILE")   "pretty-print"
     , Option ['e']     ["errors"]  (ReqArg (MaxErr . read)  "NUMBER") "maximum number of errors to list"
     ]
    

maxerrors   ((MaxErr e):_)  le = if e < le then e else le
maxerrors   (_:fs)          le = maxerrors fs le
maxerrors   []              le = le

prettyprint ((PP mbfile):_ )  ppcode = case mbfile of
                                            Just file -> writeFile file (show ppcode)
                                            Nothing   -> do putStrLn "Pretty-printed code:"
                                                            print ppcode
prettyprint (_:fs)            ppcode = prettyprint fs ppcode
prettyprint []                _      = return ()



remComments ('(':'*':xs) level = ' ':' ':(remComments xs (level + 1))
remComments ('*':')':xs) level | level > 0 = ' ':' ':(remComments xs (level - 1))
                               | otherwise =  '*':')':xs
remComments ('\n':xs) level    = '\n':(remComments xs level)

remComments (x:xs) level | level > 0 = ' ':(remComments xs level)
                         | otherwise = x:(remComments xs level)
remComments [] _ = []


mainTemplate opts task ip prg kws gram = do
	args <- getArgs
        case getOpt Permute opts args of
          (flags, prg:nonOpts, []) -> do  tokens <- readFile prg
                                          case (parse . compileKws kws) gram (remComments tokens 0) of
           					(Ok res)    -> do  let atts = res ip 
                                                                   task flags atts
                                                                        
                                                (Rep _ err) -> do  let maxerr  = maxerrors flags (length err)
                                                                   putStrLn "Errors found while parsing:"
                                                                   mapM_ (putStrLn . show) $ take maxerr err
                                                                   putStrLn $ "--- Listed " ++ show maxerr ++ " of " ++ show (length err)

          (_, _, errs) -> ioError (userError (concat errs ++ usageInfo ("Usage: " ++ prg ++ " [OPTIONS] file") opts)) 



mainT1 ppatt = mainTemplate options $ \flags atts -> prettyprint flags (ppatt atts)