From c6f4a06b4297f498da4bc2cd747aa38effb855b0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 18 Feb 2018 01:06:48 +0300 Subject: G: value_parameters, patterns & let statement --- src/parser/grammar/patterns.rs | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/parser/grammar/patterns.rs (limited to 'src/parser/grammar/patterns.rs') 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 @@ +use super::*; + +pub(super) fn pattern(p: &mut Parser) { + match p.current() { + UNDERSCORE => placeholder_pat(p), + AMPERSAND => ref_pat(p), + IDENT | REF_KW => bind_pat(p), + _ => p.err_and_bump("expected pattern"), + } +} + +// test placeholder_pat +// fn main() { let _ = (); } +fn placeholder_pat(p: &mut Parser) { + assert!(p.at(UNDERSCORE)); + let m = p.start(); + p.bump(); + m.complete(p, PLACEHOLDER_PAT); +} + +// test ref_pat +// fn main() { +// let &a = (); +// let &mut b = (); +// } +fn ref_pat(p: &mut Parser) { + assert!(p.at(AMPERSAND)); + let m = p.start(); + p.bump(); + p.eat(MUT_KW); + pattern(p); + m.complete(p, REF_PAT); +} + +// test bind_pat +// fn main() { +// let a = (); +// let ref b = (); +// let ref mut c = (); +// let d @ _ = (); +// } +fn bind_pat(p: &mut Parser) { + let m = p.start(); + if p.eat(REF_KW) { + p.eat(MUT_KW); + } + name(p); + if p.eat(AT) { + pattern(p); + } + m.complete(p, BIND_PAT); +} -- cgit v1.2.3