From e4b84fbf36d04e54f68f914f724c8e804233d3aa Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 4 Aug 2018 17:17:20 +0300 Subject: Assignment expression --- src/algo/walk.rs | 1 + src/grammar/expressions/mod.rs | 14 +-- .../data/parser/inline/0074_expr_binding_power.rs | 3 +- .../data/parser/inline/0074_expr_binding_power.txt | 102 +++++++++++++-------- 4 files changed, 74 insertions(+), 46 deletions(-) diff --git a/src/algo/walk.rs b/src/algo/walk.rs index ad0f2d8fb..a50ec2a09 100644 --- a/src/algo/walk.rs +++ b/src/algo/walk.rs @@ -6,6 +6,7 @@ pub fn preorder<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator None, }) } + #[derive(Debug, Copy, Clone)] pub enum WalkEvent<'a> { Enter(SyntaxNodeRef<'a>), diff --git a/src/grammar/expressions/mod.rs b/src/grammar/expressions/mod.rs index cedbc235f..6831aef66 100644 --- a/src/grammar/expressions/mod.rs +++ b/src/grammar/expressions/mod.rs @@ -35,13 +35,15 @@ struct Restrictions { // test expr_binding_power // fn foo() { -// 1 + 2 * 3 == 1 * 2 + 3 +// 1 + 2 * 3 == 1 * 2 + 3; +// *x = 1 + 1; // } fn bp_of(op: SyntaxKind) -> u8 { match op { - EQEQ | NEQ => 1, - MINUS | PLUS => 2, - STAR | SLASH => 3, + EQ => 1, + EQEQ | NEQ => 2, + MINUS | PLUS => 3, + STAR | SLASH => 4, _ => 0 } } @@ -106,7 +108,7 @@ fn unary_expr(p: &mut Parser, r: Restrictions) -> Option { return Some(postfix_expr(p, lhs)) } }; - expr(p); + unary_expr(p, r); Some(m.complete(p, kind)) } @@ -247,7 +249,7 @@ fn struct_lit(p: &mut Parser) { fn bin_expr(p: &mut Parser, r: Restrictions, lhs: CompletedMarker, bp: u8) -> CompletedMarker { assert!(match p.current() { - MINUS | PLUS | STAR | SLASH | EQEQ | NEQ => true, + MINUS | PLUS | STAR | SLASH | EQEQ | NEQ | EQ => true, _ => false, }); let m = lhs.precede(p); diff --git a/tests/data/parser/inline/0074_expr_binding_power.rs b/tests/data/parser/inline/0074_expr_binding_power.rs index db855fd02..87afb036e 100644 --- a/tests/data/parser/inline/0074_expr_binding_power.rs +++ b/tests/data/parser/inline/0074_expr_binding_power.rs @@ -1,3 +1,4 @@ fn foo() { - 1 + 2 * 3 == 1 * 2 + 3 + 1 + 2 * 3 == 1 * 2 + 3; + *x = 1 + 1; } diff --git a/tests/data/parser/inline/0074_expr_binding_power.txt b/tests/data/parser/inline/0074_expr_binding_power.txt index 05aad25e9..384fd4354 100644 --- a/tests/data/parser/inline/0074_expr_binding_power.txt +++ b/tests/data/parser/inline/0074_expr_binding_power.txt @@ -1,5 +1,5 @@ -FILE@[0; 40) - FN_ITEM@[0; 40) +FILE@[0; 57) + FN_ITEM@[0; 57) FN_KW@[0; 2) NAME@[2; 6) WHITESPACE@[2; 3) @@ -8,41 +8,65 @@ FILE@[0; 40) L_PAREN@[6; 7) R_PAREN@[7; 8) WHITESPACE@[8; 9) - BLOCK_EXPR@[9; 40) + BLOCK_EXPR@[9; 57) L_CURLY@[9; 10) - BIN_EXPR@[10; 38) - BIN_EXPR@[10; 25) - LITERAL@[10; 17) - WHITESPACE@[10; 15) - INT_NUMBER@[15; 16) "1" - WHITESPACE@[16; 17) - PLUS@[17; 18) - BIN_EXPR@[18; 25) - LITERAL@[18; 21) - WHITESPACE@[18; 19) - INT_NUMBER@[19; 20) "2" - WHITESPACE@[20; 21) - STAR@[21; 22) - LITERAL@[22; 25) - WHITESPACE@[22; 23) - INT_NUMBER@[23; 24) "3" - WHITESPACE@[24; 25) - EQEQ@[25; 27) - BIN_EXPR@[27; 38) - BIN_EXPR@[27; 34) - LITERAL@[27; 30) - WHITESPACE@[27; 28) - INT_NUMBER@[28; 29) "1" - WHITESPACE@[29; 30) - STAR@[30; 31) - LITERAL@[31; 34) - WHITESPACE@[31; 32) - INT_NUMBER@[32; 33) "2" - WHITESPACE@[33; 34) - PLUS@[34; 35) - LITERAL@[35; 38) - WHITESPACE@[35; 36) - INT_NUMBER@[36; 37) "3" - WHITESPACE@[37; 38) - R_CURLY@[38; 39) - WHITESPACE@[39; 40) + EXPR_STMT@[10; 43) + BIN_EXPR@[10; 37) + BIN_EXPR@[10; 25) + LITERAL@[10; 17) + WHITESPACE@[10; 15) + INT_NUMBER@[15; 16) "1" + WHITESPACE@[16; 17) + PLUS@[17; 18) + BIN_EXPR@[18; 25) + LITERAL@[18; 21) + WHITESPACE@[18; 19) + INT_NUMBER@[19; 20) "2" + WHITESPACE@[20; 21) + STAR@[21; 22) + LITERAL@[22; 25) + WHITESPACE@[22; 23) + INT_NUMBER@[23; 24) "3" + WHITESPACE@[24; 25) + EQEQ@[25; 27) + BIN_EXPR@[27; 37) + BIN_EXPR@[27; 34) + LITERAL@[27; 30) + WHITESPACE@[27; 28) + INT_NUMBER@[28; 29) "1" + WHITESPACE@[29; 30) + STAR@[30; 31) + LITERAL@[31; 34) + WHITESPACE@[31; 32) + INT_NUMBER@[32; 33) "2" + WHITESPACE@[33; 34) + PLUS@[34; 35) + LITERAL@[35; 37) + WHITESPACE@[35; 36) + INT_NUMBER@[36; 37) "3" + SEMI@[37; 38) + WHITESPACE@[38; 43) + EXPR_STMT@[43; 55) + BIN_EXPR@[43; 53) + DEREF_EXPR@[43; 46) + STAR@[43; 44) + PATH_EXPR@[44; 46) + PATH@[44; 46) + PATH_SEGMENT@[44; 46) + NAME_REF@[44; 46) + IDENT@[44; 45) "x" + WHITESPACE@[45; 46) + EQ@[46; 47) + BIN_EXPR@[47; 53) + LITERAL@[47; 50) + WHITESPACE@[47; 48) + INT_NUMBER@[48; 49) "1" + WHITESPACE@[49; 50) + PLUS@[50; 51) + LITERAL@[51; 53) + WHITESPACE@[51; 52) + INT_NUMBER@[52; 53) "1" + SEMI@[53; 54) + WHITESPACE@[54; 55) + R_CURLY@[55; 56) + WHITESPACE@[56; 57) -- cgit v1.2.3