@@ -14,7 +14,6 @@ pub type Result<T> = result::Result<T, ParserError>;
14
14
15
15
pub fn parse ( source : & str ) -> result:: Result < ast:: Resource , ( ast:: Resource , Vec < ParserError > ) > {
16
16
let mut errors = vec ! [ ] ;
17
- let mut comment = None ;
18
17
19
18
let mut ps = ParserStream :: new ( source. chars ( ) ) ;
20
19
@@ -26,18 +25,9 @@ pub fn parse(source: &str) -> result::Result<ast::Resource, (ast::Resource, Vec<
26
25
let entry_start_pos = ps. get_index ( ) ;
27
26
28
27
match get_entry ( & mut ps) {
29
- Ok ( entry) => if entry_start_pos == 0 {
30
- match entry {
31
- ast:: Entry :: Comment ( c) => {
32
- comment = Some ( c) ;
33
- }
34
- _ => {
35
- entries. push ( entry) ;
36
- }
37
- }
38
- } else {
28
+ Ok ( entry) => {
39
29
entries. push ( entry) ;
40
- } ,
30
+ }
41
31
Err ( mut e) => {
42
32
let error_pos = ps. get_index ( ) ;
43
33
entries. push ( get_junk_entry ( & mut ps, source, entry_start_pos) ) ;
@@ -51,35 +41,22 @@ pub fn parse(source: &str) -> result::Result<ast::Resource, (ast::Resource, Vec<
51
41
}
52
42
53
43
if errors. is_empty ( ) {
54
- Ok ( ast:: Resource {
55
- body : entries,
56
- comment,
57
- } )
44
+ Ok ( ast:: Resource { body : entries } )
58
45
} else {
59
- Err ( (
60
- ast:: Resource {
61
- body : entries,
62
- comment,
63
- } ,
64
- errors,
65
- ) )
46
+ Err ( ( ast:: Resource { body : entries } , errors) )
66
47
}
67
48
}
68
49
69
50
fn get_entry < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: Entry >
70
51
where
71
52
I : Iterator < Item = char > ,
72
53
{
73
- let comment = if ps. current_is ( '/ ' ) {
54
+ let comment = if ps. current_is ( '# ' ) {
74
55
Some ( get_comment ( ps) ?)
75
56
} else {
76
57
None
77
58
} ;
78
59
79
- if ps. current_is ( '[' ) {
80
- return Ok ( get_section ( ps, comment) ?) ;
81
- }
82
-
83
60
if ps. is_message_id_start ( ) {
84
61
return Ok ( get_message ( ps, comment) ?) ;
85
62
}
@@ -90,60 +67,74 @@ where
90
67
}
91
68
}
92
69
93
- fn get_comment < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: Comment >
70
+ #[ derive( PartialEq , Copy , Clone ) ]
71
+ enum CommentLevel {
72
+ Comment = 0 ,
73
+ GroupComment = 1 ,
74
+ ResourceComment = 2 ,
75
+ }
76
+
77
+ fn get_comment_start < I > ( ps : & mut ParserStream < I > , level : & CommentLevel ) -> Result < ( ) >
94
78
where
95
79
I : Iterator < Item = char > ,
96
80
{
97
- ps. expect_char ( '/' ) ?;
98
- ps. expect_char ( '/' ) ?;
99
- ps. take_char_if ( ' ' ) ;
100
-
101
- let mut content = String :: new ( ) ;
102
-
103
- loop {
104
- while let Some ( ch) = ps. take_char ( |x| x != '\n' ) {
105
- content. push ( ch) ;
106
- }
81
+ let depth = * level as u8 ;
82
+ for _ in 0 ..( depth + 1 ) {
83
+ ps. expect_char ( '#' ) ?;
84
+ }
107
85
108
- ps. next ( ) ;
86
+ if !ps. current_is ( '\n' ) {
87
+ ps. expect_char ( ' ' ) ?;
88
+ }
89
+ Ok ( ( ) )
90
+ }
109
91
110
- if ps. current_is ( '/' ) {
111
- content. push ( '\n' ) ;
112
- ps. next ( ) ;
113
- ps. expect_char ( '/' ) ?;
114
- ps. take_char_if ( ' ' ) ;
92
+ fn get_comment_level < I > ( ps : & mut ParserStream < I > ) -> Result < CommentLevel >
93
+ where
94
+ I : Iterator < Item = char > ,
95
+ {
96
+ let mut level = CommentLevel :: Comment ;
97
+ ps. peek ( ) ;
98
+ if ps. current_peek_is ( '#' ) {
99
+ ps. peek ( ) ;
100
+ if ps. current_peek_is ( '#' ) {
101
+ level = CommentLevel :: ResourceComment ;
115
102
} else {
116
- break ;
103
+ level = CommentLevel :: GroupComment ;
117
104
}
118
105
}
119
-
120
- Ok ( ast :: Comment { content } )
106
+ ps . reset_peek ( ) ;
107
+ Ok ( level )
121
108
}
122
109
123
- fn get_section < I > ( ps : & mut ParserStream < I > , comment : Option < ast :: Comment > ) -> Result < ast:: Entry >
110
+ fn get_comment < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: Comment >
124
111
where
125
112
I : Iterator < Item = char > ,
126
113
{
127
- ps . expect_char ( '[' ) ?;
128
- ps . expect_char ( '[' ) ?;
114
+ let level = get_comment_level ( ps ) ?;
115
+ get_comment_start ( ps , & level ) ?;
129
116
130
- ps. skip_line_ws ( ) ;
131
-
132
- let symb = get_symbol ( ps) ?;
133
-
134
- ps. skip_line_ws ( ) ;
117
+ let mut content = String :: new ( ) ;
135
118
136
- ps. expect_char ( ']' ) ?;
137
- ps. expect_char ( ']' ) ?;
119
+ loop {
120
+ while let Some ( ch) = ps. take_char ( |x| x != '\n' ) {
121
+ content. push ( ch) ;
122
+ }
138
123
139
- ps. skip_line_ws ( ) ;
124
+ ps. next ( ) ;
140
125
141
- ps. expect_char ( '\n' ) ?;
126
+ if !ps. current_is ( '#' ) || level != get_comment_level ( ps) ? {
127
+ break ;
128
+ } else {
129
+ get_comment_start ( ps, & level) ?;
130
+ }
131
+ }
142
132
143
- Ok ( ast:: Entry :: Section {
144
- name : symb,
145
- comment,
146
- } )
133
+ match level {
134
+ CommentLevel :: Comment => Ok ( ast:: Comment :: Comment { content } ) ,
135
+ CommentLevel :: GroupComment => Ok ( ast:: Comment :: GroupComment { content } ) ,
136
+ CommentLevel :: ResourceComment => Ok ( ast:: Comment :: ResourceComment { content } ) ,
137
+ }
147
138
}
148
139
149
140
fn get_message < I > ( ps : & mut ParserStream < I > , comment : Option < ast:: Comment > ) -> Result < ast:: Entry >
@@ -152,6 +143,11 @@ where
152
143
{
153
144
let id = get_private_identifier ( ps) ?;
154
145
146
+ if let Some ( ast:: Comment :: Comment { .. } ) = comment {
147
+ } else if comment. is_some ( ) {
148
+ return error ! ( ErrorKind :: Generic ) ;
149
+ }
150
+
155
151
ps. skip_line_ws ( ) ;
156
152
157
153
let pattern = if ps. current_is ( '=' ) {
@@ -261,12 +257,12 @@ where
261
257
return Ok ( ast:: VarKey :: Number ( get_number ( ps) ?) ) ;
262
258
}
263
259
_ => {
264
- return Ok ( ast:: VarKey :: Symbol ( get_symbol ( ps) ?) ) ;
260
+ return Ok ( ast:: VarKey :: VariantName ( get_variant_name ( ps) ?) ) ;
265
261
}
266
262
}
267
263
} else {
268
264
return error ! ( ErrorKind :: ExpectedField {
269
- field: "Symbol | Number" . to_owned( ) ,
265
+ field: "VariantName | Number" . to_owned( ) ,
270
266
} ) ;
271
267
}
272
268
}
@@ -323,7 +319,7 @@ where
323
319
Ok ( variants)
324
320
}
325
321
326
- fn get_symbol < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: Symbol >
322
+ fn get_variant_name < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: VariantName >
327
323
where
328
324
I : Iterator < Item = char > ,
329
325
{
@@ -339,7 +335,7 @@ where
339
335
name. pop ( ) ;
340
336
}
341
337
342
- Ok ( ast:: Symbol { name } )
338
+ Ok ( ast:: VariantName { name } )
343
339
}
344
340
345
341
fn get_digits < I > ( ps : & mut ParserStream < I > ) -> Result < String >
0 commit comments