@@ -1624,18 +1624,18 @@ fn parse_source_stmt(&parser p) -> @ast::stmt {
1624
1624
auto hi = p. get_span ( ) ;
1625
1625
ret @spanned ( lo, decl. span . hi , ast:: stmt_decl ( decl, p. get_ann ( ) ) ) ;
1626
1626
} 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
+ }
1639
1639
}
1640
1640
}
1641
1641
p. err ( "expected statement" ) ;
@@ -1918,7 +1918,15 @@ fn parse_mod_items(&parser p, token::token term) -> ast::_mod {
1918
1918
auto view_items = parse_view ( p) ;
1919
1919
let vec[ @ast:: item] items = [ ] ;
1920
1920
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
+ }
1922
1930
}
1923
1931
ret rec( view_items=view_items, items=items) ;
1924
1932
}
@@ -2144,57 +2152,38 @@ fn parse_auth(&parser p) -> ast::_auth {
2144
2152
fail;
2145
2153
}
2146
2154
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;
2164
2159
}
2165
2160
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 {
2169
2162
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) ) ;
2172
2164
} 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) ) ;
2175
2166
} 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) ) ;
2178
2168
} 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) ) ;
2181
2171
} 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) ) ;
2184
2173
} 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) ) ;
2189
2180
} else if ( eat_word ( p, "tag" ) ) {
2190
- ret parse_item_tag ( p) ;
2181
+ ret got_item ( parse_item_tag ( p) ) ;
2191
2182
} else if ( eat_word ( p, "obj" ) ) {
2192
- ret parse_item_obj ( p, lyr) ;
2183
+ ret got_item ( parse_item_obj ( p, lyr) ) ;
2193
2184
} else {
2194
- p. err ( "expected item but found " +
2195
- token:: to_str ( p. get_reader ( ) , p. peek ( ) ) ) ;
2185
+ ret no_item;
2196
2186
}
2197
- fail;
2198
2187
}
2199
2188
2200
2189
fn parse_meta_item ( & parser p) -> @ast:: meta_item {
0 commit comments