aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-08-07 12:24:03 +0100
committerAleksey Kladov <[email protected]>2018-08-07 12:24:03 +0100
commit8908e51aeaee91d6b63684a21ed1ca16de49916f (patch)
tree30fa7b9ac02c7326d3c7fbd192ebe2ef46b82d58
parent498098a5d968f06f08fa093f1fd5a43a9a61ecf3 (diff)
full precedence
-rw-r--r--src/grammar.ron5
-rw-r--r--src/grammar/expressions/mod.rs56
-rw-r--r--src/parser_api.rs4
-rw-r--r--src/parser_impl/mod.rs6
-rw-r--r--src/syntax_kinds/generated.rs14
-rw-r--r--tests/data/parser/inline/0074_expr_binding_power.rs4
-rw-r--r--tests/data/parser/inline/0074_expr_binding_power.txt72
-rw-r--r--tests/data/parser/inline/0079_compound_ops.txt72
-rw-r--r--tests/data/parser/inline/0082_range_binding_power.rs5
-rw-r--r--tests/data/parser/inline/0082_range_binding_power.txt72
-rw-r--r--tests/data/parser/inline/0084_compound_ops.rs6
-rw-r--r--tests/data/parser/inline/0084_compound_ops.txt89
-rw-r--r--tests/data/parser/inline/0085_neg_expr.rs3
-rw-r--r--tests/data/parser/inline/0085_neg_expr.txt24
-rw-r--r--tests/data/parser/ok/0028_operator_binding_power.rs14
-rw-r--r--tests/data/parser/ok/0028_operator_binding_power.txt185
-rw-r--r--tests/data/parser/ok/0029_range_forms.rs5
-rw-r--r--tests/data/parser/ok/0029_range_forms.txt68
18 files changed, 358 insertions, 346 deletions
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(
43 ["-=", "MINUSEQ"], 43 ["-=", "MINUSEQ"],
44 ["&&", "AMPAMP"], 44 ["&&", "AMPAMP"],
45 ["||", "PIPEPIPE"], 45 ["||", "PIPEPIPE"],
46 ["<<", "SHL"],
47 [">>", "SHR"],
48 ["<<=", "SHLEQ"],
49 [">>=", "SHREQ"],
46 ], 50 ],
47 keywords: [ 51 keywords: [
48 "use", 52 "use",
@@ -168,6 +172,7 @@ Grammar(
168 "REF_EXPR", 172 "REF_EXPR",
169 "DEREF_EXPR", 173 "DEREF_EXPR",
170 "NOT_EXPR", 174 "NOT_EXPR",
175 "NEG_EXPR",
171 176
172 "RANGE_EXPR", // just weird 177 "RANGE_EXPR", // just weird
173 "BIN_EXPR", 178 "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;
3use super::*; 3use super::*;
4pub(super) use self::atom::literal; 4pub(super) use self::atom::literal;
5 5
6const EXPR_FIRST: TokenSet = UNARY_EXPR_FIRST; 6const EXPR_FIRST: TokenSet = LHS_FIRST;
7 7
8pub(super) fn expr(p: &mut Parser) { 8pub(super) fn expr(p: &mut Parser) {
9 let r = Restrictions { forbid_structs: false }; 9 let r = Restrictions { forbid_structs: false };
@@ -38,26 +38,6 @@ enum Op {
38 Composite(SyntaxKind, u8), 38 Composite(SyntaxKind, u8),
39} 39}
40 40
41// test expr_binding_power
42// fn foo() {
43// 1 + 2 * 3 == 1 * 2 + 3;
44// *x = 1 + 1;
45// }
46
47// test range_binding_power
48// fn foo() {
49// .. 1 + 1;
50// .. z = 2;
51// x = false .. 1 == 1;
52// }
53
54// test compound_ops
55// fn foo() {
56// x += 1;
57// 1 + 1 <= 2 * 3;
58// z -= 3 >= 0;
59// true || true && false;
60// }
61fn current_op(p: &Parser) -> (u8, Op) { 41fn current_op(p: &Parser) -> (u8, Op) {
62 if p.at_compound2(PLUS, EQ) { 42 if p.at_compound2(PLUS, EQ) {
63 return (1, Op::Composite(PLUSEQ, 2)); 43 return (1, Op::Composite(PLUSEQ, 2));
@@ -65,6 +45,12 @@ fn current_op(p: &Parser) -> (u8, Op) {
65 if p.at_compound2(MINUS, EQ) { 45 if p.at_compound2(MINUS, EQ) {
66 return (1, Op::Composite(MINUSEQ, 2)); 46 return (1, Op::Composite(MINUSEQ, 2));
67 } 47 }
48 if p.at_compound3(L_ANGLE, L_ANGLE, EQ) {
49 return (1, Op::Composite(SHLEQ, 3));
50 }
51 if p.at_compound3(R_ANGLE, R_ANGLE, EQ) {
52 return (1, Op::Composite(SHREQ, 3));
53 }
68 if p.at_compound2(PIPE, PIPE) { 54 if p.at_compound2(PIPE, PIPE) {
69 return (3, Op::Composite(PIPEPIPE, 2)); 55 return (3, Op::Composite(PIPEPIPE, 2));
70 } 56 }
@@ -77,13 +63,22 @@ fn current_op(p: &Parser) -> (u8, Op) {
77 if p.at_compound2(R_ANGLE, EQ) { 63 if p.at_compound2(R_ANGLE, EQ) {
78 return (5, Op::Composite(GTEQ, 2)); 64 return (5, Op::Composite(GTEQ, 2));
79 } 65 }
66 if p.at_compound2(L_ANGLE, L_ANGLE) {
67 return (9, Op::Composite(SHL, 2));
68 }
69 if p.at_compound2(R_ANGLE, R_ANGLE) {
70 return (9, Op::Composite(SHR, 2));
71 }
80 72
81 let bp = match p.current() { 73 let bp = match p.current() {
82 EQ => 1, 74 EQ => 1,
83 DOTDOT => 2, 75 DOTDOT => 2,
84 EQEQ | NEQ => 5, 76 EQEQ | NEQ => 5,
85 MINUS | PLUS => 6, 77 PIPE => 6,
86 STAR | SLASH => 7, 78 CARET => 7,
79 AMP => 8,
80 MINUS | PLUS => 10,
81 STAR | SLASH | PERCENT => 11,
87 _ => 0, 82 _ => 0,
88 }; 83 };
89 (bp, Op::Simple) 84 (bp, Op::Simple)
@@ -107,13 +102,13 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) {
107 p.bump_compound(kind, n); 102 p.bump_compound(kind, n);
108 } 103 }
109 } 104 }
110 lhs = bin_expr(p, r, lhs, op_bp); 105 lhs = bin_expr(p, r, lhs, op_bp + 1);
111 } 106 }
112} 107}
113 108
114const UNARY_EXPR_FIRST: TokenSet = 109const LHS_FIRST: TokenSet =
115 token_set_union![ 110 token_set_union![
116 token_set![AMP, STAR, EXCL], 111 token_set![AMP, STAR, EXCL, DOTDOT, MINUS],
117 atom::ATOM_EXPR_FIRST, 112 atom::ATOM_EXPR_FIRST,
118 ]; 113 ];
119 114
@@ -149,6 +144,15 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<CompletedMarker> {
149 p.bump(); 144 p.bump();
150 NOT_EXPR 145 NOT_EXPR
151 } 146 }
147 // test neg_expr
148 // fn foo() {
149 // --1;
150 // }
151 MINUS => {
152 m = p.start();
153 p.bump();
154 NEG_EXPR
155 }
152 DOTDOT => { 156 DOTDOT => {
153 m = p.start(); 157 m = p.start();
154 p.bump(); 158 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> {
62 self.0.at_compound2(c1, c2) 62 self.0.at_compound2(c1, c2)
63 } 63 }
64 64
65 pub(crate) fn at_compound3(&self, c1: SyntaxKind, c2: SyntaxKind, c3: SyntaxKind) -> bool {
66 self.0.at_compound3(c1, c2, c3)
67 }
68
65 /// Checks if the current token is contextual keyword with text `t`. 69 /// Checks if the current token is contextual keyword with text `t`.
66 pub(crate) fn at_contextual_kw(&self, t: &str) -> bool { 70 pub(crate) fn at_contextual_kw(&self, t: &str) -> bool {
67 self.0.at_kw(t) 71 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> {
70 && self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos) 70 && self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos)
71 } 71 }
72 72
73 pub(super) fn at_compound3(&self, c1: SyntaxKind, c2: SyntaxKind, c3: SyntaxKind) -> bool {
74 self.inp.kind(self.pos) == c1 && self.inp.kind(self.pos + 1) == c2 && self.inp.kind(self.pos + 2) == c3
75 && self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos)
76 && self.inp.start(self.pos + 2) == self.inp.start(self.pos + 1) + self.inp.len(self.pos + 1)
77 }
78
73 pub(super) fn nth(&self, n: u32) -> SyntaxKind { 79 pub(super) fn nth(&self, n: u32) -> SyntaxKind {
74 self.inp.kind(self.pos + n) 80 self.inp.kind(self.pos + n)
75 } 81 }
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 {
46 MINUSEQ, 46 MINUSEQ,
47 AMPAMP, 47 AMPAMP,
48 PIPEPIPE, 48 PIPEPIPE,
49 SHL,
50 SHR,
51 SHLEQ,
52 SHREQ,
49 USE_KW, 53 USE_KW,
50 FN_KW, 54 FN_KW,
51 STRUCT_KW, 55 STRUCT_KW,
@@ -154,6 +158,7 @@ pub enum SyntaxKind {
154 REF_EXPR, 158 REF_EXPR,
155 DEREF_EXPR, 159 DEREF_EXPR,
156 NOT_EXPR, 160 NOT_EXPR,
161 NEG_EXPR,
157 RANGE_EXPR, 162 RANGE_EXPR,
158 BIN_EXPR, 163 BIN_EXPR,
159 EXTERN_BLOCK_EXPR, 164 EXTERN_BLOCK_EXPR,
@@ -280,6 +285,10 @@ impl SyntaxKind {
280 MINUSEQ => &SyntaxInfo { name: "MINUSEQ" }, 285 MINUSEQ => &SyntaxInfo { name: "MINUSEQ" },
281 AMPAMP => &SyntaxInfo { name: "AMPAMP" }, 286 AMPAMP => &SyntaxInfo { name: "AMPAMP" },
282 PIPEPIPE => &SyntaxInfo { name: "PIPEPIPE" }, 287 PIPEPIPE => &SyntaxInfo { name: "PIPEPIPE" },
288 SHL => &SyntaxInfo { name: "SHL" },
289 SHR => &SyntaxInfo { name: "SHR" },
290 SHLEQ => &SyntaxInfo { name: "SHLEQ" },
291 SHREQ => &SyntaxInfo { name: "SHREQ" },
283 USE_KW => &SyntaxInfo { name: "USE_KW" }, 292 USE_KW => &SyntaxInfo { name: "USE_KW" },
284 FN_KW => &SyntaxInfo { name: "FN_KW" }, 293 FN_KW => &SyntaxInfo { name: "FN_KW" },
285 STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" }, 294 STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" },
@@ -388,6 +397,7 @@ impl SyntaxKind {
388 REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, 397 REF_EXPR => &SyntaxInfo { name: "REF_EXPR" },
389 DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" }, 398 DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" },
390 NOT_EXPR => &SyntaxInfo { name: "NOT_EXPR" }, 399 NOT_EXPR => &SyntaxInfo { name: "NOT_EXPR" },
400 NEG_EXPR => &SyntaxInfo { name: "NEG_EXPR" },
391 RANGE_EXPR => &SyntaxInfo { name: "RANGE_EXPR" }, 401 RANGE_EXPR => &SyntaxInfo { name: "RANGE_EXPR" },
392 BIN_EXPR => &SyntaxInfo { name: "BIN_EXPR" }, 402 BIN_EXPR => &SyntaxInfo { name: "BIN_EXPR" },
393 EXTERN_BLOCK_EXPR => &SyntaxInfo { name: "EXTERN_BLOCK_EXPR" }, 403 EXTERN_BLOCK_EXPR => &SyntaxInfo { name: "EXTERN_BLOCK_EXPR" },
@@ -534,6 +544,10 @@ impl SyntaxKind {
534 MINUSEQ => "-=", 544 MINUSEQ => "-=",
535 AMPAMP => "&&", 545 AMPAMP => "&&",
536 PIPEPIPE => "||", 546 PIPEPIPE => "||",
547 SHL => "<<",
548 SHR => ">>",
549 SHLEQ => "<<=",
550 SHREQ => ">>=",
537 551
538 USE_KW => "use", 552 USE_KW => "use",
539 FN_KW => "fn", 553 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 @@
1fn foo() {
2 1 + 2 * 3 == 1 * 2 + 3;
3 *x = 1 + 1;
4}
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 @@
1FILE@[0; 57)
2 FN_ITEM@[0; 56)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 56)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 EXPR_STMT@[15; 38)
15 BIN_EXPR@[15; 37)
16 BIN_EXPR@[15; 24)
17 LITERAL@[15; 16)
18 INT_NUMBER@[15; 16) "1"
19 WHITESPACE@[16; 17)
20 PLUS@[17; 18)
21 WHITESPACE@[18; 19)
22 BIN_EXPR@[19; 24)
23 LITERAL@[19; 20)
24 INT_NUMBER@[19; 20) "2"
25 WHITESPACE@[20; 21)
26 STAR@[21; 22)
27 WHITESPACE@[22; 23)
28 LITERAL@[23; 24)
29 INT_NUMBER@[23; 24) "3"
30 WHITESPACE@[24; 25)
31 EQEQ@[25; 27)
32 WHITESPACE@[27; 28)
33 BIN_EXPR@[28; 37)
34 BIN_EXPR@[28; 33)
35 LITERAL@[28; 29)
36 INT_NUMBER@[28; 29) "1"
37 WHITESPACE@[29; 30)
38 STAR@[30; 31)
39 WHITESPACE@[31; 32)
40 LITERAL@[32; 33)
41 INT_NUMBER@[32; 33) "2"
42 WHITESPACE@[33; 34)
43 PLUS@[34; 35)
44 WHITESPACE@[35; 36)
45 LITERAL@[36; 37)
46 INT_NUMBER@[36; 37) "3"
47 SEMI@[37; 38)
48 WHITESPACE@[38; 43)
49 EXPR_STMT@[43; 54)
50 BIN_EXPR@[43; 53)
51 DEREF_EXPR@[43; 45)
52 STAR@[43; 44)
53 PATH_EXPR@[44; 45)
54 PATH@[44; 45)
55 PATH_SEGMENT@[44; 45)
56 NAME_REF@[44; 45)
57 IDENT@[44; 45) "x"
58 WHITESPACE@[45; 46)
59 EQ@[46; 47)
60 WHITESPACE@[47; 48)
61 BIN_EXPR@[48; 53)
62 LITERAL@[48; 49)
63 INT_NUMBER@[48; 49) "1"
64 WHITESPACE@[49; 50)
65 PLUS@[50; 51)
66 WHITESPACE@[51; 52)
67 LITERAL@[52; 53)
68 INT_NUMBER@[52; 53) "1"
69 SEMI@[53; 54)
70 WHITESPACE@[54; 55)
71 R_CURLY@[55; 56)
72 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 @@
1FILE@[0; 62)
2 FN_ITEM@[0; 62)
3 FN_KW@[0; 2)
4 NAME@[2; 6)
5 WHITESPACE@[2; 3)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 9)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 62)
12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 27)
14 BIN_EXPR@[10; 21)
15 PATH_EXPR@[10; 17)
16 PATH@[10; 17)
17 PATH_SEGMENT@[10; 17)
18 NAME_REF@[10; 17)
19 WHITESPACE@[10; 15)
20 IDENT@[15; 16) "x"
21 WHITESPACE@[16; 17)
22 PLUSEQ@[17; 19)
23 LITERAL@[19; 21)
24 WHITESPACE@[19; 20)
25 INT_NUMBER@[20; 21) "1"
26 SEMI@[21; 22)
27 WHITESPACE@[22; 27)
28 EXPR_STMT@[27; 47)
29 BIN_EXPR@[27; 41)
30 BIN_EXPR@[27; 33)
31 LITERAL@[27; 29)
32 INT_NUMBER@[27; 28) "1"
33 WHITESPACE@[28; 29)
34 PLUS@[29; 30)
35 LITERAL@[30; 33)
36 WHITESPACE@[30; 31)
37 INT_NUMBER@[31; 32) "1"
38 WHITESPACE@[32; 33)
39 LTEQ@[33; 35)
40 BIN_EXPR@[35; 41)
41 LITERAL@[35; 38)
42 WHITESPACE@[35; 36)
43 INT_NUMBER@[36; 37) "2"
44 WHITESPACE@[37; 38)
45 STAR@[38; 39)
46 LITERAL@[39; 41)
47 WHITESPACE@[39; 40)
48 INT_NUMBER@[40; 41) "3"
49 SEMI@[41; 42)
50 WHITESPACE@[42; 47)
51 EXPR_STMT@[47; 60)
52 BIN_EXPR@[47; 58)
53 PATH_EXPR@[47; 49)
54 PATH@[47; 49)
55 PATH_SEGMENT@[47; 49)
56 NAME_REF@[47; 49)
57 IDENT@[47; 48) "z"
58 WHITESPACE@[48; 49)
59 MINUSEQ@[49; 51)
60 BIN_EXPR@[51; 58)
61 LITERAL@[51; 54)
62 WHITESPACE@[51; 52)
63 INT_NUMBER@[52; 53) "3"
64 WHITESPACE@[53; 54)
65 GTEQ@[54; 56)
66 LITERAL@[56; 58)
67 WHITESPACE@[56; 57)
68 INT_NUMBER@[57; 58) "0"
69 SEMI@[58; 59)
70 WHITESPACE@[59; 60)
71 R_CURLY@[60; 61)
72 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 @@
1fn foo() {
2 .. 1 + 1;
3 .. z = 2;
4 x = false .. 1 == 1;
5}
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 @@
1FILE@[0; 66)
2 FN_ITEM@[0; 65)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 65)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 EXPR_STMT@[15; 24)
15 RANGE_EXPR@[15; 23)
16 DOTDOT@[15; 17)
17 WHITESPACE@[17; 18)
18 BIN_EXPR@[18; 23)
19 LITERAL@[18; 19)
20 INT_NUMBER@[18; 19) "1"
21 WHITESPACE@[19; 20)
22 PLUS@[20; 21)
23 WHITESPACE@[21; 22)
24 LITERAL@[22; 23)
25 INT_NUMBER@[22; 23) "1"
26 SEMI@[23; 24)
27 WHITESPACE@[24; 29)
28 EXPR_STMT@[29; 38)
29 BIN_EXPR@[29; 37)
30 RANGE_EXPR@[29; 33)
31 DOTDOT@[29; 31)
32 WHITESPACE@[31; 32)
33 PATH_EXPR@[32; 33)
34 PATH@[32; 33)
35 PATH_SEGMENT@[32; 33)
36 NAME_REF@[32; 33)
37 IDENT@[32; 33) "z"
38 WHITESPACE@[33; 34)
39 EQ@[34; 35)
40 WHITESPACE@[35; 36)
41 LITERAL@[36; 37)
42 INT_NUMBER@[36; 37) "2"
43 SEMI@[37; 38)
44 WHITESPACE@[38; 43)
45 EXPR_STMT@[43; 63)
46 BIN_EXPR@[43; 62)
47 PATH_EXPR@[43; 44)
48 PATH@[43; 44)
49 PATH_SEGMENT@[43; 44)
50 NAME_REF@[43; 44)
51 IDENT@[43; 44) "x"
52 WHITESPACE@[44; 45)
53 EQ@[45; 46)
54 WHITESPACE@[46; 47)
55 BIN_EXPR@[47; 62)
56 LITERAL@[47; 52)
57 FALSE_KW@[47; 52)
58 WHITESPACE@[52; 53)
59 DOTDOT@[53; 55)
60 WHITESPACE@[55; 56)
61 BIN_EXPR@[56; 62)
62 LITERAL@[56; 57)
63 INT_NUMBER@[56; 57) "1"
64 WHITESPACE@[57; 58)
65 EQEQ@[58; 60)
66 WHITESPACE@[60; 61)
67 LITERAL@[61; 62)
68 INT_NUMBER@[61; 62) "1"
69 SEMI@[62; 63)
70 WHITESPACE@[63; 64)
71 R_CURLY@[64; 65)
72 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 @@
1fn foo() {
2 x += 1;
3 1 + 1 <= 2 * 3;
4 z -= 3 >= 0;
5 true || true && false;
6}
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 @@
1FILE@[0; 89)
2 FN_ITEM@[0; 88)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 88)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 EXPR_STMT@[15; 22)
15 BIN_EXPR@[15; 21)
16 PATH_EXPR@[15; 16)
17 PATH@[15; 16)
18 PATH_SEGMENT@[15; 16)
19 NAME_REF@[15; 16)
20 IDENT@[15; 16) "x"
21 WHITESPACE@[16; 17)
22 PLUSEQ@[17; 19)
23 WHITESPACE@[19; 20)
24 LITERAL@[20; 21)
25 INT_NUMBER@[20; 21) "1"
26 SEMI@[21; 22)
27 WHITESPACE@[22; 27)
28 EXPR_STMT@[27; 42)
29 BIN_EXPR@[27; 41)
30 BIN_EXPR@[27; 32)
31 LITERAL@[27; 28)
32 INT_NUMBER@[27; 28) "1"
33 WHITESPACE@[28; 29)
34 PLUS@[29; 30)
35 WHITESPACE@[30; 31)
36 LITERAL@[31; 32)
37 INT_NUMBER@[31; 32) "1"
38 WHITESPACE@[32; 33)
39 LTEQ@[33; 35)
40 WHITESPACE@[35; 36)
41 BIN_EXPR@[36; 41)
42 LITERAL@[36; 37)
43 INT_NUMBER@[36; 37) "2"
44 WHITESPACE@[37; 38)
45 STAR@[38; 39)
46 WHITESPACE@[39; 40)
47 LITERAL@[40; 41)
48 INT_NUMBER@[40; 41) "3"
49 SEMI@[41; 42)
50 WHITESPACE@[42; 47)
51 EXPR_STMT@[47; 59)
52 BIN_EXPR@[47; 58)
53 PATH_EXPR@[47; 48)
54 PATH@[47; 48)
55 PATH_SEGMENT@[47; 48)
56 NAME_REF@[47; 48)
57 IDENT@[47; 48) "z"
58 WHITESPACE@[48; 49)
59 MINUSEQ@[49; 51)
60 WHITESPACE@[51; 52)
61 BIN_EXPR@[52; 58)
62 LITERAL@[52; 53)
63 INT_NUMBER@[52; 53) "3"
64 WHITESPACE@[53; 54)
65 GTEQ@[54; 56)
66 WHITESPACE@[56; 57)
67 LITERAL@[57; 58)
68 INT_NUMBER@[57; 58) "0"
69 SEMI@[58; 59)
70 WHITESPACE@[59; 64)
71 EXPR_STMT@[64; 86)
72 BIN_EXPR@[64; 85)
73 LITERAL@[64; 68)
74 TRUE_KW@[64; 68)
75 WHITESPACE@[68; 69)
76 PIPEPIPE@[69; 71)
77 WHITESPACE@[71; 72)
78 BIN_EXPR@[72; 85)
79 LITERAL@[72; 76)
80 TRUE_KW@[72; 76)
81 WHITESPACE@[76; 77)
82 AMPAMP@[77; 79)
83 WHITESPACE@[79; 80)
84 LITERAL@[80; 85)
85 FALSE_KW@[80; 85)
86 SEMI@[85; 86)
87 WHITESPACE@[86; 87)
88 R_CURLY@[87; 88)
89 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 @@
1fn foo() {
2 --1;
3}
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 @@
1FILE@[0; 22)
2 FN_ITEM@[0; 21)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 21)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 EXPR_STMT@[15; 19)
15 NEG_EXPR@[15; 18)
16 MINUS@[15; 16)
17 NEG_EXPR@[16; 18)
18 MINUS@[16; 17)
19 LITERAL@[17; 18)
20 INT_NUMBER@[17; 18) "1"
21 SEMI@[18; 19)
22 WHITESPACE@[19; 20)
23 R_CURLY@[20; 21)
24 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 @@
1fn binding_power() {
2 let x = 1 + 2 * 3 % 4 - 5 / 6;
3 1 + 2 * 3;
4 1 << 2 + 3;
5 1 & 2 >> 3;
6 1 ^ 2 & 3;
7 1 | 2 ^ 3;
8 1 == 2 | 3;
9 1 && 2 == 3;
10 //1 || 2 && 2;
11 //1 .. 2 || 3;
12 //1 = 2 .. 3;
13 //---&*1 - --2 * 9;
14}
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 @@
1FILE@[0; 248)
2 FN_ITEM@[0; 247)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 16)
6 IDENT@[3; 16) "binding_power"
7 PARAM_LIST@[16; 18)
8 L_PAREN@[16; 17)
9 R_PAREN@[17; 18)
10 WHITESPACE@[18; 19)
11 BLOCK_EXPR@[19; 247)
12 L_CURLY@[19; 20)
13 WHITESPACE@[20; 25)
14 LET_STMT@[25; 55)
15 LET_KW@[25; 28)
16 WHITESPACE@[28; 29)
17 BIND_PAT@[29; 30)
18 NAME@[29; 30)
19 IDENT@[29; 30) "x"
20 WHITESPACE@[30; 31)
21 EQ@[31; 32)
22 WHITESPACE@[32; 33)
23 BIN_EXPR@[33; 54)
24 BIN_EXPR@[33; 46)
25 LITERAL@[33; 34)
26 INT_NUMBER@[33; 34) "1"
27 WHITESPACE@[34; 35)
28 PLUS@[35; 36)
29 WHITESPACE@[36; 37)
30 BIN_EXPR@[37; 46)
31 BIN_EXPR@[37; 42)
32 LITERAL@[37; 38)
33 INT_NUMBER@[37; 38) "2"
34 WHITESPACE@[38; 39)
35 STAR@[39; 40)
36 WHITESPACE@[40; 41)
37 LITERAL@[41; 42)
38 INT_NUMBER@[41; 42) "3"
39 WHITESPACE@[42; 43)
40 PERCENT@[43; 44)
41 WHITESPACE@[44; 45)
42 LITERAL@[45; 46)
43 INT_NUMBER@[45; 46) "4"
44 WHITESPACE@[46; 47)
45 MINUS@[47; 48)
46 WHITESPACE@[48; 49)
47 BIN_EXPR@[49; 54)
48 LITERAL@[49; 50)
49 INT_NUMBER@[49; 50) "5"
50 WHITESPACE@[50; 51)
51 SLASH@[51; 52)
52 WHITESPACE@[52; 53)
53 LITERAL@[53; 54)
54 INT_NUMBER@[53; 54) "6"
55 SEMI@[54; 55)
56 WHITESPACE@[55; 60)
57 EXPR_STMT@[60; 70)
58 BIN_EXPR@[60; 69)
59 LITERAL@[60; 61)
60 INT_NUMBER@[60; 61) "1"
61 WHITESPACE@[61; 62)
62 PLUS@[62; 63)
63 WHITESPACE@[63; 64)
64 BIN_EXPR@[64; 69)
65 LITERAL@[64; 65)
66 INT_NUMBER@[64; 65) "2"
67 WHITESPACE@[65; 66)
68 STAR@[66; 67)
69 WHITESPACE@[67; 68)
70 LITERAL@[68; 69)
71 INT_NUMBER@[68; 69) "3"
72 SEMI@[69; 70)
73 WHITESPACE@[70; 75)
74 EXPR_STMT@[75; 86)
75 BIN_EXPR@[75; 85)
76 LITERAL@[75; 76)
77 INT_NUMBER@[75; 76) "1"
78 WHITESPACE@[76; 77)
79 SHL@[77; 79)
80 WHITESPACE@[79; 80)
81 BIN_EXPR@[80; 85)
82 LITERAL@[80; 81)
83 INT_NUMBER@[80; 81) "2"
84 WHITESPACE@[81; 82)
85 PLUS@[82; 83)
86 WHITESPACE@[83; 84)
87 LITERAL@[84; 85)
88 INT_NUMBER@[84; 85) "3"
89 SEMI@[85; 86)
90 WHITESPACE@[86; 91)
91 EXPR_STMT@[91; 102)
92 BIN_EXPR@[91; 101)
93 LITERAL@[91; 92)
94 INT_NUMBER@[91; 92) "1"
95 WHITESPACE@[92; 93)
96 AMP@[93; 94)
97 WHITESPACE@[94; 95)
98 BIN_EXPR@[95; 101)
99 LITERAL@[95; 96)
100 INT_NUMBER@[95; 96) "2"
101 WHITESPACE@[96; 97)
102 SHR@[97; 99)
103 WHITESPACE@[99; 100)
104 LITERAL@[100; 101)
105 INT_NUMBER@[100; 101) "3"
106 SEMI@[101; 102)
107 WHITESPACE@[102; 107)
108 EXPR_STMT@[107; 117)
109 BIN_EXPR@[107; 116)
110 LITERAL@[107; 108)
111 INT_NUMBER@[107; 108) "1"
112 WHITESPACE@[108; 109)
113 CARET@[109; 110)
114 WHITESPACE@[110; 111)
115 BIN_EXPR@[111; 116)
116 LITERAL@[111; 112)
117 INT_NUMBER@[111; 112) "2"
118 WHITESPACE@[112; 113)
119 AMP@[113; 114)
120 WHITESPACE@[114; 115)
121 LITERAL@[115; 116)
122 INT_NUMBER@[115; 116) "3"
123 SEMI@[116; 117)
124 WHITESPACE@[117; 122)
125 EXPR_STMT@[122; 132)
126 BIN_EXPR@[122; 131)
127 LITERAL@[122; 123)
128 INT_NUMBER@[122; 123) "1"
129 WHITESPACE@[123; 124)
130 PIPE@[124; 125)
131 WHITESPACE@[125; 126)
132 BIN_EXPR@[126; 131)
133 LITERAL@[126; 127)
134 INT_NUMBER@[126; 127) "2"
135 WHITESPACE@[127; 128)
136 CARET@[128; 129)
137 WHITESPACE@[129; 130)
138 LITERAL@[130; 131)
139 INT_NUMBER@[130; 131) "3"
140 SEMI@[131; 132)
141 WHITESPACE@[132; 137)
142 EXPR_STMT@[137; 148)
143 BIN_EXPR@[137; 147)
144 LITERAL@[137; 138)
145 INT_NUMBER@[137; 138) "1"
146 WHITESPACE@[138; 139)
147 EQEQ@[139; 141)
148 WHITESPACE@[141; 142)
149 BIN_EXPR@[142; 147)
150 LITERAL@[142; 143)
151 INT_NUMBER@[142; 143) "2"
152 WHITESPACE@[143; 144)
153 PIPE@[144; 145)
154 WHITESPACE@[145; 146)
155 LITERAL@[146; 147)
156 INT_NUMBER@[146; 147) "3"
157 SEMI@[147; 148)
158 WHITESPACE@[148; 153)
159 EXPR_STMT@[153; 165)
160 BIN_EXPR@[153; 164)
161 LITERAL@[153; 154)
162 INT_NUMBER@[153; 154) "1"
163 WHITESPACE@[154; 155)
164 AMPAMP@[155; 157)
165 WHITESPACE@[157; 158)
166 BIN_EXPR@[158; 164)
167 LITERAL@[158; 159)
168 INT_NUMBER@[158; 159) "2"
169 WHITESPACE@[159; 160)
170 EQEQ@[160; 162)
171 WHITESPACE@[162; 163)
172 LITERAL@[163; 164)
173 INT_NUMBER@[163; 164) "3"
174 SEMI@[164; 165)
175 WHITESPACE@[165; 170)
176 COMMENT@[170; 184)
177 WHITESPACE@[184; 189)
178 COMMENT@[189; 203)
179 WHITESPACE@[203; 208)
180 COMMENT@[208; 221)
181 WHITESPACE@[221; 226)
182 COMMENT@[226; 245)
183 WHITESPACE@[245; 246)
184 R_CURLY@[246; 247)
185 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 @@
1fn foo() {
2 ..1 + 1;
3 ..z = 2;
4 x = false..1 == 1;
5}
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 @@
1FILE@[0; 62)
2 FN_ITEM@[0; 61)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 61)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 EXPR_STMT@[15; 23)
15 RANGE_EXPR@[15; 22)
16 DOTDOT@[15; 17)
17 BIN_EXPR@[17; 22)
18 LITERAL@[17; 18)
19 INT_NUMBER@[17; 18) "1"
20 WHITESPACE@[18; 19)
21 PLUS@[19; 20)
22 WHITESPACE@[20; 21)
23 LITERAL@[21; 22)
24 INT_NUMBER@[21; 22) "1"
25 SEMI@[22; 23)
26 WHITESPACE@[23; 28)
27 EXPR_STMT@[28; 36)
28 BIN_EXPR@[28; 35)
29 RANGE_EXPR@[28; 31)
30 DOTDOT@[28; 30)
31 PATH_EXPR@[30; 31)
32 PATH@[30; 31)
33 PATH_SEGMENT@[30; 31)
34 NAME_REF@[30; 31)
35 IDENT@[30; 31) "z"
36 WHITESPACE@[31; 32)
37 EQ@[32; 33)
38 WHITESPACE@[33; 34)
39 LITERAL@[34; 35)
40 INT_NUMBER@[34; 35) "2"
41 SEMI@[35; 36)
42 WHITESPACE@[36; 41)
43 EXPR_STMT@[41; 59)
44 BIN_EXPR@[41; 58)
45 PATH_EXPR@[41; 42)
46 PATH@[41; 42)
47 PATH_SEGMENT@[41; 42)
48 NAME_REF@[41; 42)
49 IDENT@[41; 42) "x"
50 WHITESPACE@[42; 43)
51 EQ@[43; 44)
52 WHITESPACE@[44; 45)
53 BIN_EXPR@[45; 58)
54 LITERAL@[45; 50)
55 FALSE_KW@[45; 50)
56 DOTDOT@[50; 52)
57 BIN_EXPR@[52; 58)
58 LITERAL@[52; 53)
59 INT_NUMBER@[52; 53) "1"
60 WHITESPACE@[53; 54)
61 EQEQ@[54; 56)
62 WHITESPACE@[56; 57)
63 LITERAL@[57; 58)
64 INT_NUMBER@[57; 58) "1"
65 SEMI@[58; 59)
66 WHITESPACE@[59; 60)
67 R_CURLY@[60; 61)
68 WHITESPACE@[61; 62)