aboutsummaryrefslogtreecommitdiff
path: root/sil.icl
diff options
context:
space:
mode:
Diffstat (limited to 'sil.icl')
-rw-r--r--sil.icl134
1 files changed, 0 insertions, 134 deletions
diff --git a/sil.icl b/sil.icl
deleted file mode 100644
index 945faaa..0000000
--- a/sil.icl
+++ /dev/null
@@ -1,134 +0,0 @@
-module sil
-
-import StdBool
-import StdChar
-import StdFile
-from StdFunc import o, seq
-import StdList
-import StdOverloaded
-import StdString
-import StdTuple
-
-import Control.Applicative
-import Control.Monad
-import Data.Error
-from Data.Func import $
-import Data.Functor
-import Data.Tuple
-import System.CommandLine
-import System.File
-import System.Process
-
-import ABC.Assembler
-
-from Sil.Check import checkProgram
-import qualified Sil.Compile as SC
-import Sil.Error
-import Sil.Parse
-from Sil.Syntax import :: Program
-import Sil.Util.Parser
-from Sil.Util.Printer import :: PrintState, instance zero PrintState,
- class PrettyPrinter(..), instance PrettyPrinter Program
-
-:: CLI =
- { prettyprint :: Bool
- , check :: Bool
- , compile :: Bool
- , generate :: Bool
- , run :: Bool
- , inputfile :: String
- }
-
-instance zero CLI
-where
- zero =
- { prettyprint = False
- , check = False
- , compile = False
- , generate = False
- , run = False
- , inputfile = ""
- }
-
-Start w
-#! (io,w) = stdio w
-#! err = stderr
-#! (cmd,w) = getCommandLine w
-#! (args,_) = runParser (arg until eof) $ makeParseState $ map PI_Token $ tl cmd
-| isError args
- # err = err <<< toString (fromError args) <<< "\r\n"
- = finish 1 io err w
-#! args = seq (fromOk args) zero
-#! (file,w) = readFile args.inputfile w
-| isError file
- # err = err <<< "Could not open '" <<< args.inputfile <<< "' for reading.\r\n"
- = finish 1 io err w
-#! prog = tokenise (fromString $ fromOk file) >>= parse
-| isError prog
- # err = err <<< toString (fromError prog) <<< "\r\n"
- = finish 1 io err w
-#! prog = fromOk prog
-#! io = if args.prettyprint
- (io <<< print zero prog <<< "\r\n")
- io
-#! (errs, err) = if args.check
- (appSnd fromJust $ checkProgram (Just err) prog)
- ([], err)
-| not (isEmpty errs)
- = finish 1 io err w
-| not args.compile
- = finish 0 io err w
-#! (ok,f,w) = fopen "sil_compiled.dcl" FWriteText w
-| not ok
- # err = err <<< "Could not open 'sil_compiled.dcl' for writing\r\n"
- = finish 1 io err w
-#! f = f <<< "definition module sil_compiled"
-#! (_,w) = fclose f w
-#! (_,w) = sleep 1 w
-#! (ok,f,w) = fopen "Clean System Files/sil_compiled.abc" FWriteText w
-| not ok
- # err = err <<< "Could not open 'sil_compiled.abc' for writing\r\n"
- = finish 1 io err w
-#! prog = 'SC'.compile prog
-| isError prog
- # err = err <<< fromError prog
- = finish 1 io err w
-#! f = f <<< fromOk prog
-#! (_,w) = fclose f w
-| not args.generate
- = finish 0 io err w
-#! (p,w) = callProcess "/opt/clean/bin/clm" ["-l", "-no-pie", "sil_compiled", "-o", "sil_compiled"] Nothing w
-| isError p
- # err = err <<< snd (fromError p) <<< "\r\n"
- = finish 1 io err w
-| fromOk p <> 0
- = finish (fromOk p) io err w
-| not args.run
- = finish 0 io err w
-#! (p,w) = callProcess "./sil_compiled" [] Nothing w
-| isError p
- # err = err <<< snd (fromError p) <<< "\r\n"
- = finish 1 io err w
-= finish 0 io err w
-where
- arg :: Parser String (CLI -> CLI)
- arg = peek >>= \opt ->
- ( (\ cli -> {cli & prettyprint=True}) <$ item "--pretty-print"
- <|> (\ cli -> {cli & check=True}) <$ item "--check"
- <|> (\ cli -> {cli & compile=True}) <$ item "--compile"
- <|> (\ cli -> {cli & generate=True}) <$ item "--generate"
- <|> (\ cli -> {cli & run=True}) <$ item "--run"
- <|> (\name cli -> {cli & inputfile=name}) <$> satisfy isFilename
- <?> P_Invalid "command line argument" opt
- )
-
- isFilename :: (String -> Bool)
- isFilename = all (\c -> isAlphanum c || isMember c ['./-']) o fromString
-
- finish :: !Int !*File !*File -> *(*World -> *World)
- finish ret io err = setReturnCode ret o snd o fclose err o snd o fclose io
-
- sleep :: !Int !*World -> *(!Int, !*World)
- sleep i w = code inline {
- ccall sleep "I:I:A"
- }