use self::primary::{PrimaryExpression, PrimaryExpressionParsingError};
use super::AstNode;
use crate::parser::fragment::Fragment;
pub mod primary;
pub mod unary;
#[derive(Debug)]
pub enum Expression<'src> {
Primary(PrimaryExpression<'src>),
}
#[derive(Debug, Clone)]
pub enum ExpressionParsingError<'src> {
ExpectedExpression {
at: Fragment<'src>,
},
PrimaryExpressionParsingError(PrimaryExpressionParsingError<'src>),
}
#[rustfmt::skip] impl<'src> AstNode<'src> for Expression<'src> {
type Error = ExpressionParsingError<'src>;
fn fragment(&self) -> Fragment<'src> {
match self {
Expression::Primary(primary) => primary.fragment(),
}
}
fn try_parse(ctx: &mut super::AstGeneratorContext<'src>) -> Result<Self, Self::Error>
where
Self: Sized,
{
match PrimaryExpression::try_parse(ctx) {
Ok(primary) => return Ok(Expression::Primary(primary)),
Err(err @ (
| PrimaryExpressionParsingError::OtherIntegerLiteralParsingError(_)
| PrimaryExpressionParsingError::OtherParensExpressionParsingError(_)
)) => {
return Err(ExpressionParsingError::PrimaryExpressionParsingError(err));
}
Err(PrimaryExpressionParsingError::ExpectedPrimaryExpression { .. }) => {}
}
Err(ExpressionParsingError::ExpectedExpression {
at: ctx.peek_fragment(),
})
}
}