aboutsummaryrefslogtreecommitdiff
path: root/src/parser/event_parser/grammar/items.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-01-20 14:21:13 +0000
committerAleksey Kladov <[email protected]>2018-01-20 14:21:13 +0000
commit410f948c5f8711b951d16d6119d152cc159d9110 (patch)
tree87bd790171683ca532973795ec31759e9afbb655 /src/parser/event_parser/grammar/items.rs
parent3c612bfa3a86675ef18b1effcc76037cb6b9fddf (diff)
Drop high-order combinators
Diffstat (limited to 'src/parser/event_parser/grammar/items.rs')
-rw-r--r--src/parser/event_parser/grammar/items.rs179
1 files changed, 99 insertions, 80 deletions
diff --git a/src/parser/event_parser/grammar/items.rs b/src/parser/event_parser/grammar/items.rs
index 5b0180b81..7ae48b5db 100644
--- a/src/parser/event_parser/grammar/items.rs
+++ b/src/parser/event_parser/grammar/items.rs
@@ -2,93 +2,90 @@ use super::*;
2 2
3pub(super) fn mod_contents(p: &mut Parser) { 3pub(super) fn mod_contents(p: &mut Parser) {
4 attributes::inner_attributes(p); 4 attributes::inner_attributes(p);
5 repeat(p, |p| { 5 while !p.at(EOF) {
6 skip_to_first( 6 item(p);
7 p, item_first, mod_contents_item,
8 "expected item",
9 )
10 });
11}
12
13fn item_first(p: &Parser) -> bool {
14 match p.current() {
15 STRUCT_KW | FN_KW | EXTERN_KW | MOD_KW | USE_KW | POUND | PUB_KW => true,
16 _ => false,
17 } 7 }
18} 8}
19 9
20fn mod_contents_item(p: &mut Parser) { 10fn item(p: &mut Parser){
21 if item(p) {
22 if p.current() == SEMI {
23 node(p, ERROR, |p| {
24 p.error()
25 .message("expected item, found `;`\n\
26 consider removing this semicolon")
27 .emit();
28 p.bump();
29 })
30 }
31 }
32}
33
34fn item(p: &mut Parser) -> bool {
35 let attrs_start = p.mark(); 11 let attrs_start = p.mark();
36 attributes::outer_attributes(p); 12 attributes::outer_attributes(p);
37 visibility(p); 13 visibility(p);
38 // node_if(p, USE_KW, USE_ITEM, use_item) 14 let la = p.raw_lookahead(1);
39 // || extern crate_fn
40 // || node_if(p, STATIC_KW, STATIC_ITEM, static_item)
41 // || node_if(p, CONST_KW, CONST_ITEM, const_item) or const FN!
42 // || unsafe trait, impl
43 // || node_if(p, FN_KW, FN_ITEM, fn_item)
44 // || node_if(p, TYPE_KW, TYPE_ITEM, type_item)
45 let item_start = p.mark(); 15 let item_start = p.mark();
46 let item_parsed = node_if(p, [EXTERN_KW, CRATE_KW], EXTERN_CRATE_ITEM, extern_crate_item) 16 match p.current() {
47 || node_if(p, MOD_KW, MOD_ITEM, mod_item) 17 EXTERN_KW if la == CRATE_KW => extern_crate_item(p),
48 || node_if(p, USE_KW, USE_ITEM, use_item) 18 MOD_KW => mod_item(p),
49 || node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item) 19 USE_KW => use_item(p),
50 || node_if(p, FN_KW, FN_ITEM, fn_item); 20 STRUCT_KW => struct_item(p),
51 21 FN_KW => fn_item(p),
22 err_token => {
23 p.start(ERROR);
24 let message = if err_token == SEMI {
25 //TODO: if the item is incomplete, this messsage is misleading
26 "expected item, found `;`\n\
27 consider removing this semicolon"
28 } else {
29 "expected item"
30 };
31 p.error()
32 .message(message)
33 .emit();
34 p.bump();
35 p.finish();
36 return;
37 }
38 };
52 p.forward_parent(attrs_start, item_start); 39 p.forward_parent(attrs_start, item_start);
53 item_parsed
54} 40}
55 41
56fn struct_item(p: &mut Parser) { 42fn struct_item(p: &mut Parser) {
57 if !p.expect(IDENT) { 43 p.start(STRUCT_ITEM);
58 return 44
59 } 45 assert!(p.at(STRUCT_KW));
60 generic_parameters(p); 46 p.bump();
61 match p.current() { 47
62 WHERE_KW => { 48 struct_inner(p);
63 where_clause(p); 49 p.finish();
64 match p.current() { 50
65 SEMI => { 51 fn struct_inner(p: &mut Parser) {
66 p.bump(); 52 if !p.expect(IDENT) {
67 return 53 p.finish();
68 }
69 L_CURLY => named_fields(p),
70 _ => { //TODO: special case `(` error message
71 p.error()
72 .message("expected `;` or `{`")
73 .emit();
74 return
75 }
76 }
77 }
78 SEMI => {
79 p.bump();
80 return 54 return
81 } 55 }
82 L_CURLY => named_fields(p), 56 generic_parameters(p);
83 L_PAREN => { 57 match p.current() {
84 tuple_fields(p); 58 WHERE_KW => {
85 p.expect(SEMI); 59 where_clause(p);
86 }, 60 match p.current() {
87 _ => { 61 SEMI => {
88 p.error() 62 p.bump();
89 .message("expected `;`, `{`, or `(`") 63 return
90 .emit(); 64 }
91 return 65 L_CURLY => named_fields(p),
66 _ => { //TODO: special case `(` error message
67 p.error()
68 .message("expected `;` or `{`")
69 .emit();
70 return
71 }
72 }
73 }
74 SEMI => {
75 p.bump();
76 return
77 }
78 L_CURLY => named_fields(p),
79 L_PAREN => {
80 tuple_fields(p);
81 p.expect(SEMI);
82 },
83 _ => {
84 p.error()
85 .message("expected `;`, `{`, or `(`")
86 .emit();
87 return
88 }
92 } 89 }
93 } 90 }
94} 91}
@@ -135,17 +132,28 @@ fn where_clause(_: &mut Parser) {
135} 132}
136 133
137fn extern_crate_item(p: &mut Parser) { 134fn extern_crate_item(p: &mut Parser) {
135 p.start(EXTERN_CRATE_ITEM);
136
137 assert!(p.at(EXTERN_KW));
138 p.bump();
139
140 assert!(p.at(CRATE_KW));
141 p.bump();
142
138 p.expect(IDENT) && alias(p) && p.expect(SEMI); 143 p.expect(IDENT) && alias(p) && p.expect(SEMI);
144 p.finish();
139} 145}
140 146
141fn mod_item(p: &mut Parser) { 147fn mod_item(p: &mut Parser) {
142 if !p.expect(IDENT) { 148 p.start(MOD_ITEM);
143 return; 149
144 } 150 assert!(p.at(MOD_KW));
145 if p.eat(SEMI) { 151 p.bump();
146 return; 152
153 if p.expect(IDENT) && !p.eat(SEMI) {
154 p.curly_block(mod_contents);
147 } 155 }
148 p.curly_block(mod_contents); 156 p.finish()
149} 157}
150 158
151pub(super) fn is_use_tree_start(kind: SyntaxKind) -> bool { 159pub(super) fn is_use_tree_start(kind: SyntaxKind) -> bool {
@@ -153,8 +161,13 @@ pub(super) fn is_use_tree_start(kind: SyntaxKind) -> bool {
153} 161}
154 162
155fn use_item(p: &mut Parser) { 163fn use_item(p: &mut Parser) {
164 p.start(USE_ITEM);
165
166 assert!(p.at(USE_KW));
167 p.bump();
156 use_tree(p); 168 use_tree(p);
157 p.expect(SEMI); 169 p.expect(SEMI);
170 p.finish();
158 171
159 fn use_tree(p: &mut Parser) -> bool{ 172 fn use_tree(p: &mut Parser) -> bool{
160 if node_if(p, STAR, USE_TREE, |_| ()) { 173 if node_if(p, STAR, USE_TREE, |_| ()) {
@@ -210,8 +223,14 @@ fn use_item(p: &mut Parser) {
210 223
211 224
212fn fn_item(p: &mut Parser) { 225fn fn_item(p: &mut Parser) {
226 p.start(FN_ITEM);
227
228 assert!(p.at(FN_KW));
229 p.bump();
230
213 p.expect(IDENT) && p.expect(L_PAREN) && p.expect(R_PAREN) 231 p.expect(IDENT) && p.expect(L_PAREN) && p.expect(R_PAREN)
214 && p.curly_block(|_| ()); 232 && p.curly_block(|_| ());
233 p.finish();
215} 234}
216 235
217 236