Skip to content

Commit 0a2e7f2

Browse files
committed
Add restricted-parse mode, and parse bind expressions.
1 parent 2f6f0dc commit 0a2e7f2

File tree

1 file changed

+68
-10
lines changed

1 file changed

+68
-10
lines changed

src/comp/front/parser.rs

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ state type parser =
1515
fn peek() -> token.token;
1616
impure fn bump();
1717
impure fn err(str s);
18+
impure fn restrict(bool r);
19+
fn is_restricted() -> bool;
1820
fn get_session() -> session.session;
1921
fn get_span() -> common.span;
2022
fn next_def_id() -> ast.def_id;
@@ -27,6 +29,7 @@ impure fn new_parser(session.session sess,
2729
mutable common.pos lo,
2830
mutable common.pos hi,
2931
mutable ast.def_num def,
32+
mutable bool restricted,
3033
ast.crate_num crate,
3134
lexer.reader rdr)
3235
{
@@ -47,6 +50,14 @@ impure fn new_parser(session.session sess,
4750
sess.span_err(span, m);
4851
}
4952

53+
impure fn restrict(bool r) {
54+
restricted = r;
55+
}
56+
57+
fn is_restricted() -> bool {
58+
ret restricted;
59+
}
60+
5061
fn get_session() -> session.session {
5162
ret sess;
5263
}
@@ -65,7 +76,7 @@ impure fn new_parser(session.session sess,
6576
auto rdr = lexer.new_reader(srdr, path);
6677
auto npos = rdr.get_curr_pos();
6778
ret stdio_parser(sess, lexer.next_token(rdr),
68-
npos, npos, 0, crate, rdr);
79+
npos, npos, 0, false, crate, rdr);
6980
}
7081

7182
impure fn unexpected(parser p, token.token t) {
@@ -481,6 +492,32 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
481492
ex = ast.expr_rec(fs.node, ast.ann_none);
482493
}
483494

495+
case (token.BIND) {
496+
p.bump();
497+
auto e = parse_restricted_expr(p);
498+
impure fn parse_expr_opt(parser p) -> option.t[@ast.expr] {
499+
log "parse expr opt: " + token.to_str(p.peek());
500+
alt (p.peek()) {
501+
case (token.UNDERSCORE) {
502+
p.bump();
503+
ret none[@ast.expr];
504+
}
505+
case (_) {
506+
ret some[@ast.expr](parse_expr(p));
507+
}
508+
}
509+
}
510+
511+
auto pf = parse_expr_opt;
512+
auto es = parse_seq[option.t[@ast.expr]](token.LPAREN,
513+
token.RPAREN,
514+
some(token.COMMA),
515+
pf, p);
516+
hi = es.span;
517+
auto e_ = ast.expr_bind(e, es.node, ast.ann_none);
518+
e = @spanned(lo, hi, e_);
519+
}
520+
484521
case (_) {
485522
alt (parse_lit(p)) {
486523
case (some[ast.lit](?lit)) {
@@ -505,15 +542,19 @@ impure fn parse_path_expr(parser p) -> @ast.expr {
505542
alt (p.peek()) {
506543

507544
case (token.LPAREN) {
508-
// Call expr.
509-
auto pf = parse_expr;
510-
auto es = parse_seq[@ast.expr](token.LPAREN,
511-
token.RPAREN,
512-
some(token.COMMA),
513-
pf, p);
514-
hi = es.span;
515-
auto e_ = ast.expr_call(e, es.node, ast.ann_none);
516-
e = @spanned(lo, hi, e_);
545+
if (p.is_restricted()) {
546+
ret e;
547+
} else {
548+
// Call expr.
549+
auto pf = parse_expr;
550+
auto es = parse_seq[@ast.expr](token.LPAREN,
551+
token.RPAREN,
552+
some(token.COMMA),
553+
pf, p);
554+
hi = es.span;
555+
auto e_ = ast.expr_call(e, es.node, ast.ann_none);
556+
e = @spanned(lo, hi, e_);
557+
}
517558
}
518559

519560
case (token.DOT) {
@@ -865,7 +906,24 @@ impure fn parse_alt_expr(parser p) -> @ast.expr {
865906
ret @spanned(lo, hi, expr);
866907
}
867908

909+
910+
impure fn parse_restricted_expr(parser p) -> @ast.expr {
911+
ret parse_expr_res(p, true);
912+
}
913+
868914
impure fn parse_expr(parser p) -> @ast.expr {
915+
ret parse_expr_res(p, false);
916+
}
917+
918+
impure fn parse_expr_res(parser p, bool restrict) -> @ast.expr {
919+
auto old = p.is_restricted();
920+
p.restrict(restrict);
921+
auto e = parse_expr_inner(p);
922+
p.restrict(old);
923+
ret e;
924+
}
925+
926+
impure fn parse_expr_inner(parser p) -> @ast.expr {
869927
alt (p.peek()) {
870928
case (token.LBRACE) {
871929
auto blk = parse_block(p);

0 commit comments

Comments
 (0)