You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			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
 |