man toegevoegd, mapjes gemaakt, bijna klaar voor inleveren
[cc1516.git] / src / main.icl
index 0dfab03..31c98d7 100644 (file)
@@ -16,8 +16,10 @@ from Text import class Text(concat), instance Text String
 
 import parse
 import lex
+from yard import :: Error, instance toString Error
 
 :: Opts = {
+       version :: Bool,
        program :: String,
        lex :: Bool,
        parse :: Bool,
@@ -29,38 +31,60 @@ derive gPrint TokenValue
 Start :: *World -> *World
 Start w
 # (args, w) = parseArgs w
-| args.help
-       # (out, w) = stdio w
-       # out = out <<< "Usage: " <<< args.program <<< " [opts] [FILENAME]\n"
-               <<< "\t--help  Show this help\n"
-               <<< "\t--[no-]lex   Lexer output(default: disabled)\n"
-               <<< "\t--[no-]parse Parser output(default: enabled)\n\n"
-               <<< "\tFILENAME   File to parse, when unspecified stdin is parsed\n"
-       = snd $ fclose out w
 # (stdin, w) = stdio w
+| args.version
+       # stdin = stdin 
+               <<< "main 0.1 (17 march 2016)\n"
+               <<< "Copyright Pim Jager and Mart Lubbers\n"
+       = snd $ fclose stdin w
+| args.help
+       # stdin = stdin 
+               <<< "Usage: " <<< args.program <<< " [OPTION] [FILE]\n"
+               <<< "Lex parse and either FILE or stdin\n"
+               <<< "\n"
+               <<< "Options:\n"
+               <<< "  --help             Show this help\n"
+               <<< "  --version          Show the version\n"
+               <<< "  --[no-]lex         Lexer output(default: disabled)\n"
+               <<< "  --[no-]parse       Parser output(default: enabled)\n"
+       = snd $ fclose stdin w
 # (contents, stdin, w) = readFileOrStdin stdin args.fp w
 = case contents of
        (Left cs) = snd $ fclose (stdin <<< cs) w
        (Right cs)
        # lexOut = lexer cs
        # stdin = if (not args.lex) stdin (case lexOut of
-               (Left lex) = stdin <<< toString lex
-               (Right toks) = stdin <<< 
-                       concat (map (\(_, _, t)->printToString t +++ "\n") toks))
+               (Right toks) = 
+                       stdin <<< "---LEXER\n" <<< printTokens toks <<< "---LEXER\n"
+               _ = stdin)
        # parseOut = parser lexOut
        # stdin = if (not args.parse) stdin (case parser lexOut of
-               (Left parse) = stdin <<< toString parse
-               (Right ast) = stdin <<< toString ast)
+               (Right ast) = 
+                       stdin <<<  "---PARSER\n" <<< toString ast <<< "---PARSER\n" 
+               (Left parse) = stdin <<< toString parse)
        = snd $ fclose stdin w
+               where
+                       printTokens :: [Token] -> String
+                       printTokens ts = concat $ flatten $ map pt ts
+                               where
+                                       pt {line,column,token} = [toString line, ":", 
+                                               toString column, ": ", printToString token, "\n"]
 
 parseArgs :: *World -> (Opts, *World)
 parseArgs w
 # ([p:args], w) = getCommandLine w
-= (pa args {program=p, lex=False, parse=True, fp=Nothing, help=False}, w)
+= (pa args {
+       program=p,
+       version=False,
+       lex=False,
+       parse=True,
+       fp=Nothing,
+       help=False}, w)
 where
        pa :: [String] Opts -> Opts
        pa [] o = o
        pa ["--help":r] o = pa r {o & help=True}
+       pa ["--version":r] o = pa r {o & version=True}
        pa ["--lex":r] o = pa r {o & lex=True}
        pa ["--no-lex":r] o = pa r {o & lex=False}
        pa ["--parse":r] o = pa r {o & parse=True}