more expr parsing
This commit is contained in:
parent
9a799ea281
commit
77bd4f3f16
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue