1(*===----------------------------------------------------------------------===
2 * Top-Level parsing and JIT Driver
3 *===----------------------------------------------------------------------===*)
4
5open Llvm
6
7(* top ::= definition | external | expression | ';' *)
8let rec main_loop stream =
9  match Stream.peek stream with
10  | None -> ()
11
12  (* ignore top-level semicolons. *)
13  | Some (Token.Kwd ';') ->
14      Stream.junk stream;
15      main_loop stream
16
17  | Some token ->
18      begin
19        try match token with
20        | Token.Def ->
21            let e = Parser.parse_definition stream in
22            print_endline "parsed a function definition.";
23            dump_value (Codegen.codegen_func e);
24        | Token.Extern ->
25            let e = Parser.parse_extern stream in
26            print_endline "parsed an extern.";
27            dump_value (Codegen.codegen_proto e);
28        | _ ->
29            (* Evaluate a top-level expression into an anonymous function. *)
30            let e = Parser.parse_toplevel stream in
31            print_endline "parsed a top-level expr";
32            dump_value (Codegen.codegen_func e);
33        with Stream.Error s | Codegen.Error s ->
34          (* Skip token for error recovery. *)
35          Stream.junk stream;
36          print_endline s;
37      end;
38      print_string "ready> "; flush stdout;
39      main_loop stream
40