diff options
Diffstat (limited to 'src/comp/fe/parser.rs')
| -rw-r--r-- | src/comp/fe/parser.rs | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/src/comp/fe/parser.rs b/src/comp/fe/parser.rs index d2da7910..6ffd911e 100644 --- a/src/comp/fe/parser.rs +++ b/src/comp/fe/parser.rs @@ -1,25 +1,94 @@ import std._io; +import driver.session; +import util.common; state type parser = state obj { state fn peek() -> token.token; state fn bump(); + io fn err(str s); + fn get_session() -> session.session; + fn get_span() -> common.span; }; -fn new_parser(str path) -> parser { - state obj stdio_parser(mutable token.token tok, +state fn new_parser(session.session sess, str path) -> parser { + state obj stdio_parser(session.session sess, + mutable token.token tok, + mutable common.pos lo, + mutable common.pos hi, lexer.reader rdr) { state fn peek() -> token.token { ret tok; } + state fn bump() { tok = lexer.next_token(rdr); + lo = rdr.get_mark_pos(); + hi = rdr.get_curr_pos(); + } + + io fn err(str m) { + auto span = rec(filename = rdr.get_filename(), + lo = lo, hi = hi); + sess.span_err(span, m); + } + + fn get_session() -> session.session { + ret sess; + } + + fn get_span() -> common.span { + ret rec(filename = rdr.get_filename(), + lo = lo, hi = hi); } } auto srdr = _io.new_stdio_reader(path); auto rdr = lexer.new_reader(srdr, path); - ret stdio_parser(lexer.next_token(rdr), rdr); + auto npos = rdr.get_curr_pos(); + ret stdio_parser(sess, lexer.next_token(rdr), npos, npos, rdr); +} + +state fn expect(parser p, token.token t) { + // FIXME: comparing tags would be good. One of these days. + if (true /* p.peek() == t */) { + p.bump(); + } else { + let str s = "expecting "; + s += token.to_str(t); + s += ", found "; + s += token.to_str(t); + p.err(s); + } +} + +state fn parse_ident(parser p) -> ast.ident { + alt (p.peek()) { + case (token.IDENT(i)) { ret i; } + case (_) { + p.err("expecting ident"); + fail; + } + } +} + +state fn parse_item(parser p) -> tup(ast.ident, ast.item) { + alt (p.peek()) { + case (token.FN()) { + p.bump(); + auto id = parse_ident(p); + expect(p, token.LPAREN()); + let vec[rec(ast.slot slot, ast.ident ident)] inputs = vec(); + let vec[@ast.stmt] body = vec(); + auto output = rec(ty = ast.ty_nil(), mode = ast.val() ); + let ast._fn f = rec(inputs = inputs, + output = output, + body = body); + ret tup(id, ast.item_fn(@f)); + } + } + p.err("expecting item"); + fail; } // |