mlox/lib/lox.ml
Moritz Gmeiner ea0d7acbee started implementing expressions
Parser.parse now return list of statements or list of errors.
parsing continues until EOF, even when errors are found; but after the
first error the result can only be Error.
Also implemented Print and Expr statements.
2024-08-25 02:12:51 +02:00

39 lines
1.2 KiB
OCaml

let ( let* ) = Result.bind
module Error = Error
module Expr = Expr
module Interpreter = Interpreter
module Lexer = Lexer
module Parser = Parser
module Stmt = Stmt
type lox_error = Error.lox_error
let run (source : string) : (unit, lox_error) result =
let* tokens = Error.of_lexer_error (Lexer.tokenize source) in
(* let f token = Printf.printf "%s " (Lexer.show_token token) in
Printf.printf "Got %d tokens\n" (List.length tokens);
List.iter f tokens;
print_newline (); *)
let* ast = Error.of_parser_error (Parser.parse tokens) in
(* Printf.printf "%s\n" (Expr.show_expr expr); *)
(* let* value = Error.of_interpreter_error (Interpreter.interpret_expr ast) in
print_endline (Value.string_of_lox_value value); *)
let rec interpret_stmts (stmts : Stmt.stmt_node list) =
match stmts with
| [] -> Ok ()
| stmt :: tail ->
let* _ = Interpreter.interpret_stmt stmt in
interpret_stmts tail
in
interpret_stmts ast |> Error.of_runtimer_error
let runRepl () : unit =
try
while true do
print_string "> ";
let line = read_line () in
let result = run line in
Result.iter_error Error.print_error result
done
with End_of_file -> ()