This commit is contained in:
Oleg Sobolev 2025-12-30 06:53:05 +03:00
parent 6f4a835e54
commit ef7dc3603d
5 changed files with 50 additions and 2 deletions

View file

@ -1 +1,5 @@
# crafting-interpreters-hs
Usage: `lox [file]`
Implemented up to control flow statements (chapter 9).

View file

@ -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
View 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
View 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;

View file

@ -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