17abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(*===----------------------------------------------------------------------===
27abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao * Top-Level parsing and JIT Driver
37abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao *===----------------------------------------------------------------------===*)
47abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
57abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoopen Llvm
67abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
77abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(* top ::= definition | external | expression | ';' *)
87abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaolet rec main_loop stream =
97abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  match Stream.peek stream with
107abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | None -> ()
117abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
127abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* ignore top-level semicolons. *)
137abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | Some (Token.Kwd ';') ->
147abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      Stream.junk stream;
157abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      main_loop stream
167abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
177abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | Some token ->
187abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      begin
197abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao        try match token with
207abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao        | Token.Def ->
217abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            let e = Parser.parse_definition stream in
227abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            print_endline "parsed a function definition.";
237abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            dump_value (Codegen.codegen_func e);
247abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao        | Token.Extern ->
257abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            let e = Parser.parse_extern stream in
267abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            print_endline "parsed an extern.";
277abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            dump_value (Codegen.codegen_proto e);
287abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao        | _ ->
297abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            (* Evaluate a top-level expression into an anonymous function. *)
307abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            let e = Parser.parse_toplevel stream in
317abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            print_endline "parsed a top-level expr";
327abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao            dump_value (Codegen.codegen_func e);
337abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao        with Stream.Error s | Codegen.Error s ->
347abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao          (* Skip token for error recovery. *)
357abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao          Stream.junk stream;
367abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao          print_endline s;
377abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      end;
387abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      print_string "ready> "; flush stdout;
397abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      main_loop stream
40