@@ -3,116 +3,130 @@ import ast_util::spanned;
3
3
import common:: { parser_common, seq_sep} ;
4
4
5
5
export attr_or_ext;
6
- export parse_outer_attributes;
7
- export parse_outer_attrs_or_ext;
8
- export parse_inner_attrs_and_next;
9
- export parse_optional_meta;
6
+ export parser_attr;
10
7
11
8
// A type to distingush between the parsing of item attributes or syntax
12
9
// extensions, which both begin with token.POUND
13
10
type attr_or_ext = option < either < [ ast:: attribute ] , @ast:: expr > > ;
14
11
15
- fn parse_outer_attrs_or_ext (
16
- p : parser ,
17
- first_item_attrs : [ ast:: attribute ] ) -> attr_or_ext {
18
- let expect_item_next = vec:: is_not_empty ( first_item_attrs) ;
19
- if p. token == token:: POUND {
20
- let lo = p. span . lo ;
21
- if p. look_ahead ( 1 u) == token:: LBRACKET {
22
- p. bump ( ) ;
23
- let first_attr = parse_attribute_naked ( p, ast:: attr_outer, lo) ;
24
- ret some( left ( [ first_attr] + parse_outer_attributes ( p) ) ) ;
25
- } else if !( p. look_ahead ( 1 u) == token:: LT
26
- || p. look_ahead ( 1 u) == token:: LBRACKET
27
- || expect_item_next) {
28
- p. bump ( ) ;
29
- ret some( right ( p. parse_syntax_ext_naked ( lo) ) ) ;
12
+ impl parser_attr for parser {
13
+
14
+ fn parse_outer_attrs_or_ext ( first_item_attrs : [ ast:: attribute ] )
15
+ -> attr_or_ext
16
+ {
17
+ let expect_item_next = vec:: is_not_empty ( first_item_attrs) ;
18
+ if self . token == token:: POUND {
19
+ let lo = self . span . lo ;
20
+ if self . look_ahead ( 1 u) == token:: LBRACKET {
21
+ self . bump ( ) ;
22
+ let first_attr =
23
+ self . parse_attribute_naked ( ast:: attr_outer, lo) ;
24
+ ret some( left ( [ first_attr] + self . parse_outer_attributes ( ) ) ) ;
25
+ } else if !( self . look_ahead ( 1 u) == token:: LT
26
+ || self . look_ahead ( 1 u) == token:: LBRACKET
27
+ || expect_item_next) {
28
+ self . bump ( ) ;
29
+ ret some( right ( self . parse_syntax_ext_naked ( lo) ) ) ;
30
+ } else { ret none; }
30
31
} else { ret none; }
31
- } else { ret none; }
32
- }
32
+ }
33
33
34
- // Parse attributes that appear before an item
35
- fn parse_outer_attributes ( p : parser ) -> [ ast:: attribute ] {
36
- let mut attrs: [ ast:: attribute ] = [ ] ;
37
- while p. token == token:: POUND && p. look_ahead ( 1 u) == token:: LBRACKET {
38
- attrs += [ parse_attribute ( p, ast:: attr_outer) ] ;
34
+ // Parse attributes that appear before an item
35
+ fn parse_outer_attributes ( ) -> [ ast:: attribute ] {
36
+ let mut attrs: [ ast:: attribute ] = [ ] ;
37
+ while self . token == token:: POUND
38
+ && self . look_ahead ( 1 u) == token:: LBRACKET {
39
+ attrs += [ self . parse_attribute ( ast:: attr_outer) ] ;
40
+ }
41
+ ret attrs;
39
42
}
40
- ret attrs;
41
- }
42
43
43
- fn parse_attribute ( p : parser , style : ast:: attr_style ) -> ast:: attribute {
44
- let lo = p . span . lo ;
45
- p . expect ( token:: POUND ) ;
46
- ret parse_attribute_naked ( p , style, lo) ;
47
- }
44
+ fn parse_attribute ( style : ast:: attr_style ) -> ast:: attribute {
45
+ let lo = self . span . lo ;
46
+ self . expect ( token:: POUND ) ;
47
+ ret self . parse_attribute_naked ( style, lo) ;
48
+ }
48
49
49
- fn parse_attribute_naked ( p : parser , style : ast:: attr_style , lo : uint ) ->
50
- ast:: attribute {
51
- p . expect ( token:: LBRACKET ) ;
52
- let meta_item = parse_meta_item ( p ) ;
53
- p . expect ( token:: RBRACKET ) ;
54
- let mut hi = p . span . hi ;
55
- ret spanned( lo, hi, { style: style, value: * meta_item} ) ;
56
- }
50
+ fn parse_attribute_naked ( style : ast:: attr_style , lo : uint ) ->
51
+ ast:: attribute {
52
+ self . expect ( token:: LBRACKET ) ;
53
+ let meta_item = self . parse_meta_item ( ) ;
54
+ self . expect ( token:: RBRACKET ) ;
55
+ let mut hi = self . span . hi ;
56
+ ret spanned( lo, hi, { style: style, value: * meta_item} ) ;
57
+ }
57
58
58
- // Parse attributes that appear after the opening of an item, each terminated
59
- // by a semicolon. In addition to a vector of inner attributes, this function
60
- // also returns a vector that may contain the first outer attribute of the
61
- // next item (since we can't know whether the attribute is an inner attribute
62
- // of the containing item or an outer attribute of the first contained item
63
- // until we see the semi).
64
- fn parse_inner_attrs_and_next ( p : parser ) ->
65
- { inner : [ ast:: attribute ] , next : [ ast:: attribute ] } {
66
- let mut inner_attrs: [ ast:: attribute ] = [ ] ;
67
- let mut next_outer_attrs: [ ast:: attribute ] = [ ] ;
68
- while p. token == token:: POUND {
69
- if p. look_ahead ( 1 u) != token:: LBRACKET {
70
- // This is an extension
71
- break ;
59
+ // Parse attributes that appear after the opening of an item, each
60
+ // terminated by a semicolon. In addition to a vector of inner attributes,
61
+ // this function also returns a vector that may contain the first outer
62
+ // attribute of the next item (since we can't know whether the attribute
63
+ // is an inner attribute of the containing item or an outer attribute of
64
+ // the first contained item until we see the semi).
65
+ fn parse_inner_attrs_and_next ( ) ->
66
+ { inner : [ ast:: attribute ] , next : [ ast:: attribute ] } {
67
+ let mut inner_attrs: [ ast:: attribute ] = [ ] ;
68
+ let mut next_outer_attrs: [ ast:: attribute ] = [ ] ;
69
+ while self . token == token:: POUND {
70
+ if self . look_ahead ( 1 u) != token:: LBRACKET {
71
+ // This is an extension
72
+ break ;
73
+ }
74
+ let attr = self . parse_attribute ( ast:: attr_inner) ;
75
+ if self . token == token:: SEMI {
76
+ self . bump ( ) ;
77
+ inner_attrs += [ attr] ;
78
+ } else {
79
+ // It's not really an inner attribute
80
+ let outer_attr =
81
+ spanned ( attr. span . lo , attr. span . hi ,
82
+ { style: ast:: attr_outer, value: attr. node . value } ) ;
83
+ next_outer_attrs += [ outer_attr] ;
84
+ break ;
85
+ }
72
86
}
73
- let attr = parse_attribute ( p, ast:: attr_inner) ;
74
- if p. token == token:: SEMI {
75
- p. bump ( ) ;
76
- inner_attrs += [ attr] ;
77
- } else {
78
- // It's not really an inner attribute
79
- let outer_attr =
80
- spanned ( attr. span . lo , attr. span . hi ,
81
- { style: ast:: attr_outer, value: attr. node . value } ) ;
82
- next_outer_attrs += [ outer_attr] ;
83
- break ;
87
+ ret { inner : inner_attrs, next : next_outer_attrs} ;
88
+ }
89
+
90
+ fn parse_meta_item ( ) -> @ast:: meta_item {
91
+ let lo = self . span . lo ;
92
+ let ident = self . parse_ident ( ) ;
93
+ alt self. token {
94
+ token:: EQ {
95
+ self. bump ( ) ;
96
+ let lit = self . parse_lit ( ) ;
97
+ let mut hi = self . span . hi ;
98
+ ret @spanned ( lo, hi, ast:: meta_name_value ( ident, lit) ) ;
99
+ }
100
+ token:: LPAREN {
101
+ let inner_items = self . parse_meta_seq ( ) ;
102
+ let mut hi = self . span . hi ;
103
+ ret @spanned ( lo, hi, ast:: meta_list ( ident, inner_items) ) ;
104
+ }
105
+ _ {
106
+ let mut hi = self . span . hi ;
107
+ ret @spanned( lo, hi, ast:: meta_word( ident) ) ;
108
+ }
84
109
}
85
110
}
86
- ret { inner : inner_attrs, next : next_outer_attrs} ;
87
- }
88
111
89
- fn parse_meta_item ( p : parser ) -> @ast:: meta_item {
90
- let lo = p. span . lo ;
91
- let ident = p. parse_ident ( ) ;
92
- alt p. token {
93
- token:: EQ {
94
- p. bump ( ) ;
95
- let lit = p. parse_lit ( ) ;
96
- let mut hi = p. span . hi ;
97
- ret @spanned ( lo, hi, ast:: meta_name_value ( ident, lit) ) ;
98
- }
99
- token:: LPAREN {
100
- let inner_items = parse_meta_seq( p) ;
101
- let mut hi = p. span . hi ;
102
- ret @spanned ( lo, hi, ast:: meta_list ( ident, inner_items) ) ;
103
- }
104
- _ {
105
- let mut hi = p. span . hi ;
106
- ret @spanned ( lo, hi, ast:: meta_word ( ident) ) ;
107
- }
112
+ fn parse_meta_seq ( ) -> [ @ast:: meta_item ] {
113
+ ret self . parse_seq ( token:: LPAREN , token:: RPAREN ,
114
+ seq_sep ( token:: COMMA ) ,
115
+ { |p| p. parse_meta_item ( ) } ) . node ;
108
116
}
109
- }
110
117
111
- fn parse_meta_seq ( p : parser ) -> [ @ast:: meta_item ] {
112
- ret p. parse_seq ( token:: LPAREN , token:: RPAREN , seq_sep ( token:: COMMA ) ,
113
- { |p| parse_meta_item ( p) } ) . node ;
118
+ fn parse_optional_meta ( ) -> [ @ast:: meta_item ] {
119
+ alt self . token { token:: LPAREN { ret self. parse_meta_seq( ) ; }
120
+ _ { ret [ ] ; } }
121
+ }
114
122
}
115
123
116
- fn parse_optional_meta ( p : parser ) -> [ @ast:: meta_item ] {
117
- alt p. token { token:: LPAREN { ret parse_meta_seq( p) ; } _ { ret [ ] ; } }
118
- }
124
+ //
125
+ // Local Variables:
126
+ // mode: rust
127
+ // fill-column: 78;
128
+ // indent-tabs-mode: nil
129
+ // c-basic-offset: 4
130
+ // buffer-file-coding-system: utf-8-unix
131
+ // End:
132
+ //
0 commit comments