module Main where import Ast import Parser import Env import Print import Eval import BasicNumber -- partain import IO --(isEOF,hFlush,stdout) ---------------------------------------------------------------------------- -- command line prompt prompt :: String prompt = "-> " ---------------------------------------------------------------------------- main :: IO () main = cmdloop (initEnv []) where cmdloop env = do putStr prompt hFlush stdout l <- getLine if l == "exit" then return () else do let (res, nenv) = cmd_process (l, env) putStrLn res cmdloop nenv ---------------------------------------------------------------------------- -- process the command line cmd_process :: (String, Env) -> (String, Env) cmd_process (c,e) = case c of "env" -> ((printEnv e e),e) "clear" -> ("",initEnv []) "?" -> (printHelp, e) _ -> case ast of (Set evar bexpr) -> (printAst ast e, enterEnv evar bexpr e) (EvalSet evar bexpr) -> (res, enterEnv evar rexpr e) where rexpr = eval bexpr e res = printAst ast e ++ (printBasicExp rexpr e) (Eval bexpr) -> (printBasicExp (eval bexpr e) e, e) _ -> (printAst ast e, e) where ast = parse c ---------------------------------------------------------------------------- -- print the help menu printHelp :: String printHelp = "Commands:\n"++ "clear clear the environment\n"++ "env browse through the environment\n"++ "exit quit\n"++ "? display this help info\n"++ "$var = 'expr augment the environment\n"++ "$var = expr eval and assign\n"++ "expr evaluate the expression\n\n"++ "where expr could be any of the following:\n\n"++ "EXP -> BINARY-EXP (EXP1,EXP2)\n"++ " | UNARY-EXP (EXP)\n"++ " | EXP1 OP EXP2\n"++ "\n"++ "BINARY-EXP -> add | sub | mul | div | equ\n"++ " | ne | lt | gt | lte | gte\n"++ "\n"++ "UNARY-EXP -> sqrt | real | rat \n"++ "\n"++ "VAR -> a variable name\n" ----------------------------------------------------------------------------