From 66182ed5d5e43962a46492ea41f19f9adeccc9e5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Jul 2018 12:51:00 +0300 Subject: Ref exprs --- src/grammar.ron | 1 + src/parser/grammar/expressions.rs | 23 ++++++++++++++++++++++- src/syntax_kinds/generated.rs | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/grammar.ron b/src/grammar.ron index f640ccb7b..9383abd19 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -126,6 +126,7 @@ Grammar( "TUPLE_EXPR", "PATH_EXPR", "CALL_EXPR", + "REF_EXPR", "EXTERN_BLOCK", "ENUM_VARIANT", diff --git a/src/parser/grammar/expressions.rs b/src/parser/grammar/expressions.rs index 7991b1921..4861536f8 100644 --- a/src/parser/grammar/expressions.rs +++ b/src/parser/grammar/expressions.rs @@ -26,7 +26,7 @@ pub(super) fn literal(p: &mut Parser) -> Option { } pub(super) fn expr(p: &mut Parser) { - let mut lhs = atom_expr(p); + let mut lhs = prefix_expr(p); while let Some(m) = lhs { match p.current() { @@ -36,6 +36,27 @@ pub(super) fn expr(p: &mut Parser) { } } +fn prefix_expr(p: &mut Parser) -> Option { + match p.current() { + AMPERSAND => Some(ref_expr(p)), + _ => atom_expr(p) + } +} + +// test ref_expr +// fn foo() { +// let _ = &1; +// let _ = &mut &f(); +// } +fn ref_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(AMPERSAND)); + let m = p.start(); + p.bump(); + p.eat(MUT_KW); + expr(p); + m.complete(p, REF_EXPR) +} + fn atom_expr(p: &mut Parser) -> Option { match literal(p) { Some(m) => return Some(m), diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 986df7814..dc391c4a7 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -117,6 +117,7 @@ pub enum SyntaxKind { TUPLE_EXPR, PATH_EXPR, CALL_EXPR, + REF_EXPR, EXTERN_BLOCK, ENUM_VARIANT, NAMED_FIELD, @@ -266,6 +267,7 @@ impl SyntaxKind { TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" }, PATH_EXPR => &SyntaxInfo { name: "PATH_EXPR" }, CALL_EXPR => &SyntaxInfo { name: "CALL_EXPR" }, + REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, -- cgit v1.2.3