more expr parsing

This commit is contained in:
janis 2025-10-08 17:06:24 +02:00
parent 9a799ea281
commit 77bd4f3f16
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -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::<Vec<_>>()
.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)
})
}