1 (*===----------------------------------------------------------------------===
2 * Top-Level parsing and JIT Driver
3 *===----------------------------------------------------------------------===*)
6 open Llvm_executionengine
8 (* top ::= definition | external | expression | ';' *)
9 let rec main_loop the_fpm the_execution_engine stream =
10 match Stream.peek stream with
13 (* ignore top-level semicolons. *)
14 | Some (Token.Kwd ';') ->
16 main_loop the_fpm the_execution_engine stream
22 let e = Parser.parse_definition stream in
23 print_endline "parsed a function definition.";
24 dump_value (Codegen.codegen_func the_fpm e);
26 let e = Parser.parse_extern stream in
27 print_endline "parsed an extern.";
28 dump_value (Codegen.codegen_proto e);
30 (* Evaluate a top-level expression into an anonymous function. *)
31 let e = Parser.parse_toplevel stream in
32 print_endline "parsed a top-level expr";
33 let the_function = Codegen.codegen_func the_fpm e in
34 dump_value the_function;
36 (* JIT the function, returning a function pointer. *)
37 let result = ExecutionEngine.run_function the_function [||]
38 the_execution_engine in
40 print_string "Evaluated to ";
41 print_float (GenericValue.as_float Codegen.double_type result);
43 with Stream.Error s | Codegen.Error s ->
44 (* Skip token for error recovery. *)
48 print_string "ready> "; flush stdout;
49 main_loop the_fpm the_execution_engine stream