X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=src%2Fmain.icl;h=31c98d760e0899bacbfb28ba60d09170f7f69614;hb=b3bedf1e825aaaee9134dddc6de82b373bf8b86b;hp=0dfab03e0a2c3e22ac13f79bcea0edf2737e7480;hpb=eb91d7c6b2010be6a43de0a978373654ba3deacc;p=cc1516.git diff --git a/src/main.icl b/src/main.icl index 0dfab03..31c98d7 100644 --- a/src/main.icl +++ b/src/main.icl @@ -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}