module sil import StdBool import StdChar import StdFile from StdFunc import o, seq import StdList import StdOverloaded import StdString import Control.Applicative import Control.Monad import Data.Error from Data.Func import $ import Data.Functor import System.CommandLine import System.File import ABC.Assembler import qualified Sil.Compile as SC from Sil.Compile import :: CompileError, instance toString CompileError import Sil.Parse import Sil.Parse.Parser from Sil.Syntax import :: Program from Sil.Util import :: PrintState, instance zero PrintState, class PrettyPrinter(..), instance PrettyPrinter Program :: CLI = { prettyprint :: Bool , compile :: Bool , inputfile :: String } instance zero CLI where zero = { prettyprint = False , compile = False , inputfile = "" } Start w # (io,w) = stdio w # (cmd,w) = getCommandLine w # (args,_) = runParser (arg until eof) $ tl cmd | isError args # io = io <<< toString (fromError args) <<< "\r\n" # (_,w) = fclose io w = w # args = seq (fromOk args) zero # (file,w) = readFile args.inputfile w | isError file # io = io <<< "Could not open '" <<< args.inputfile <<< "'.\r\n" # (_,w) = fclose io w = w # prog = tokenise (fromString $ fromOk file) >>= parse | isError prog # io = io <<< toString (fromError prog) <<< "\r\n" # (_,w) = fclose io w = w # io = if args.prettyprint (io <<< print zero (fromOk prog) <<< "\r\n") io # io = if args.compile (io <<< ('SC'.compile (fromOk prog)) <<< "\r\n") io # (_,w) = fclose io w = w where arg :: Parser String (CLI -> CLI) arg = peek >>= \opt -> ( item "--pretty-print" *> pure (\cli -> {cli & prettyprint=True}) <|> item "--compile" *> pure (\cli -> {cli & compile=True}) <|> (satisfy isFilename >>= \name -> pure (\cli -> {cli & inputfile=name})) Invalid "command line argument" opt ) isFilename :: (String -> Bool) isFilename = all (\c -> isAlphanum c || isMember c ['.']) o fromString instance <<< (MaybeError e a) | <<< e & <<< a where <<< f (Ok a) = f <<< a <<< f (Error e) = f <<< e instance <<< CompileError where <<< f e = f <<< toString e