Skip to content

Commit 687e06c

Browse files
committed
---
yaml --- r: 3061 b: refs/heads/master c: 8c06d1b h: refs/heads/master i: 3059: da430d3 v: v3
1 parent 1e0c22c commit 687e06c

File tree

2 files changed

+42
-53
lines changed

2 files changed

+42
-53
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 355c417267371293f48333388fed7eb56c3a8b1f
2+
refs/heads/master: 8c06d1bcb01f1b45946adb8620149056b8e70d54

trunk/src/comp/front/parser.rs

Lines changed: 41 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,18 +1624,18 @@ fn parse_source_stmt(&parser p) -> @ast::stmt {
16241624
auto hi = p.get_span();
16251625
ret @spanned(lo, decl.span.hi, ast::stmt_decl(decl, p.get_ann()));
16261626
} else {
1627-
if (peeking_at_item(p)) {
1628-
// Might be a local item decl.
1629-
auto i = parse_item(p);
1630-
auto hi = i.span.hi;
1631-
auto decl = @spanned(lo, hi, ast::decl_item(i));
1632-
ret @spanned(lo, hi, ast::stmt_decl(decl, p.get_ann()));
1633-
1634-
} else {
1635-
// Remainder are line-expr stmts.
1636-
auto e = parse_expr(p);
1637-
auto hi = p.get_span();
1638-
ret @spanned(lo, e.span.hi, ast::stmt_expr(e, p.get_ann()));
1627+
alt (parse_item(p)) {
1628+
case (got_item(?i)) {
1629+
auto hi = i.span.hi;
1630+
auto decl = @spanned(lo, hi, ast::decl_item(i));
1631+
ret @spanned(lo, hi, ast::stmt_decl(decl, p.get_ann()));
1632+
}
1633+
case (no_item) {
1634+
// Remainder are line-expr stmts.
1635+
auto e = parse_expr(p);
1636+
auto hi = p.get_span();
1637+
ret @spanned(lo, e.span.hi, ast::stmt_expr(e, p.get_ann()));
1638+
}
16391639
}
16401640
}
16411641
p.err("expected statement");
@@ -1918,7 +1918,15 @@ fn parse_mod_items(&parser p, token::token term) -> ast::_mod {
19181918
auto view_items = parse_view(p);
19191919
let vec[@ast::item] items = [];
19201920
while (p.peek() != term) {
1921-
items += [parse_item(p)];
1921+
alt (parse_item(p)) {
1922+
case (got_item(?i)) {
1923+
vec::push(items, i);
1924+
}
1925+
case (_) {
1926+
p.err("expected item but found " +
1927+
token::to_str(p.get_reader(), p.peek()));
1928+
}
1929+
}
19221930
}
19231931
ret rec(view_items=view_items, items=items);
19241932
}
@@ -2144,57 +2152,38 @@ fn parse_auth(&parser p) -> ast::_auth {
21442152
fail;
21452153
}
21462154

2147-
fn peeking_at_item(&parser p) -> bool {
2148-
alt (p.peek()) {
2149-
case (token::IDENT(?sid, false)) {
2150-
auto st = p.get_str(sid);
2151-
ret str::eq(st, "state") ||
2152-
str::eq(st, "gc") ||
2153-
str::eq(st, "const") ||
2154-
str::eq(st, "fn") ||
2155-
str::eq(st, "pred") ||
2156-
str::eq(st, "iter") ||
2157-
str::eq(st, "mod") ||
2158-
str::eq(st, "type") ||
2159-
str::eq(st, "tag") ||
2160-
str::eq(st, "obj");
2161-
}
2162-
case (_) { ret false; }
2163-
}
2155+
// FIXME will be extended to help parse anon functions
2156+
tag parsed_item {
2157+
got_item(@ast::item);
2158+
no_item;
21642159
}
21652160

2166-
fn parse_item(&parser p) -> @ast::item {
2167-
let ast::layer lyr = parse_layer(p);
2168-
2161+
fn parse_item(&parser p) -> parsed_item {
21692162
if (eat_word(p, "const")) {
2170-
assert (lyr == ast::layer_value);
2171-
ret parse_item_const(p);
2163+
ret got_item(parse_item_const(p));
21722164
} else if (eat_word(p, "fn")) {
2173-
assert (lyr == ast::layer_value);
2174-
ret parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_fn);
2165+
ret got_item(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_fn));
21752166
} else if (eat_word(p, "pred")) {
2176-
assert (lyr == ast::layer_value);
2177-
ret parse_item_fn_or_iter(p, ast::pure_fn, ast::proto_fn);
2167+
ret got_item(parse_item_fn_or_iter(p, ast::pure_fn, ast::proto_fn));
21782168
} else if (eat_word(p, "iter")) {
2179-
assert (lyr == ast::layer_value);
2180-
ret parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_iter);
2169+
ret got_item(parse_item_fn_or_iter(p, ast::impure_fn,
2170+
ast::proto_iter));
21812171
} else if (eat_word(p, "mod")) {
2182-
assert (lyr == ast::layer_value);
2183-
ret parse_item_mod(p);
2172+
ret got_item(parse_item_mod(p));
21842173
} else if (eat_word(p, "native")) {
2185-
assert (lyr == ast::layer_value);
2186-
ret parse_item_native_mod(p);
2187-
} else if (eat_word(p, "type")) {
2188-
ret parse_item_type(p);
2174+
ret got_item(parse_item_native_mod(p));
2175+
}
2176+
2177+
auto lyr = parse_layer(p);
2178+
if (eat_word(p, "type")) {
2179+
ret got_item(parse_item_type(p));
21892180
} else if (eat_word(p, "tag")) {
2190-
ret parse_item_tag(p);
2181+
ret got_item(parse_item_tag(p));
21912182
} else if (eat_word(p, "obj")) {
2192-
ret parse_item_obj(p, lyr);
2183+
ret got_item(parse_item_obj(p, lyr));
21932184
} else {
2194-
p.err("expected item but found " +
2195-
token::to_str(p.get_reader(), p.peek()));
2185+
ret no_item;
21962186
}
2197-
fail;
21982187
}
21992188

22002189
fn parse_meta_item(&parser p) -> @ast::meta_item {

0 commit comments

Comments
 (0)