tidy up
This commit is contained in:
parent
6f4a835e54
commit
ef7dc3603d
5 changed files with 50 additions and 2 deletions
|
|
@ -1 +1,5 @@
|
||||||
# crafting-interpreters-hs
|
# crafting-interpreters-hs
|
||||||
|
|
||||||
|
Usage: `lox [file]`
|
||||||
|
|
||||||
|
Implemented up to control flow statements (chapter 9).
|
||||||
|
|
|
||||||
14
app/Main.hs
14
app/Main.hs
|
|
@ -15,8 +15,20 @@ run source = do
|
||||||
Left (SyntaxError s) -> putStrLn s
|
Left (SyntaxError s) -> putStrLn s
|
||||||
Right statements -> runStatements statements
|
Right statements -> runStatements statements
|
||||||
|
|
||||||
|
runEval :: String -> IO ()
|
||||||
|
runEval source = do
|
||||||
|
let tokensMaybe = scanTokensFromSource source
|
||||||
|
object <- case tokensMaybe of
|
||||||
|
Left UnexpectedCharacterError -> putStrLn "Unexpected character" >> 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 :: IO ()
|
||||||
repl = putStr ">> " >> hFlush stdout >> getLine >>= run
|
repl = putStr ">> " >> hFlush stdout >> getLine >>= runEval
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = getArgs >>= fs
|
main = getArgs >>= fs
|
||||||
|
|
|
||||||
9
examples/fibonacci.lox
Normal file
9
examples/fibonacci.lox
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
var a = 0;
|
||||||
|
var temp;
|
||||||
|
|
||||||
|
for (var b = 1; a < 10000; b = temp + b) {
|
||||||
|
print a;
|
||||||
|
temp = a;
|
||||||
|
a = b;
|
||||||
|
}
|
||||||
|
|
||||||
19
examples/scope.lox
Normal file
19
examples/scope.lox
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
var a = "global a";
|
||||||
|
var b = "global b";
|
||||||
|
var c = "global c";
|
||||||
|
{
|
||||||
|
var a = "outer a";
|
||||||
|
var b = "outer b";
|
||||||
|
{
|
||||||
|
var a = "inner a";
|
||||||
|
print a;
|
||||||
|
print b;
|
||||||
|
print c;
|
||||||
|
}
|
||||||
|
print a;
|
||||||
|
print b;
|
||||||
|
print c;
|
||||||
|
}
|
||||||
|
print a;
|
||||||
|
print b;
|
||||||
|
print c;
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
module Lox.Parser (
|
module Lox.Parser (
|
||||||
SyntaxError (..),
|
SyntaxError (..),
|
||||||
parse
|
parse,
|
||||||
|
parseExpression
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
|
@ -55,6 +56,9 @@ data SyntaxError = SyntaxError String deriving Show
|
||||||
parse :: [Token] -> Either SyntaxError [Stmt]
|
parse :: [Token] -> Either SyntaxError [Stmt]
|
||||||
parse tokens = evalState program (ParserState {tokens=tokens})
|
parse tokens = evalState program (ParserState {tokens=tokens})
|
||||||
|
|
||||||
|
parseExpression :: [Token] -> Either SyntaxError Expr
|
||||||
|
parseExpression tokens = evalState expression (ParserState {tokens=tokens})
|
||||||
|
|
||||||
program :: State ParserState (Either SyntaxError [Stmt])
|
program :: State ParserState (Either SyntaxError [Stmt])
|
||||||
program = do
|
program = do
|
||||||
atEnd <- isAtEnd
|
atEnd <- isAtEnd
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue