| (*===----------------------------------------------------------------------=== |
| * Top-Level parsing and JIT Driver |
| *===----------------------------------------------------------------------===*) |
| |
| (* top ::= definition | external | expression | ';' *) |
| let rec main_loop stream = |
| match Stream.peek stream with |
| | None -> () |
| |
| (* ignore top-level semicolons. *) |
| | Some (Token.Kwd ';') -> |
| Stream.junk stream; |
| main_loop stream |
| |
| | Some token -> |
| begin |
| try match token with |
| | Token.Def -> |
| ignore(Parser.parse_definition stream); |
| print_endline "parsed a function definition."; |
| | Token.Extern -> |
| ignore(Parser.parse_extern stream); |
| print_endline "parsed an extern."; |
| | _ -> |
| (* Evaluate a top-level expression into an anonymous function. *) |
| ignore(Parser.parse_toplevel stream); |
| print_endline "parsed a top-level expr"; |
| with Stream.Error s -> |
| (* Skip token for error recovery. *) |
| Stream.junk stream; |
| print_endline s; |
| end; |
| print_string "ready> "; flush stdout; |
| main_loop stream |