Added tuples parser with parentheses

note: tuples without parentheses are not implemented
This commit is contained in:
GreasySlug 2022-08-20 10:10:23 +09:00
parent 10a7c49b07
commit c80cf11fa6

View file

@ -1755,18 +1755,9 @@ impl Parser {
Ok(Expr::Lambda(lambda))
}
Some(t) if t.is(LParen) => {
self.skip();
let expr = self.try_reduce_expr().map_err(|_| self.stack_dec())?;
if self.cur_is(RParen) {
self.skip();
self.level -= 1;
Ok(expr)
} else {
self.level -= 1;
let err = self.skip_and_throw_syntax_err(caused_by!());
self.errs.push(err);
return Err(());
}
let tuple = self.try_reduce_tuple().map_err(|_| self.stack_dec())?;
self.level -= 1;
Ok(Expr::Tuple(tuple))
}
Some(t) if t.is(LSqBr) => {
let array = self.try_reduce_array().map_err(|_| self.stack_dec())?;
@ -1860,6 +1851,31 @@ impl Parser {
Ok(arr)
}
#[inline]
fn try_reduce_tuple(&mut self) -> ParseResult<Tuple> {
debug_call_info!(self);
let l_paren = self.lpop();
let inner = self.try_reduce_elems().map_err(|_| self.stack_dec())?;
let r_paren = self.lpop();
if !r_paren.is(RParen) {
self.level -= 1;
self.errs
.push(ParseError::simple_syntax_error(0, r_paren.loc()));
return Err(());
}
let tpl = match inner {
ArrayInner::Normal(elems) => Tuple::Normal(NormalTuple::new(l_paren, r_paren, elems)),
ArrayInner::Comprehension {
elem: _,
generators: _,
guards: _,
} => todo!(),
_ => unreachable!(),
};
self.level -= 1;
Ok(tpl)
}
#[inline]
fn try_reduce_name(&mut self) -> ParseResult<VarName> {
debug_call_info!(self);