Home | History | Annotate | Download | only in Chapter3
      1 (*===----------------------------------------------------------------------===
      2  * Top-Level parsing and JIT Driver
      3  *===----------------------------------------------------------------------===*)
      4 
      5 open Llvm
      6 
      7 (* top ::= definition | external | expression | ';' *)
      8 let 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