(*===----------------------------------------------------------------------=== * Top-Level parsing and JIT Driver *===----------------------------------------------------------------------===*) (* 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 -> ignore(Parser.parse_definition stream); print_endline "parsed a function definition."; | Token.Extern -> ignore(Parser.parse_extern stream); print_endline "parsed an extern."; | _ -> (* Evaluate a top-level expression into an anonymous function. *) ignore(Parser.parse_toplevel stream); print_endline "parsed a top-level expr"; with Stream.Error s -> (* Skip token for error recovery. *) Stream.junk stream; print_endline s; end; print_string "ready> "; flush stdout; main_loop stream