From 77bd4f3f168005038202fd311f98820da4397615 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 8 Oct 2025 17:06:24 +0200 Subject: [PATCH] more expr parsing --- crates/parser/src/lib.rs | 131 +++++++++------------------------------ 1 file changed, 29 insertions(+), 102 deletions(-) diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index 550c42e..087b1cf 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -590,9 +590,37 @@ fn expr<'a>() -> impl Parser<'a, TokenInput<'a>, Index, ParserExtra> { // TODO: postfix: function call, field access, array subscript recursive(|_expr| { - let simple = simple_expr(_expr); + let simple = simple_expr(_expr.clone()); + + let subscript = _expr.clone().delimited_by( + just(Token::OpenSquareBracket), + just(Token::CloseSquareBracket), + ); + + let arguments = _expr + .separated_by(just(Token::Comma)) + .allow_trailing() + .collect::>() + .delimited_by(just(Token::OpenParens), just(Token::CloseParens)); + + let field = just(Token::Dot).ignore_then(select! {Token::Ident(ident) => ident}); let expr = simple.pratt(( + postfix(100, subscript, |expr, index, e: &mut E| { + let node = AstNode::Subscript { expr, index }; + e.state().push(node) + }), + postfix(100, arguments, |callee, arguments, e: &mut E| { + let node = AstNode::CallExpr { callee, arguments }; + e.state().push(node) + }), + postfix(100, field, |expr, field: &str, e: &mut E| { + let node = AstNode::FieldAccess { + expr, + field: field.to_string(), + }; + e.state().push(node) + }), postfix(99, r#as, |expr, ty, e: &mut E| { let node = AstNode::ExplicitCast { expr, ty }; e.state().push(node) @@ -701,107 +729,6 @@ fn expr<'a>() -> impl Parser<'a, TokenInput<'a>, Index, ParserExtra> { }), )); - // let product = simple.clone().foldl_with( - // multiplicative.then(simple).repeated(), - // |left, (op, right), e| { - // let node = match op { - // Token::Star => AstNode::Multiply { left, right }, - // Token::Slash => AstNode::Divide { left, right }, - // Token::Percent => AstNode::Modulus { left, right }, - // _ => unreachable!(), - // }; - // e.state().push(node) - // }, - // ); - - // let sum = product.clone().foldl_with( - // additive.then(product).repeated(), - // |left, (op, right), e| { - // let node = match op { - // Token::Plus => AstNode::Add { left, right }, - // Token::Minus => AstNode::Subtract { left, right }, - // _ => unreachable!(), - // }; - // e.state().push(node) - // }, - // ); - - // let shift = sum - // .clone() - // .foldl_with(shift.then(sum).repeated(), |left, (op, right), e| { - // let node = match op { - // Token::LessLess => AstNode::ShiftLeft { left, right }, - // Token::GreaterGreater => AstNode::ShiftRight { left, right }, - // _ => unreachable!(), - // }; - // e.state().push(node) - // }); - - // let comparison = - // shift - // .clone() - // .foldl_with(relational.then(shift).repeated(), |left, (op, right), e| { - // let node = match op { - // Token::Less => AstNode::Less { left, right }, - // Token::LessEqual => AstNode::LessEq { left, right }, - // Token::Greater => AstNode::Greater { left, right }, - // Token::GreaterEqual => AstNode::GreaterEq { left, right }, - // _ => unreachable!(), - // }; - // e.state().push(node) - // }); - - // let equality = comparison.clone().foldl_with( - // equality.then(comparison).repeated(), - // |left, (op, right), e| { - // let node = match op { - // Token::EqualEqual => AstNode::Eq { left, right }, - // Token::BangEqual => AstNode::NotEq { left, right }, - // _ => unreachable!(), - // }; - // e.state().push(node) - // }, - // ); - - // let bit_and = - // equality - // .clone() - // .foldl_with(and.then(equality).repeated(), |left, (_op, right), e| { - // let node = AstNode::BitAnd { left, right }; - // e.state().push(node) - // }); - - // let bit_xor = - // bit_and - // .clone() - // .foldl_with(xor.then(bit_and).repeated(), |left, (_op, right), e| { - // let node = AstNode::BitXor { left, right }; - // e.state().push(node) - // }); - - // let bit_or = - // bit_xor - // .clone() - // .foldl_with(or.then(bit_xor).repeated(), |left, (_op, right), e| { - // let node = AstNode::BitOr { left, right }; - // e.state().push(node) - // }); - - // let and = bit_or.clone().foldl_with( - // logical_and.then(bit_or).repeated(), - // |left, (_op, right), e| { - // let node = AstNode::LogicalAnd { left, right }; - // e.state().push(node) - // }, - // ); - - // let or = - // and.clone() - // .foldl_with(logical_or.then(and).repeated(), |left, (_op, right), e| { - // let node = AstNode::LogicalOr { left, right }; - // e.state().push(node) - // }); - Arc::new(expr) }) }