40 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			OCaml
		
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			OCaml
		
	
	
	
(*===----------------------------------------------------------------------===
 | 
						|
 * Top-Level parsing and JIT Driver
 | 
						|
 *===----------------------------------------------------------------------===*)
 | 
						|
 | 
						|
open Llvm
 | 
						|
 | 
						|
(* top ::= definition | external | expression | ';' *)
 | 
						|
let rec main_loop stream =
 | 
						|
  match Stream.peek stream with
 | 
						|
  | None -> ()
 | 
						|
 | 
						|
  (* ignore top-level semicolons. *)
 | 
						|
  | Some (Token.Kwd ';') ->
 | 
						|
      Stream.junk stream;
 | 
						|
      main_loop 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 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";
 | 
						|
            dump_value (Codegen.codegen_func e);
 | 
						|
        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 stream
 |