From 2bbd4c510d2da5c78f566b28e90548102bb107dc Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Aug 2018 00:19:04 +0300 Subject: not expr --- src/grammar.ron | 1 + src/grammar/expressions.rs | 24 +++++++++++++++++++----- src/syntax_kinds/generated.rs | 2 ++ 3 files changed, 22 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/grammar.ron b/src/grammar.ron index 9912f9698..782771830 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -132,6 +132,7 @@ Grammar( "FIELD_EXPR", "REF_EXPR", "DEREF_EXPR", + "NOT_EXPR", "LAMBDA_EXPR", "STRUCT_LIT", "STRUCT_LIT_FIELD", diff --git a/src/grammar/expressions.rs b/src/grammar/expressions.rs index ed9236b02..c638e8b99 100644 --- a/src/grammar/expressions.rs +++ b/src/grammar/expressions.rs @@ -103,11 +103,13 @@ fn let_stmt(p: &mut Parser) { } fn prefix_expr(p: &mut Parser) -> Option { - match p.current() { - AMPERSAND => Some(ref_expr(p)), - STAR => Some(deref_expr(p)), - _ => atom_expr(p), - } + let done = match p.current() { + AMPERSAND => ref_expr(p), + STAR => deref_expr(p), + EXCL => not_expr(p), + _ => return atom_expr(p), + }; + Some(done) } // test ref_expr @@ -136,6 +138,18 @@ fn deref_expr(p: &mut Parser) -> CompletedMarker { m.complete(p, DEREF_EXPR) } +// test not_expr +// fn foo() { +// !!true; +// } +fn not_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(EXCL)); + let m = p.start(); + p.bump(); + expr(p); + m.complete(p, NOT_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 35d9640fa..746316ed5 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -123,6 +123,7 @@ pub enum SyntaxKind { FIELD_EXPR, REF_EXPR, DEREF_EXPR, + NOT_EXPR, LAMBDA_EXPR, STRUCT_LIT, STRUCT_LIT_FIELD, @@ -287,6 +288,7 @@ impl SyntaxKind { FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" }, + NOT_EXPR => &SyntaxInfo { name: "NOT_EXPR" }, LAMBDA_EXPR => &SyntaxInfo { name: "LAMBDA_EXPR" }, STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, -- cgit v1.2.3