infix range is range

This commit is contained in:
Aleksey Kladov 2018-08-07 15:21:15 +03:00
parent ede506e031
commit 42e3a8ef77
3 changed files with 27 additions and 14 deletions

View file

@ -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)
}

View file

@ -2,4 +2,5 @@ fn foo() {
..1 + 1;
..z = 2;
x = false..1 == 1;
let x = 1..;
}

View file

@ -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)