50 lines
1.8 KiB
OCaml
50 lines
1.8 KiB
OCaml
|
(*===----------------------------------------------------------------------===
|
||
|
* Top-Level parsing and JIT Driver
|
||
|
*===----------------------------------------------------------------------===*)
|
||
|
|
||
|
open Llvm
|
||
|
open Llvm_executionengine
|
||
|
|
||
|
(* top ::= definition | external | expression | ';' *)
|
||
|
let rec main_loop the_fpm the_execution_engine stream =
|
||
|
match Stream.peek stream with
|
||
|
| None -> ()
|
||
|
|
||
|
(* ignore top-level semicolons. *)
|
||
|
| Some (Token.Kwd ';') ->
|
||
|
Stream.junk stream;
|
||
|
main_loop the_fpm the_execution_engine stream
|
||
|
|
||
|
| Some token ->
|
||
|
begin
|
||
|
try match token with
|
||
|
| Token.Def ->
|
||
|
let e = Parser.parse_definition stream in
|
||
|
print_endline "parsed a function definition.";
|
||
|
dump_value (Codegen.codegen_func the_fpm e);
|
||
|
| Token.Extern ->
|
||
|
let e = Parser.parse_extern stream in
|
||
|
print_endline "parsed an extern.";
|
||
|
dump_value (Codegen.codegen_proto e);
|
||
|
| _ ->
|
||
|
(* Evaluate a top-level expression into an anonymous function. *)
|
||
|
let e = Parser.parse_toplevel stream in
|
||
|
print_endline "parsed a top-level expr";
|
||
|
let the_function = Codegen.codegen_func the_fpm e in
|
||
|
dump_value the_function;
|
||
|
|
||
|
(* JIT the function, returning a function pointer. *)
|
||
|
let result = ExecutionEngine.run_function the_function [||]
|
||
|
the_execution_engine in
|
||
|
|
||
|
print_string "Evaluated to ";
|
||
|
print_float (GenericValue.as_float Codegen.double_type result);
|
||
|
print_newline ();
|
||
|
with Stream.Error s | Codegen.Error s ->
|
||
|
(* Skip token for error recovery. *)
|
||
|
Stream.junk stream;
|
||
|
print_endline s;
|
||
|
end;
|
||
|
print_string "ready> "; flush stdout;
|
||
|
main_loop the_fpm the_execution_engine stream
|