mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 21:01:10 +00:00
Added tuples parser with parentheses
note: tuples without parentheses are not implemented
This commit is contained in:
parent
10a7c49b07
commit
c80cf11fa6
1 changed files with 28 additions and 12 deletions
|
@ -1755,18 +1755,9 @@ impl Parser {
|
||||||
Ok(Expr::Lambda(lambda))
|
Ok(Expr::Lambda(lambda))
|
||||||
}
|
}
|
||||||
Some(t) if t.is(LParen) => {
|
Some(t) if t.is(LParen) => {
|
||||||
self.skip();
|
let tuple = self.try_reduce_tuple().map_err(|_| self.stack_dec())?;
|
||||||
let expr = self.try_reduce_expr().map_err(|_| self.stack_dec())?;
|
|
||||||
if self.cur_is(RParen) {
|
|
||||||
self.skip();
|
|
||||||
self.level -= 1;
|
self.level -= 1;
|
||||||
Ok(expr)
|
Ok(Expr::Tuple(tuple))
|
||||||
} else {
|
|
||||||
self.level -= 1;
|
|
||||||
let err = self.skip_and_throw_syntax_err(caused_by!());
|
|
||||||
self.errs.push(err);
|
|
||||||
return Err(());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Some(t) if t.is(LSqBr) => {
|
Some(t) if t.is(LSqBr) => {
|
||||||
let array = self.try_reduce_array().map_err(|_| self.stack_dec())?;
|
let array = self.try_reduce_array().map_err(|_| self.stack_dec())?;
|
||||||
|
@ -1860,6 +1851,31 @@ impl Parser {
|
||||||
Ok(arr)
|
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]
|
#[inline]
|
||||||
fn try_reduce_name(&mut self) -> ParseResult<VarName> {
|
fn try_reduce_name(&mut self) -> ParseResult<VarName> {
|
||||||
debug_call_info!(self);
|
debug_call_info!(self);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue