@@ -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,72 @@ 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
+ ps. expect_char ( ' ' ) ?;
87
+ Ok ( ( ) )
88
+ }
109
89
110
- if ps. current_is ( '/' ) {
111
- content. push ( '\n' ) ;
112
- ps. next ( ) ;
113
- ps. expect_char ( '/' ) ?;
114
- ps. take_char_if ( ' ' ) ;
90
+ fn get_comment_level < I > ( ps : & mut ParserStream < I > ) -> Result < CommentLevel >
91
+ where
92
+ I : Iterator < Item = char > ,
93
+ {
94
+ let mut level = CommentLevel :: Comment ;
95
+ ps. peek ( ) ;
96
+ if ps. current_peek_is ( '#' ) {
97
+ ps. peek ( ) ;
98
+ if ps. current_peek_is ( '#' ) {
99
+ level = CommentLevel :: ResourceComment ;
115
100
} else {
116
- break ;
101
+ level = CommentLevel :: GroupComment ;
117
102
}
118
103
}
119
-
120
- Ok ( ast :: Comment { content } )
104
+ ps . reset_peek ( ) ;
105
+ Ok ( level )
121
106
}
122
107
123
- fn get_section < I > ( ps : & mut ParserStream < I > , comment : Option < ast :: Comment > ) -> Result < ast:: Entry >
108
+ fn get_comment < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: Comment >
124
109
where
125
110
I : Iterator < Item = char > ,
126
111
{
127
- ps . expect_char ( '[' ) ?;
128
- ps . expect_char ( '[' ) ?;
112
+ let level = get_comment_level ( ps ) ?;
113
+ get_comment_start ( ps , & level ) ?;
129
114
130
- ps. skip_line_ws ( ) ;
131
-
132
- let symb = get_symbol ( ps) ?;
133
-
134
- ps. skip_line_ws ( ) ;
115
+ let mut content = String :: new ( ) ;
135
116
136
- ps. expect_char ( ']' ) ?;
137
- ps. expect_char ( ']' ) ?;
117
+ loop {
118
+ while let Some ( ch) = ps. take_char ( |x| x != '\n' ) {
119
+ content. push ( ch) ;
120
+ }
138
121
139
- ps. skip_line_ws ( ) ;
122
+ ps. next ( ) ;
140
123
141
- ps. expect_char ( '\n' ) ?;
124
+ if !ps. current_is ( '#' ) || level != get_comment_level ( ps) ? {
125
+ break ;
126
+ } else {
127
+ get_comment_start ( ps, & level) ?;
128
+ }
129
+ }
142
130
143
- Ok ( ast:: Entry :: Section {
144
- name : symb,
145
- comment,
146
- } )
131
+ match level {
132
+ CommentLevel :: Comment => Ok ( ast:: Comment :: Comment { content } ) ,
133
+ CommentLevel :: GroupComment => Ok ( ast:: Comment :: GroupComment { content } ) ,
134
+ CommentLevel :: ResourceComment => Ok ( ast:: Comment :: ResourceComment { content } ) ,
135
+ }
147
136
}
148
137
149
138
fn get_message < I > ( ps : & mut ParserStream < I > , comment : Option < ast:: Comment > ) -> Result < ast:: Entry >
@@ -152,6 +141,11 @@ where
152
141
{
153
142
let id = get_private_identifier ( ps) ?;
154
143
144
+ if let Some ( ast:: Comment :: Comment { .. } ) = comment {
145
+ } else if comment. is_some ( ) {
146
+ return error ! ( ErrorKind :: Generic ) ;
147
+ }
148
+
155
149
ps. skip_line_ws ( ) ;
156
150
157
151
let pattern = if ps. current_is ( '=' ) {
@@ -261,12 +255,12 @@ where
261
255
return Ok ( ast:: VarKey :: Number ( get_number ( ps) ?) ) ;
262
256
}
263
257
_ => {
264
- return Ok ( ast:: VarKey :: Symbol ( get_symbol ( ps) ?) ) ;
258
+ return Ok ( ast:: VarKey :: VariantName ( get_variant_name ( ps) ?) ) ;
265
259
}
266
260
}
267
261
} else {
268
262
return error ! ( ErrorKind :: ExpectedField {
269
- field: "Symbol | Number" . to_owned( ) ,
263
+ field: "VariantName | Number" . to_owned( ) ,
270
264
} ) ;
271
265
}
272
266
}
@@ -323,7 +317,7 @@ where
323
317
Ok ( variants)
324
318
}
325
319
326
- fn get_symbol < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: Symbol >
320
+ fn get_variant_name < I > ( ps : & mut ParserStream < I > ) -> Result < ast:: VariantName >
327
321
where
328
322
I : Iterator < Item = char > ,
329
323
{
@@ -339,7 +333,7 @@ where
339
333
name. pop ( ) ;
340
334
}
341
335
342
- Ok ( ast:: Symbol { name } )
336
+ Ok ( ast:: VariantName { name } )
343
337
}
344
338
345
339
fn get_digits < I > ( ps : & mut ParserStream < I > ) -> Result < String >
0 commit comments