From 8908e51aeaee91d6b63684a21ed1ca16de49916f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 7 Aug 2018 14:24:03 +0300 Subject: full precedence --- src/grammar.ron | 5 + src/grammar/expressions/mod.rs | 56 ++++--- src/parser_api.rs | 4 + src/parser_impl/mod.rs | 6 + src/syntax_kinds/generated.rs | 14 ++ .../data/parser/inline/0074_expr_binding_power.rs | 4 - .../data/parser/inline/0074_expr_binding_power.txt | 72 -------- tests/data/parser/inline/0079_compound_ops.txt | 72 -------- .../data/parser/inline/0082_range_binding_power.rs | 5 - .../parser/inline/0082_range_binding_power.txt | 72 -------- tests/data/parser/inline/0084_compound_ops.rs | 6 - tests/data/parser/inline/0084_compound_ops.txt | 89 ---------- tests/data/parser/inline/0085_neg_expr.rs | 3 + tests/data/parser/inline/0085_neg_expr.txt | 24 +++ .../data/parser/ok/0028_operator_binding_power.rs | 14 ++ .../data/parser/ok/0028_operator_binding_power.txt | 185 +++++++++++++++++++++ tests/data/parser/ok/0029_range_forms.rs | 5 + tests/data/parser/ok/0029_range_forms.txt | 68 ++++++++ 18 files changed, 358 insertions(+), 346 deletions(-) delete mode 100644 tests/data/parser/inline/0074_expr_binding_power.rs delete mode 100644 tests/data/parser/inline/0074_expr_binding_power.txt delete mode 100644 tests/data/parser/inline/0079_compound_ops.txt delete mode 100644 tests/data/parser/inline/0082_range_binding_power.rs delete mode 100644 tests/data/parser/inline/0082_range_binding_power.txt delete mode 100644 tests/data/parser/inline/0084_compound_ops.rs delete mode 100644 tests/data/parser/inline/0084_compound_ops.txt create mode 100644 tests/data/parser/inline/0085_neg_expr.rs create mode 100644 tests/data/parser/inline/0085_neg_expr.txt create mode 100644 tests/data/parser/ok/0028_operator_binding_power.rs create mode 100644 tests/data/parser/ok/0028_operator_binding_power.txt create mode 100644 tests/data/parser/ok/0029_range_forms.rs create mode 100644 tests/data/parser/ok/0029_range_forms.txt diff --git a/src/grammar.ron b/src/grammar.ron index b525476c2..0620a8b8c 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -43,6 +43,10 @@ Grammar( ["-=", "MINUSEQ"], ["&&", "AMPAMP"], ["||", "PIPEPIPE"], + ["<<", "SHL"], + [">>", "SHR"], + ["<<=", "SHLEQ"], + [">>=", "SHREQ"], ], keywords: [ "use", @@ -168,6 +172,7 @@ Grammar( "REF_EXPR", "DEREF_EXPR", "NOT_EXPR", + "NEG_EXPR", "RANGE_EXPR", // just weird "BIN_EXPR", diff --git a/src/grammar/expressions/mod.rs b/src/grammar/expressions/mod.rs index c137fe654..5b7228146 100644 --- a/src/grammar/expressions/mod.rs +++ b/src/grammar/expressions/mod.rs @@ -3,7 +3,7 @@ mod atom; use super::*; pub(super) use self::atom::literal; -const EXPR_FIRST: TokenSet = UNARY_EXPR_FIRST; +const EXPR_FIRST: TokenSet = LHS_FIRST; pub(super) fn expr(p: &mut Parser) { let r = Restrictions { forbid_structs: false }; @@ -38,26 +38,6 @@ enum Op { Composite(SyntaxKind, u8), } -// test expr_binding_power -// fn foo() { -// 1 + 2 * 3 == 1 * 2 + 3; -// *x = 1 + 1; -// } - -// test range_binding_power -// fn foo() { -// .. 1 + 1; -// .. z = 2; -// x = false .. 1 == 1; -// } - -// test compound_ops -// fn foo() { -// x += 1; -// 1 + 1 <= 2 * 3; -// z -= 3 >= 0; -// true || true && false; -// } fn current_op(p: &Parser) -> (u8, Op) { if p.at_compound2(PLUS, EQ) { return (1, Op::Composite(PLUSEQ, 2)); @@ -65,6 +45,12 @@ fn current_op(p: &Parser) -> (u8, Op) { if p.at_compound2(MINUS, EQ) { return (1, Op::Composite(MINUSEQ, 2)); } + if p.at_compound3(L_ANGLE, L_ANGLE, EQ) { + return (1, Op::Composite(SHLEQ, 3)); + } + if p.at_compound3(R_ANGLE, R_ANGLE, EQ) { + return (1, Op::Composite(SHREQ, 3)); + } if p.at_compound2(PIPE, PIPE) { return (3, Op::Composite(PIPEPIPE, 2)); } @@ -77,13 +63,22 @@ fn current_op(p: &Parser) -> (u8, Op) { if p.at_compound2(R_ANGLE, EQ) { return (5, Op::Composite(GTEQ, 2)); } + if p.at_compound2(L_ANGLE, L_ANGLE) { + return (9, Op::Composite(SHL, 2)); + } + if p.at_compound2(R_ANGLE, R_ANGLE) { + return (9, Op::Composite(SHR, 2)); + } let bp = match p.current() { EQ => 1, DOTDOT => 2, EQEQ | NEQ => 5, - MINUS | PLUS => 6, - STAR | SLASH => 7, + PIPE => 6, + CARET => 7, + AMP => 8, + MINUS | PLUS => 10, + STAR | SLASH | PERCENT => 11, _ => 0, }; (bp, Op::Simple) @@ -107,13 +102,13 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) { p.bump_compound(kind, n); } } - lhs = bin_expr(p, r, lhs, op_bp); + lhs = bin_expr(p, r, lhs, op_bp + 1); } } -const UNARY_EXPR_FIRST: TokenSet = +const LHS_FIRST: TokenSet = token_set_union![ - token_set![AMP, STAR, EXCL], + token_set![AMP, STAR, EXCL, DOTDOT, MINUS], atom::ATOM_EXPR_FIRST, ]; @@ -149,6 +144,15 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option { p.bump(); NOT_EXPR } + // test neg_expr + // fn foo() { + // --1; + // } + MINUS => { + m = p.start(); + p.bump(); + NEG_EXPR + } DOTDOT => { m = p.start(); p.bump(); diff --git a/src/parser_api.rs b/src/parser_api.rs index fef21c5fd..c739b1321 100644 --- a/src/parser_api.rs +++ b/src/parser_api.rs @@ -62,6 +62,10 @@ impl<'t> Parser<'t> { self.0.at_compound2(c1, c2) } + pub(crate) fn at_compound3(&self, c1: SyntaxKind, c2: SyntaxKind, c3: SyntaxKind) -> bool { + self.0.at_compound3(c1, c2, c3) + } + /// Checks if the current token is contextual keyword with text `t`. pub(crate) fn at_contextual_kw(&self, t: &str) -> bool { self.0.at_kw(t) diff --git a/src/parser_impl/mod.rs b/src/parser_impl/mod.rs index d640a7784..06c16cdb4 100644 --- a/src/parser_impl/mod.rs +++ b/src/parser_impl/mod.rs @@ -70,6 +70,12 @@ impl<'t> ParserImpl<'t> { && self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos) } + pub(super) fn at_compound3(&self, c1: SyntaxKind, c2: SyntaxKind, c3: SyntaxKind) -> bool { + self.inp.kind(self.pos) == c1 && self.inp.kind(self.pos + 1) == c2 && self.inp.kind(self.pos + 2) == c3 + && self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos) + && self.inp.start(self.pos + 2) == self.inp.start(self.pos + 1) + self.inp.len(self.pos + 1) + } + pub(super) fn nth(&self, n: u32) -> SyntaxKind { self.inp.kind(self.pos + n) } diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 005f4a9dc..db8c20004 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -46,6 +46,10 @@ pub enum SyntaxKind { MINUSEQ, AMPAMP, PIPEPIPE, + SHL, + SHR, + SHLEQ, + SHREQ, USE_KW, FN_KW, STRUCT_KW, @@ -154,6 +158,7 @@ pub enum SyntaxKind { REF_EXPR, DEREF_EXPR, NOT_EXPR, + NEG_EXPR, RANGE_EXPR, BIN_EXPR, EXTERN_BLOCK_EXPR, @@ -280,6 +285,10 @@ impl SyntaxKind { MINUSEQ => &SyntaxInfo { name: "MINUSEQ" }, AMPAMP => &SyntaxInfo { name: "AMPAMP" }, PIPEPIPE => &SyntaxInfo { name: "PIPEPIPE" }, + SHL => &SyntaxInfo { name: "SHL" }, + SHR => &SyntaxInfo { name: "SHR" }, + SHLEQ => &SyntaxInfo { name: "SHLEQ" }, + SHREQ => &SyntaxInfo { name: "SHREQ" }, USE_KW => &SyntaxInfo { name: "USE_KW" }, FN_KW => &SyntaxInfo { name: "FN_KW" }, STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" }, @@ -388,6 +397,7 @@ impl SyntaxKind { REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" }, NOT_EXPR => &SyntaxInfo { name: "NOT_EXPR" }, + NEG_EXPR => &SyntaxInfo { name: "NEG_EXPR" }, RANGE_EXPR => &SyntaxInfo { name: "RANGE_EXPR" }, BIN_EXPR => &SyntaxInfo { name: "BIN_EXPR" }, EXTERN_BLOCK_EXPR => &SyntaxInfo { name: "EXTERN_BLOCK_EXPR" }, @@ -534,6 +544,10 @@ impl SyntaxKind { MINUSEQ => "-=", AMPAMP => "&&", PIPEPIPE => "||", + SHL => "<<", + SHR => ">>", + SHLEQ => "<<=", + SHREQ => ">>=", USE_KW => "use", FN_KW => "fn", diff --git a/tests/data/parser/inline/0074_expr_binding_power.rs b/tests/data/parser/inline/0074_expr_binding_power.rs deleted file mode 100644 index 87afb036e..000000000 --- a/tests/data/parser/inline/0074_expr_binding_power.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn foo() { - 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 deleted file mode 100644 index fc0831d18..000000000 --- a/tests/data/parser/inline/0074_expr_binding_power.txt +++ /dev/null @@ -1,72 +0,0 @@ -FILE@[0; 57) - FN_ITEM@[0; 56) - FN_KW@[0; 2) - WHITESPACE@[2; 3) - NAME@[3; 6) - IDENT@[3; 6) "foo" - PARAM_LIST@[6; 8) - L_PAREN@[6; 7) - R_PAREN@[7; 8) - WHITESPACE@[8; 9) - BLOCK_EXPR@[9; 56) - L_CURLY@[9; 10) - WHITESPACE@[10; 15) - EXPR_STMT@[15; 38) - BIN_EXPR@[15; 37) - BIN_EXPR@[15; 24) - LITERAL@[15; 16) - INT_NUMBER@[15; 16) "1" - WHITESPACE@[16; 17) - PLUS@[17; 18) - WHITESPACE@[18; 19) - BIN_EXPR@[19; 24) - LITERAL@[19; 20) - INT_NUMBER@[19; 20) "2" - WHITESPACE@[20; 21) - STAR@[21; 22) - WHITESPACE@[22; 23) - LITERAL@[23; 24) - INT_NUMBER@[23; 24) "3" - WHITESPACE@[24; 25) - EQEQ@[25; 27) - WHITESPACE@[27; 28) - BIN_EXPR@[28; 37) - BIN_EXPR@[28; 33) - LITERAL@[28; 29) - INT_NUMBER@[28; 29) "1" - WHITESPACE@[29; 30) - STAR@[30; 31) - WHITESPACE@[31; 32) - LITERAL@[32; 33) - INT_NUMBER@[32; 33) "2" - WHITESPACE@[33; 34) - PLUS@[34; 35) - WHITESPACE@[35; 36) - LITERAL@[36; 37) - INT_NUMBER@[36; 37) "3" - SEMI@[37; 38) - WHITESPACE@[38; 43) - EXPR_STMT@[43; 54) - BIN_EXPR@[43; 53) - DEREF_EXPR@[43; 45) - STAR@[43; 44) - PATH_EXPR@[44; 45) - PATH@[44; 45) - PATH_SEGMENT@[44; 45) - NAME_REF@[44; 45) - IDENT@[44; 45) "x" - WHITESPACE@[45; 46) - EQ@[46; 47) - WHITESPACE@[47; 48) - BIN_EXPR@[48; 53) - LITERAL@[48; 49) - INT_NUMBER@[48; 49) "1" - WHITESPACE@[49; 50) - PLUS@[50; 51) - WHITESPACE@[51; 52) - LITERAL@[52; 53) - INT_NUMBER@[52; 53) "1" - SEMI@[53; 54) - WHITESPACE@[54; 55) - R_CURLY@[55; 56) - WHITESPACE@[56; 57) diff --git a/tests/data/parser/inline/0079_compound_ops.txt b/tests/data/parser/inline/0079_compound_ops.txt deleted file mode 100644 index 6eaed8c75..000000000 --- a/tests/data/parser/inline/0079_compound_ops.txt +++ /dev/null @@ -1,72 +0,0 @@ -FILE@[0; 62) - FN_ITEM@[0; 62) - FN_KW@[0; 2) - NAME@[2; 6) - WHITESPACE@[2; 3) - IDENT@[3; 6) "foo" - PARAM_LIST@[6; 9) - L_PAREN@[6; 7) - R_PAREN@[7; 8) - WHITESPACE@[8; 9) - BLOCK_EXPR@[9; 62) - L_CURLY@[9; 10) - EXPR_STMT@[10; 27) - BIN_EXPR@[10; 21) - PATH_EXPR@[10; 17) - PATH@[10; 17) - PATH_SEGMENT@[10; 17) - NAME_REF@[10; 17) - WHITESPACE@[10; 15) - IDENT@[15; 16) "x" - WHITESPACE@[16; 17) - PLUSEQ@[17; 19) - LITERAL@[19; 21) - WHITESPACE@[19; 20) - INT_NUMBER@[20; 21) "1" - SEMI@[21; 22) - WHITESPACE@[22; 27) - EXPR_STMT@[27; 47) - BIN_EXPR@[27; 41) - BIN_EXPR@[27; 33) - LITERAL@[27; 29) - INT_NUMBER@[27; 28) "1" - WHITESPACE@[28; 29) - PLUS@[29; 30) - LITERAL@[30; 33) - WHITESPACE@[30; 31) - INT_NUMBER@[31; 32) "1" - WHITESPACE@[32; 33) - LTEQ@[33; 35) - BIN_EXPR@[35; 41) - LITERAL@[35; 38) - WHITESPACE@[35; 36) - INT_NUMBER@[36; 37) "2" - WHITESPACE@[37; 38) - STAR@[38; 39) - LITERAL@[39; 41) - WHITESPACE@[39; 40) - INT_NUMBER@[40; 41) "3" - SEMI@[41; 42) - WHITESPACE@[42; 47) - EXPR_STMT@[47; 60) - BIN_EXPR@[47; 58) - PATH_EXPR@[47; 49) - PATH@[47; 49) - PATH_SEGMENT@[47; 49) - NAME_REF@[47; 49) - IDENT@[47; 48) "z" - WHITESPACE@[48; 49) - MINUSEQ@[49; 51) - BIN_EXPR@[51; 58) - LITERAL@[51; 54) - WHITESPACE@[51; 52) - INT_NUMBER@[52; 53) "3" - WHITESPACE@[53; 54) - GTEQ@[54; 56) - LITERAL@[56; 58) - WHITESPACE@[56; 57) - INT_NUMBER@[57; 58) "0" - SEMI@[58; 59) - WHITESPACE@[59; 60) - R_CURLY@[60; 61) - WHITESPACE@[61; 62) diff --git a/tests/data/parser/inline/0082_range_binding_power.rs b/tests/data/parser/inline/0082_range_binding_power.rs deleted file mode 100644 index 259ec31e2..000000000 --- a/tests/data/parser/inline/0082_range_binding_power.rs +++ /dev/null @@ -1,5 +0,0 @@ -fn foo() { - .. 1 + 1; - .. z = 2; - x = false .. 1 == 1; -} diff --git a/tests/data/parser/inline/0082_range_binding_power.txt b/tests/data/parser/inline/0082_range_binding_power.txt deleted file mode 100644 index 72666d8f8..000000000 --- a/tests/data/parser/inline/0082_range_binding_power.txt +++ /dev/null @@ -1,72 +0,0 @@ -FILE@[0; 66) - FN_ITEM@[0; 65) - FN_KW@[0; 2) - WHITESPACE@[2; 3) - NAME@[3; 6) - IDENT@[3; 6) "foo" - PARAM_LIST@[6; 8) - L_PAREN@[6; 7) - R_PAREN@[7; 8) - WHITESPACE@[8; 9) - BLOCK_EXPR@[9; 65) - L_CURLY@[9; 10) - WHITESPACE@[10; 15) - EXPR_STMT@[15; 24) - RANGE_EXPR@[15; 23) - DOTDOT@[15; 17) - WHITESPACE@[17; 18) - BIN_EXPR@[18; 23) - LITERAL@[18; 19) - INT_NUMBER@[18; 19) "1" - WHITESPACE@[19; 20) - PLUS@[20; 21) - WHITESPACE@[21; 22) - LITERAL@[22; 23) - INT_NUMBER@[22; 23) "1" - SEMI@[23; 24) - WHITESPACE@[24; 29) - EXPR_STMT@[29; 38) - BIN_EXPR@[29; 37) - RANGE_EXPR@[29; 33) - DOTDOT@[29; 31) - WHITESPACE@[31; 32) - PATH_EXPR@[32; 33) - PATH@[32; 33) - PATH_SEGMENT@[32; 33) - NAME_REF@[32; 33) - IDENT@[32; 33) "z" - WHITESPACE@[33; 34) - EQ@[34; 35) - WHITESPACE@[35; 36) - LITERAL@[36; 37) - INT_NUMBER@[36; 37) "2" - SEMI@[37; 38) - WHITESPACE@[38; 43) - EXPR_STMT@[43; 63) - BIN_EXPR@[43; 62) - PATH_EXPR@[43; 44) - PATH@[43; 44) - PATH_SEGMENT@[43; 44) - NAME_REF@[43; 44) - IDENT@[43; 44) "x" - WHITESPACE@[44; 45) - EQ@[45; 46) - WHITESPACE@[46; 47) - BIN_EXPR@[47; 62) - LITERAL@[47; 52) - FALSE_KW@[47; 52) - WHITESPACE@[52; 53) - DOTDOT@[53; 55) - WHITESPACE@[55; 56) - BIN_EXPR@[56; 62) - LITERAL@[56; 57) - INT_NUMBER@[56; 57) "1" - WHITESPACE@[57; 58) - EQEQ@[58; 60) - WHITESPACE@[60; 61) - LITERAL@[61; 62) - INT_NUMBER@[61; 62) "1" - SEMI@[62; 63) - WHITESPACE@[63; 64) - R_CURLY@[64; 65) - WHITESPACE@[65; 66) diff --git a/tests/data/parser/inline/0084_compound_ops.rs b/tests/data/parser/inline/0084_compound_ops.rs deleted file mode 100644 index 04b1764f1..000000000 --- a/tests/data/parser/inline/0084_compound_ops.rs +++ /dev/null @@ -1,6 +0,0 @@ -fn foo() { - x += 1; - 1 + 1 <= 2 * 3; - z -= 3 >= 0; - true || true && false; -} diff --git a/tests/data/parser/inline/0084_compound_ops.txt b/tests/data/parser/inline/0084_compound_ops.txt deleted file mode 100644 index d51f638a2..000000000 --- a/tests/data/parser/inline/0084_compound_ops.txt +++ /dev/null @@ -1,89 +0,0 @@ -FILE@[0; 89) - FN_ITEM@[0; 88) - FN_KW@[0; 2) - WHITESPACE@[2; 3) - NAME@[3; 6) - IDENT@[3; 6) "foo" - PARAM_LIST@[6; 8) - L_PAREN@[6; 7) - R_PAREN@[7; 8) - WHITESPACE@[8; 9) - BLOCK_EXPR@[9; 88) - L_CURLY@[9; 10) - WHITESPACE@[10; 15) - EXPR_STMT@[15; 22) - BIN_EXPR@[15; 21) - PATH_EXPR@[15; 16) - PATH@[15; 16) - PATH_SEGMENT@[15; 16) - NAME_REF@[15; 16) - IDENT@[15; 16) "x" - WHITESPACE@[16; 17) - PLUSEQ@[17; 19) - WHITESPACE@[19; 20) - LITERAL@[20; 21) - INT_NUMBER@[20; 21) "1" - SEMI@[21; 22) - WHITESPACE@[22; 27) - EXPR_STMT@[27; 42) - BIN_EXPR@[27; 41) - BIN_EXPR@[27; 32) - LITERAL@[27; 28) - INT_NUMBER@[27; 28) "1" - WHITESPACE@[28; 29) - PLUS@[29; 30) - WHITESPACE@[30; 31) - LITERAL@[31; 32) - INT_NUMBER@[31; 32) "1" - WHITESPACE@[32; 33) - LTEQ@[33; 35) - WHITESPACE@[35; 36) - BIN_EXPR@[36; 41) - LITERAL@[36; 37) - INT_NUMBER@[36; 37) "2" - WHITESPACE@[37; 38) - STAR@[38; 39) - WHITESPACE@[39; 40) - LITERAL@[40; 41) - INT_NUMBER@[40; 41) "3" - SEMI@[41; 42) - WHITESPACE@[42; 47) - EXPR_STMT@[47; 59) - BIN_EXPR@[47; 58) - PATH_EXPR@[47; 48) - PATH@[47; 48) - PATH_SEGMENT@[47; 48) - NAME_REF@[47; 48) - IDENT@[47; 48) "z" - WHITESPACE@[48; 49) - MINUSEQ@[49; 51) - WHITESPACE@[51; 52) - BIN_EXPR@[52; 58) - LITERAL@[52; 53) - INT_NUMBER@[52; 53) "3" - WHITESPACE@[53; 54) - GTEQ@[54; 56) - WHITESPACE@[56; 57) - LITERAL@[57; 58) - INT_NUMBER@[57; 58) "0" - SEMI@[58; 59) - WHITESPACE@[59; 64) - EXPR_STMT@[64; 86) - BIN_EXPR@[64; 85) - LITERAL@[64; 68) - TRUE_KW@[64; 68) - WHITESPACE@[68; 69) - PIPEPIPE@[69; 71) - WHITESPACE@[71; 72) - BIN_EXPR@[72; 85) - LITERAL@[72; 76) - TRUE_KW@[72; 76) - WHITESPACE@[76; 77) - AMPAMP@[77; 79) - WHITESPACE@[79; 80) - LITERAL@[80; 85) - FALSE_KW@[80; 85) - SEMI@[85; 86) - WHITESPACE@[86; 87) - R_CURLY@[87; 88) - WHITESPACE@[88; 89) diff --git a/tests/data/parser/inline/0085_neg_expr.rs b/tests/data/parser/inline/0085_neg_expr.rs new file mode 100644 index 000000000..45149d222 --- /dev/null +++ b/tests/data/parser/inline/0085_neg_expr.rs @@ -0,0 +1,3 @@ +fn foo() { + --1; +} diff --git a/tests/data/parser/inline/0085_neg_expr.txt b/tests/data/parser/inline/0085_neg_expr.txt new file mode 100644 index 000000000..8eeb0b1e6 --- /dev/null +++ b/tests/data/parser/inline/0085_neg_expr.txt @@ -0,0 +1,24 @@ +FILE@[0; 22) + FN_ITEM@[0; 21) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + NAME@[3; 6) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 8) + L_PAREN@[6; 7) + R_PAREN@[7; 8) + WHITESPACE@[8; 9) + BLOCK_EXPR@[9; 21) + L_CURLY@[9; 10) + WHITESPACE@[10; 15) + EXPR_STMT@[15; 19) + NEG_EXPR@[15; 18) + MINUS@[15; 16) + NEG_EXPR@[16; 18) + MINUS@[16; 17) + LITERAL@[17; 18) + INT_NUMBER@[17; 18) "1" + SEMI@[18; 19) + WHITESPACE@[19; 20) + R_CURLY@[20; 21) + WHITESPACE@[21; 22) diff --git a/tests/data/parser/ok/0028_operator_binding_power.rs b/tests/data/parser/ok/0028_operator_binding_power.rs new file mode 100644 index 000000000..cc9598470 --- /dev/null +++ b/tests/data/parser/ok/0028_operator_binding_power.rs @@ -0,0 +1,14 @@ +fn binding_power() { + let x = 1 + 2 * 3 % 4 - 5 / 6; + 1 + 2 * 3; + 1 << 2 + 3; + 1 & 2 >> 3; + 1 ^ 2 & 3; + 1 | 2 ^ 3; + 1 == 2 | 3; + 1 && 2 == 3; + //1 || 2 && 2; + //1 .. 2 || 3; + //1 = 2 .. 3; + //---&*1 - --2 * 9; +} diff --git a/tests/data/parser/ok/0028_operator_binding_power.txt b/tests/data/parser/ok/0028_operator_binding_power.txt new file mode 100644 index 000000000..2cabd289e --- /dev/null +++ b/tests/data/parser/ok/0028_operator_binding_power.txt @@ -0,0 +1,185 @@ +FILE@[0; 248) + FN_ITEM@[0; 247) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + NAME@[3; 16) + IDENT@[3; 16) "binding_power" + PARAM_LIST@[16; 18) + L_PAREN@[16; 17) + R_PAREN@[17; 18) + WHITESPACE@[18; 19) + BLOCK_EXPR@[19; 247) + L_CURLY@[19; 20) + WHITESPACE@[20; 25) + LET_STMT@[25; 55) + LET_KW@[25; 28) + WHITESPACE@[28; 29) + BIND_PAT@[29; 30) + NAME@[29; 30) + IDENT@[29; 30) "x" + WHITESPACE@[30; 31) + EQ@[31; 32) + WHITESPACE@[32; 33) + BIN_EXPR@[33; 54) + BIN_EXPR@[33; 46) + LITERAL@[33; 34) + INT_NUMBER@[33; 34) "1" + WHITESPACE@[34; 35) + PLUS@[35; 36) + WHITESPACE@[36; 37) + BIN_EXPR@[37; 46) + BIN_EXPR@[37; 42) + LITERAL@[37; 38) + INT_NUMBER@[37; 38) "2" + WHITESPACE@[38; 39) + STAR@[39; 40) + WHITESPACE@[40; 41) + LITERAL@[41; 42) + INT_NUMBER@[41; 42) "3" + WHITESPACE@[42; 43) + PERCENT@[43; 44) + WHITESPACE@[44; 45) + LITERAL@[45; 46) + INT_NUMBER@[45; 46) "4" + WHITESPACE@[46; 47) + MINUS@[47; 48) + WHITESPACE@[48; 49) + BIN_EXPR@[49; 54) + LITERAL@[49; 50) + INT_NUMBER@[49; 50) "5" + WHITESPACE@[50; 51) + SLASH@[51; 52) + WHITESPACE@[52; 53) + LITERAL@[53; 54) + INT_NUMBER@[53; 54) "6" + SEMI@[54; 55) + WHITESPACE@[55; 60) + EXPR_STMT@[60; 70) + BIN_EXPR@[60; 69) + LITERAL@[60; 61) + INT_NUMBER@[60; 61) "1" + WHITESPACE@[61; 62) + PLUS@[62; 63) + WHITESPACE@[63; 64) + BIN_EXPR@[64; 69) + LITERAL@[64; 65) + INT_NUMBER@[64; 65) "2" + WHITESPACE@[65; 66) + STAR@[66; 67) + WHITESPACE@[67; 68) + LITERAL@[68; 69) + INT_NUMBER@[68; 69) "3" + SEMI@[69; 70) + WHITESPACE@[70; 75) + EXPR_STMT@[75; 86) + BIN_EXPR@[75; 85) + LITERAL@[75; 76) + INT_NUMBER@[75; 76) "1" + WHITESPACE@[76; 77) + SHL@[77; 79) + WHITESPACE@[79; 80) + BIN_EXPR@[80; 85) + LITERAL@[80; 81) + INT_NUMBER@[80; 81) "2" + WHITESPACE@[81; 82) + PLUS@[82; 83) + WHITESPACE@[83; 84) + LITERAL@[84; 85) + INT_NUMBER@[84; 85) "3" + SEMI@[85; 86) + WHITESPACE@[86; 91) + EXPR_STMT@[91; 102) + BIN_EXPR@[91; 101) + LITERAL@[91; 92) + INT_NUMBER@[91; 92) "1" + WHITESPACE@[92; 93) + AMP@[93; 94) + WHITESPACE@[94; 95) + BIN_EXPR@[95; 101) + LITERAL@[95; 96) + INT_NUMBER@[95; 96) "2" + WHITESPACE@[96; 97) + SHR@[97; 99) + WHITESPACE@[99; 100) + LITERAL@[100; 101) + INT_NUMBER@[100; 101) "3" + SEMI@[101; 102) + WHITESPACE@[102; 107) + EXPR_STMT@[107; 117) + BIN_EXPR@[107; 116) + LITERAL@[107; 108) + INT_NUMBER@[107; 108) "1" + WHITESPACE@[108; 109) + CARET@[109; 110) + WHITESPACE@[110; 111) + BIN_EXPR@[111; 116) + LITERAL@[111; 112) + INT_NUMBER@[111; 112) "2" + WHITESPACE@[112; 113) + AMP@[113; 114) + WHITESPACE@[114; 115) + LITERAL@[115; 116) + INT_NUMBER@[115; 116) "3" + SEMI@[116; 117) + WHITESPACE@[117; 122) + EXPR_STMT@[122; 132) + BIN_EXPR@[122; 131) + LITERAL@[122; 123) + INT_NUMBER@[122; 123) "1" + WHITESPACE@[123; 124) + PIPE@[124; 125) + WHITESPACE@[125; 126) + BIN_EXPR@[126; 131) + LITERAL@[126; 127) + INT_NUMBER@[126; 127) "2" + WHITESPACE@[127; 128) + CARET@[128; 129) + WHITESPACE@[129; 130) + LITERAL@[130; 131) + INT_NUMBER@[130; 131) "3" + SEMI@[131; 132) + WHITESPACE@[132; 137) + EXPR_STMT@[137; 148) + BIN_EXPR@[137; 147) + LITERAL@[137; 138) + INT_NUMBER@[137; 138) "1" + WHITESPACE@[138; 139) + EQEQ@[139; 141) + WHITESPACE@[141; 142) + BIN_EXPR@[142; 147) + LITERAL@[142; 143) + INT_NUMBER@[142; 143) "2" + WHITESPACE@[143; 144) + PIPE@[144; 145) + WHITESPACE@[145; 146) + LITERAL@[146; 147) + INT_NUMBER@[146; 147) "3" + SEMI@[147; 148) + WHITESPACE@[148; 153) + EXPR_STMT@[153; 165) + BIN_EXPR@[153; 164) + LITERAL@[153; 154) + INT_NUMBER@[153; 154) "1" + WHITESPACE@[154; 155) + AMPAMP@[155; 157) + WHITESPACE@[157; 158) + BIN_EXPR@[158; 164) + LITERAL@[158; 159) + INT_NUMBER@[158; 159) "2" + WHITESPACE@[159; 160) + EQEQ@[160; 162) + WHITESPACE@[162; 163) + LITERAL@[163; 164) + INT_NUMBER@[163; 164) "3" + SEMI@[164; 165) + WHITESPACE@[165; 170) + COMMENT@[170; 184) + WHITESPACE@[184; 189) + COMMENT@[189; 203) + WHITESPACE@[203; 208) + COMMENT@[208; 221) + WHITESPACE@[221; 226) + COMMENT@[226; 245) + WHITESPACE@[245; 246) + R_CURLY@[246; 247) + WHITESPACE@[247; 248) diff --git a/tests/data/parser/ok/0029_range_forms.rs b/tests/data/parser/ok/0029_range_forms.rs new file mode 100644 index 000000000..74de11a7e --- /dev/null +++ b/tests/data/parser/ok/0029_range_forms.rs @@ -0,0 +1,5 @@ +fn foo() { + ..1 + 1; + ..z = 2; + x = false..1 == 1; +} diff --git a/tests/data/parser/ok/0029_range_forms.txt b/tests/data/parser/ok/0029_range_forms.txt new file mode 100644 index 000000000..8599f7dfc --- /dev/null +++ b/tests/data/parser/ok/0029_range_forms.txt @@ -0,0 +1,68 @@ +FILE@[0; 62) + FN_ITEM@[0; 61) + FN_KW@[0; 2) + WHITESPACE@[2; 3) + NAME@[3; 6) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 8) + L_PAREN@[6; 7) + R_PAREN@[7; 8) + WHITESPACE@[8; 9) + BLOCK_EXPR@[9; 61) + L_CURLY@[9; 10) + WHITESPACE@[10; 15) + EXPR_STMT@[15; 23) + RANGE_EXPR@[15; 22) + DOTDOT@[15; 17) + BIN_EXPR@[17; 22) + LITERAL@[17; 18) + INT_NUMBER@[17; 18) "1" + WHITESPACE@[18; 19) + PLUS@[19; 20) + WHITESPACE@[20; 21) + LITERAL@[21; 22) + INT_NUMBER@[21; 22) "1" + SEMI@[22; 23) + WHITESPACE@[23; 28) + EXPR_STMT@[28; 36) + BIN_EXPR@[28; 35) + RANGE_EXPR@[28; 31) + DOTDOT@[28; 30) + PATH_EXPR@[30; 31) + PATH@[30; 31) + PATH_SEGMENT@[30; 31) + NAME_REF@[30; 31) + IDENT@[30; 31) "z" + WHITESPACE@[31; 32) + EQ@[32; 33) + WHITESPACE@[33; 34) + LITERAL@[34; 35) + INT_NUMBER@[34; 35) "2" + SEMI@[35; 36) + WHITESPACE@[36; 41) + EXPR_STMT@[41; 59) + BIN_EXPR@[41; 58) + PATH_EXPR@[41; 42) + PATH@[41; 42) + PATH_SEGMENT@[41; 42) + NAME_REF@[41; 42) + IDENT@[41; 42) "x" + WHITESPACE@[42; 43) + EQ@[43; 44) + WHITESPACE@[44; 45) + BIN_EXPR@[45; 58) + LITERAL@[45; 50) + FALSE_KW@[45; 50) + DOTDOT@[50; 52) + BIN_EXPR@[52; 58) + LITERAL@[52; 53) + INT_NUMBER@[52; 53) "1" + WHITESPACE@[53; 54) + EQEQ@[54; 56) + WHITESPACE@[56; 57) + LITERAL@[57; 58) + INT_NUMBER@[57; 58) "1" + SEMI@[58; 59) + WHITESPACE@[59; 60) + R_CURLY@[60; 61) + WHITESPACE@[61; 62) -- cgit v1.2.3