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