Merging r258436:
[oota-llvm.git] / examples / OCaml-Kaleidoscope / Chapter2 / toplevel.ml
1 (*===----------------------------------------------------------------------===
2  * Top-Level parsing and JIT Driver
3  *===----------------------------------------------------------------------===*)
4
5 (* top ::= definition | external | expression | ';' *)
6 let 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