forked from AbleOS/holey-bytes
fixing the precedence regarding slice ranges
Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
This commit is contained in:
parent
5909837015
commit
9c4b84ce33
|
@ -490,15 +490,6 @@ impl<'a, 'b> Parser<'a, 'b> {
|
||||||
},
|
},
|
||||||
body: self.ptr_expr()?,
|
body: self.ptr_expr()?,
|
||||||
},
|
},
|
||||||
T::Range => E::Range {
|
|
||||||
pos: token.start,
|
|
||||||
start: None,
|
|
||||||
end: if matches!(self.token.kind, TokenKind::RBrack) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(self.ptr_expr()?)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
T::Ctor => self.ctor(pos, None),
|
T::Ctor => self.ctor(pos, None),
|
||||||
T::Tupl => self.tupl(pos, None, ListKind::Tuple),
|
T::Tupl => self.tupl(pos, None, ListKind::Tuple),
|
||||||
T::Arr => self.tupl(pos, None, ListKind::Array),
|
T::Arr => self.tupl(pos, None, ListKind::Array),
|
||||||
|
@ -570,14 +561,7 @@ impl<'a, 'b> Parser<'a, 'b> {
|
||||||
let token = self.token;
|
let token = self.token;
|
||||||
if matches!(
|
if matches!(
|
||||||
token.kind,
|
token.kind,
|
||||||
T::LParen
|
T::LParen | T::Ctor | T::Dot | T::Tupl | T::Arr | T::LBrack | T::Colon
|
||||||
| T::Ctor
|
|
||||||
| T::Dot
|
|
||||||
| T::Tupl
|
|
||||||
| T::Arr
|
|
||||||
| T::LBrack
|
|
||||||
| T::Colon
|
|
||||||
| T::Range
|
|
||||||
) {
|
) {
|
||||||
self.next();
|
self.next();
|
||||||
}
|
}
|
||||||
|
@ -593,20 +577,43 @@ impl<'a, 'b> Parser<'a, 'b> {
|
||||||
T::Arr => self.tupl(token.start, Some(expr), ListKind::Array),
|
T::Arr => self.tupl(token.start, Some(expr), ListKind::Array),
|
||||||
T::LBrack => E::Index {
|
T::LBrack => E::Index {
|
||||||
base: self.arena.alloc(expr),
|
base: self.arena.alloc(expr),
|
||||||
index: {
|
index: self.arena.alloc({
|
||||||
let index = self.expr()?;
|
if self.advance_if(T::Range) {
|
||||||
self.expect_advance(T::RBrack)?;
|
let pos = self.token.start;
|
||||||
self.arena.alloc(index)
|
if self.advance_if(T::RBrack) {
|
||||||
},
|
Expr::Range { pos, start: None, end: None }
|
||||||
},
|
} else {
|
||||||
T::Range => E::Range {
|
let res = Expr::Range {
|
||||||
pos: token.start,
|
pos,
|
||||||
start: Some(self.arena.alloc(expr)),
|
start: None,
|
||||||
end: if matches!(self.token.kind, TokenKind::RBrack) {
|
end: Some(self.ptr_expr()?),
|
||||||
None
|
};
|
||||||
} else {
|
self.expect_advance(T::RBrack)?;
|
||||||
Some(self.ptr_expr()?)
|
res
|
||||||
},
|
}
|
||||||
|
} else {
|
||||||
|
let start = self.expr()?;
|
||||||
|
|
||||||
|
let pos = self.token.start;
|
||||||
|
if self.advance_if(T::Range) {
|
||||||
|
let start = self.arena.alloc(start);
|
||||||
|
if self.advance_if(T::RBrack) {
|
||||||
|
Expr::Range { pos, start: Some(start), end: None }
|
||||||
|
} else {
|
||||||
|
let res = Expr::Range {
|
||||||
|
pos,
|
||||||
|
start: Some(start),
|
||||||
|
end: Some(self.ptr_expr()?),
|
||||||
|
};
|
||||||
|
self.expect_advance(T::RBrack)?;
|
||||||
|
res
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.expect_advance(T::RBrack)?;
|
||||||
|
start
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
T::Colon => E::BinOp {
|
T::Colon => E::BinOp {
|
||||||
left: {
|
left: {
|
||||||
|
|
Loading…
Reference in a new issue