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