From 42e3a8ef77d75cdd0abf4f0729082a112beefb67 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 7 Aug 2018 15:21:15 +0300 Subject: infix range is range --- src/grammar/expressions/mod.rs | 11 ++++------- tests/data/parser/ok/0029_range_forms.rs | 1 + tests/data/parser/ok/0029_range_forms.txt | 29 ++++++++++++++++++++++------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/grammar/expressions/mod.rs b/src/grammar/expressions/mod.rs index a94964c39..55e965ff4 100644 --- a/src/grammar/expressions/mod.rs +++ b/src/grammar/expressions/mod.rs @@ -92,17 +92,20 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) { }; loop { + let is_range = p.current() == DOTDOT; let (op_bp, op) = current_op(p); if op_bp < bp { break; } + let m = lhs.precede(p); match op { Op::Simple => p.bump(), Op::Composite(kind, n) => { p.bump_compound(kind, n); } } - lhs = bin_expr(p, r, lhs, op_bp + 1); + expr_bp(p, r, op_bp + 1); + lhs = m.complete(p, if is_range { RANGE_EXPR } else { BIN_EXPR }); } } @@ -330,9 +333,3 @@ fn struct_lit(p: &mut Parser) { } p.expect(R_CURLY); } - -fn bin_expr(p: &mut Parser, r: Restrictions, lhs: CompletedMarker, bp: u8) -> CompletedMarker { - let m = lhs.precede(p); - expr_bp(p, r, bp); - m.complete(p, BIN_EXPR) -} diff --git a/tests/data/parser/ok/0029_range_forms.rs b/tests/data/parser/ok/0029_range_forms.rs index 74de11a7e..03f4ae7b2 100644 --- a/tests/data/parser/ok/0029_range_forms.rs +++ b/tests/data/parser/ok/0029_range_forms.rs @@ -2,4 +2,5 @@ fn foo() { ..1 + 1; ..z = 2; x = false..1 == 1; + let x = 1..; } diff --git a/tests/data/parser/ok/0029_range_forms.txt b/tests/data/parser/ok/0029_range_forms.txt index 8599f7dfc..2dbc6bdee 100644 --- a/tests/data/parser/ok/0029_range_forms.txt +++ b/tests/data/parser/ok/0029_range_forms.txt @@ -1,5 +1,5 @@ -FILE@[0; 62) - FN_ITEM@[0; 61) +FILE@[0; 79) + FN_ITEM@[0; 78) FN_KW@[0; 2) WHITESPACE@[2; 3) NAME@[3; 6) @@ -8,7 +8,7 @@ FILE@[0; 62) L_PAREN@[6; 7) R_PAREN@[7; 8) WHITESPACE@[8; 9) - BLOCK_EXPR@[9; 61) + BLOCK_EXPR@[9; 78) L_CURLY@[9; 10) WHITESPACE@[10; 15) EXPR_STMT@[15; 23) @@ -50,7 +50,7 @@ FILE@[0; 62) WHITESPACE@[42; 43) EQ@[43; 44) WHITESPACE@[44; 45) - BIN_EXPR@[45; 58) + RANGE_EXPR@[45; 58) LITERAL@[45; 50) FALSE_KW@[45; 50) DOTDOT@[50; 52) @@ -63,6 +63,21 @@ FILE@[0; 62) LITERAL@[57; 58) INT_NUMBER@[57; 58) "1" SEMI@[58; 59) - WHITESPACE@[59; 60) - R_CURLY@[60; 61) - WHITESPACE@[61; 62) + WHITESPACE@[59; 64) + LET_STMT@[64; 76) + LET_KW@[64; 67) + WHITESPACE@[67; 68) + BIND_PAT@[68; 69) + NAME@[68; 69) + IDENT@[68; 69) "x" + WHITESPACE@[69; 70) + EQ@[70; 71) + WHITESPACE@[71; 72) + RANGE_EXPR@[72; 75) + LITERAL@[72; 73) + INT_NUMBER@[72; 73) "1" + DOTDOT@[73; 75) + SEMI@[75; 76) + WHITESPACE@[76; 77) + R_CURLY@[77; 78) + WHITESPACE@[78; 79) -- cgit v1.2.3