From: Mart Lubbers Date: Sat, 27 Feb 2016 13:38:31 +0000 (+0100) Subject: optimized main.icl X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=ecb884c3135dd60d57288b51359f458a6d127c77;p=cc1516.git optimized main.icl --- diff --git a/src/main.icl b/src/main.icl index 4739c35..edd07f1 100644 --- a/src/main.icl +++ b/src/main.icl @@ -22,28 +22,18 @@ import lex :: *StartType :== (LexerOutput, ParserOutput, *World) -parseArgs :: *World -> (Opts, *World) -parseArgs w -# ([p:args], w) = getCommandLine w -= (pa args {program=p, lex=False, parse=False, fp=Nothing, help=False}, w) -where - pa :: [String] -> (Opts -> Opts) - pa [] = id - pa ["--help":r] = \o.pa r {o & help=True} - pa ["--lex":r] = \o.pa r {o & lex=True, parse=False} - pa ["--parse":r] = \o.pa r {o & lex=False, parse=True} - pa [x:r] = \o.pa r {o & fp=Just x} - -//Start :: *World -> (LexerOutput, ParserOutput, *World) -//Start w -//# (args, w) = getCommandLine w -//# (toparse, out) = readEntireFile out -//= (lexer toparse, parse (lexer toparse), w) - Start :: *World -> *StartType Start w # (args, w) = parseArgs w -| args.help = help args.program w +| args.help + # (out, w) = stdio w + # out = out <<< "\nUsage: " <<< args.program <<< " [opts] [FILENAME]\n" + <<< "\t--help Show this help\n" + <<< "\t--lex Lex only, is mutually exclusive with --parse\n" + <<< "\t--parse Lex & Parse only\n\n" + <<< "\tFILENAME File to parse, when unspecified stdin is parsed\n" + # (_, w) = fclose out w + = (Left "", Left "", w) # (stdin, w) = stdio w # (contents, stdin, w) = readFileOrStdin stdin args.fp w | args.lex = case contents of @@ -53,6 +43,18 @@ Start w (Left e) = (Left e, Left "", w) (Right cs) = let lexOut = lexer cs in (lexOut, parser lexOut, w) +parseArgs :: *World -> (Opts, *World) +parseArgs w +# ([p:args], w) = getCommandLine w += (pa args {program=p, lex=False, parse=False, fp=Nothing, help=False}, w) +where + pa :: [String] -> (Opts -> Opts) + pa [] = id + pa ["--help":r] = \o.pa r {o & help=True} + pa ["--lex":r] = \o.pa r {o & lex=True, parse=False} + pa ["--parse":r] = \o.pa r {o & lex=False, parse=True} + pa [x:r] = \o.pa r {o & fp=Just x} + readFileOrStdin :: *File (Maybe String) *World -> *(Either String [Char], *File, *World) readFileOrStdin stdin Nothing w # (cs, stdin) = readEntireFile stdin @@ -61,7 +63,8 @@ readFileOrStdin stdin (Just fp) w # (b, fin, w) = fopen fp FReadText w | not b = (Left "Unable to open file", stdin, w) # (cs, fin) = readEntireFile fin -# (_, w) = fclose fin w +# (b, w) = fclose fin w +| not b = (Left "Unable to close file", stdin, w) = (Right cs, stdin, w) readEntireFile :: *File -> *([Char], *File) @@ -70,15 +73,3 @@ readEntireFile f | not b = ([], f) # (cs, f) = readEntireFile f = ([c:cs], f) - -help :: String *World -> *StartType -help p w -# (out, w) = stdio w -# out = out <<< "\nUsage: " <<< p <<< " [opts] [FILENAME]\n" - <<< "\t--help Show this help\n" - <<< "\t--lex Lex only, is mutually exclusive with --parse\n" - <<< "\t--parse Lex & Parse only\n\n" - <<< "\tFILENAME File to parse, when unspecified stdin is parsed\n" -# (_, w) = fclose out w -= (Left "", Left "", w) -