aboutsummaryrefslogtreecommitdiff
path: root/src/parser/grammar/patterns.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-02-17 22:06:48 +0000
committerAleksey Kladov <[email protected]>2018-02-17 22:06:48 +0000
commitc6f4a06b4297f498da4bc2cd747aa38effb855b0 (patch)
treea383a2e71da6029bbd6a5669b5f9d2b99a1b0a92 /src/parser/grammar/patterns.rs
parent8c4c5b5b802a204bfeef52e215358ae838900f1f (diff)
G: value_parameters, patterns & let statement
Diffstat (limited to 'src/parser/grammar/patterns.rs')
-rw-r--r--src/parser/grammar/patterns.rs52
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 @@
1use super::*;
2
3pub(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 _ = (); }
14fn 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// }
26fn 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// }
42fn 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}