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