(*===----------------------------------------------------------------------=== * Top-Level parsing and JIT Driver *===----------------------------------------------------------------------===*) open Llvm (* top ::= definition | external | expression | ';' *) let rec main_loop stream = match Stream.peek stream with | None -> () (* ignore top-level semicolons. *) | Some (Token.Kwd ';') -> Stream.junk stream; main_loop stream | Some token -> begin try match token with | Token.Def -> let e = Parser.parse_definition stream in print_endline "parsed a function definition."; dump_value (Codegen.codegen_func e); | Token.Extern -> let e = Parser.parse_extern stream in print_endline "parsed an extern."; dump_value (Codegen.codegen_proto e); | _ -> (* Evaluate a top-level expression into an anonymous function. *) let e = Parser.parse_toplevel stream in print_endline "parsed a top-level expr"; dump_value (Codegen.codegen_func e); with Stream.Error s | Codegen.Error s -> (* Skip token for error recovery. *) Stream.junk stream; print_endline s; end; print_string "ready> "; flush stdout; main_loop stream