]> git.proxmox.com Git - rustc.git/blame - src/llvm/examples/OCaml-Kaleidoscope/Chapter3/toplevel.ml
Imported Upstream version 1.0.0+dfsg1
[rustc.git] / src / llvm / examples / OCaml-Kaleidoscope / Chapter3 / toplevel.ml
CommitLineData
223e47cc
LB
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