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