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