39 lines
1.1 KiB
Haskell
39 lines
1.1 KiB
Haskell
import Lox.Scanner
|
|
import Lox.Parser
|
|
import Lox.Interpreter
|
|
import System.IO
|
|
import System.Environment
|
|
|
|
run :: String -> IO ()
|
|
run source = do
|
|
let tokensMaybe = scanTokensFromSource source
|
|
case tokensMaybe of
|
|
Left (LexicalError s) -> putStrLn s
|
|
Right tokens -> do
|
|
let stmtMaybe = parse tokens
|
|
case stmtMaybe of
|
|
Left (SyntaxError s) -> putStrLn s
|
|
Right statements -> runStatements statements
|
|
|
|
runEval :: String -> IO ()
|
|
runEval source = do
|
|
let tokensMaybe = scanTokensFromSource source
|
|
object <- case tokensMaybe of
|
|
Left (LexicalError s) -> putStrLn s >> return NullObject
|
|
Right tokens -> do
|
|
let exprMaybe = parseExpression tokens
|
|
case exprMaybe of
|
|
Left (SyntaxError s) -> putStrLn s >> return NullObject
|
|
Right statements -> eval statements
|
|
print object
|
|
|
|
repl :: IO ()
|
|
repl = putStr ">> " >> hFlush stdout >> getLine >>= runEval
|
|
|
|
main :: IO ()
|
|
main = getArgs >>= fs
|
|
|
|
fs :: [String] -> IO ()
|
|
fs [] = repl
|
|
fs [s] = readFile s >>= run
|
|
fs _ = putStrLn "Usage: lox [file]"
|