diff options
Diffstat (limited to 'src/parser/grammar/patterns.rs')
-rw-r--r-- | src/parser/grammar/patterns.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/parser/grammar/patterns.rs b/src/parser/grammar/patterns.rs new file mode 100644 index 000000000..6e4f2236b --- /dev/null +++ b/src/parser/grammar/patterns.rs | |||
@@ -0,0 +1,52 @@ | |||
1 | use super::*; | ||
2 | |||
3 | pub(super) fn pattern(p: &mut Parser) { | ||
4 | match p.current() { | ||
5 | UNDERSCORE => placeholder_pat(p), | ||
6 | AMPERSAND => ref_pat(p), | ||
7 | IDENT | REF_KW => bind_pat(p), | ||
8 | _ => p.err_and_bump("expected pattern"), | ||
9 | } | ||
10 | } | ||
11 | |||
12 | // test placeholder_pat | ||
13 | // fn main() { let _ = (); } | ||
14 | fn placeholder_pat(p: &mut Parser) { | ||
15 | assert!(p.at(UNDERSCORE)); | ||
16 | let m = p.start(); | ||
17 | p.bump(); | ||
18 | m.complete(p, PLACEHOLDER_PAT); | ||
19 | } | ||
20 | |||
21 | // test ref_pat | ||
22 | // fn main() { | ||
23 | // let &a = (); | ||
24 | // let &mut b = (); | ||
25 | // } | ||
26 | fn ref_pat(p: &mut Parser) { | ||
27 | assert!(p.at(AMPERSAND)); | ||
28 | let m = p.start(); | ||
29 | p.bump(); | ||
30 | p.eat(MUT_KW); | ||
31 | pattern(p); | ||
32 | m.complete(p, REF_PAT); | ||
33 | } | ||
34 | |||
35 | // test bind_pat | ||
36 | // fn main() { | ||
37 | // let a = (); | ||
38 | // let ref b = (); | ||
39 | // let ref mut c = (); | ||
40 | // let d @ _ = (); | ||
41 | // } | ||
42 | fn bind_pat(p: &mut Parser) { | ||
43 | let m = p.start(); | ||
44 | if p.eat(REF_KW) { | ||
45 | p.eat(MUT_KW); | ||
46 | } | ||
47 | name(p); | ||
48 | if p.eat(AT) { | ||
49 | pattern(p); | ||
50 | } | ||
51 | m.complete(p, BIND_PAT); | ||
52 | } | ||