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
|
||||
|
||||
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
|
||||
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 = putStr ">> " >> hFlush stdout >> getLine >>= run
|
||||
repl = putStr ">> " >> hFlush stdout >> getLine >>= runEval
|
||||
|
||||
main :: IO ()
|
||||
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 (
|
||||
SyntaxError (..),
|
||||
parse
|
||||
parse,
|
||||
parseExpression
|
||||
) where
|
||||
|
||||
import Control.Monad
|
||||
|
|
@ -55,6 +56,9 @@ data SyntaxError = SyntaxError String deriving Show
|
|||
parse :: [Token] -> Either SyntaxError [Stmt]
|
||||
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 = do
|
||||
atEnd <- isAtEnd
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue