use crate::*; // ----------------------------------------------------------------------------- #[parser] pub(crate) fn inc_or_dec_expression(s: Span) -> IResult { alt((inc_or_dec_expression_prefix, inc_or_dec_expression_suffix))(s) } #[parser] pub(crate) fn inc_or_dec_expression_prefix(s: Span) -> IResult { let (s, a) = inc_or_dec_operator(s)?; let (s, b) = many0(attribute_instance)(s)?; let (s, c) = variable_lvalue(s)?; Ok(( s, IncOrDecExpression::Prefix(Box::new(IncOrDecExpressionPrefix { nodes: (a, b, c) })), )) } #[parser(MaybeRecursive)] pub(crate) fn inc_or_dec_expression_suffix(s: Span) -> IResult { let (s, a) = variable_lvalue(s)?; let (s, b) = many0(attribute_instance)(s)?; let (s, c) = inc_or_dec_operator(s)?; Ok(( s, IncOrDecExpression::Suffix(Box::new(IncOrDecExpressionSuffix { nodes: (a, b, c) })), )) } #[parser(MaybeRecursive)] pub(crate) fn conditional_expression(s: Span) -> IResult { let (s, a) = cond_predicate(s)?; let (s, b) = symbol("?")(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = expression(s)?; let (s, e) = symbol(":")(s)?; let (s, f) = expression(s)?; Ok(( s, ConditionalExpression { nodes: (a, b, c, d, e, f), }, )) } #[packrat_parser] #[parser] pub(crate) fn constant_expression(s: Span) -> IResult { alt(( constant_expression_unary, constant_expression_binary, constant_expression_ternary, map(constant_primary, |x| { ConstantExpression::ConstantPrimary(Box::new(x)) }), ))(s) } #[parser] pub(crate) fn constant_expression_unary(s: Span) -> IResult { let (s, a) = unary_operator(s)?; let (s, b) = many0(attribute_instance)(s)?; let (s, c) = constant_primary(s)?; Ok(( s, ConstantExpression::Unary(Box::new(ConstantExpressionUnary { nodes: (a, b, c) })), )) } #[parser(MaybeRecursive)] pub(crate) fn constant_expression_binary(s: Span) -> IResult { let (s, a) = constant_expression(s)?; let (s, b) = binary_operator(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = constant_expression(s)?; Ok(( s, ConstantExpression::Binary(Box::new(ConstantExpressionBinary { nodes: (a, b, c, d), })), )) } #[parser(MaybeRecursive)] pub(crate) fn constant_expression_ternary(s: Span) -> IResult { let (s, a) = constant_expression(s)?; let (s, b) = symbol("?")(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = constant_expression(s)?; let (s, e) = symbol(":")(s)?; let (s, f) = constant_expression(s)?; Ok(( s, ConstantExpression::Ternary(Box::new(ConstantExpressionTernary { nodes: (a, b, c, d, e, f), })), )) } #[parser] pub(crate) fn constant_mintypmax_expression(s: Span) -> IResult { alt(( constant_mintypmax_expression_ternary, map(constant_expression, |x| { ConstantMintypmaxExpression::Unary(Box::new(x)) }), ))(s) } #[parser(MaybeRecursive)] pub(crate) fn constant_mintypmax_expression_ternary( s: Span, ) -> IResult { let (s, a) = constant_expression(s)?; let (s, b) = symbol(":")(s)?; let (s, c) = constant_expression(s)?; let (s, d) = symbol(":")(s)?; let (s, e) = constant_expression(s)?; Ok(( s, ConstantMintypmaxExpression::Ternary(Box::new(ConstantMintypmaxExpressionTernary { nodes: (a, b, c, d, e), })), )) } #[parser] pub(crate) fn constant_param_expression(s: Span) -> IResult { alt(( map(symbol("$"), |x| { ConstantParamExpression::Dollar(Box::new(x)) }), map(constant_mintypmax_expression, |x| { ConstantParamExpression::ConstantMintypmaxExpression(Box::new(x)) }), map(data_type, |x| { ConstantParamExpression::DataType(Box::new(x)) }), ))(s) } #[parser] pub(crate) fn param_expression(s: Span) -> IResult { alt(( map(symbol("$"), |x| ParamExpression::Dollar(Box::new(x))), map(mintypmax_expression, |x| { ParamExpression::MintypmaxExpression(Box::new(x)) }), map(data_type, |x| ParamExpression::DataType(Box::new(x))), ))(s) } #[parser] pub(crate) fn constant_range_expression(s: Span) -> IResult { alt(( map(constant_part_select_range, |x| { ConstantRangeExpression::ConstantPartSelectRange(Box::new(x)) }), map(constant_expression, |x| { ConstantRangeExpression::ConstantExpression(Box::new(x)) }), ))(s) } #[parser] pub(crate) fn constant_part_select_range(s: Span) -> IResult { alt(( map(constant_range, |x| { ConstantPartSelectRange::ConstantRange(Box::new(x)) }), map(constant_indexed_range, |x| { ConstantPartSelectRange::ConstantIndexedRange(Box::new(x)) }), ))(s) } #[parser(MaybeRecursive)] pub(crate) fn constant_range(s: Span) -> IResult { let (s, a) = constant_expression(s)?; let (s, b) = symbol(":")(s)?; let (s, c) = constant_expression(s)?; Ok((s, ConstantRange { nodes: (a, b, c) })) } #[parser(MaybeRecursive)] pub(crate) fn constant_indexed_range(s: Span) -> IResult { let (s, a) = constant_expression(s)?; let (s, b) = alt((symbol("+:"), symbol("-:")))(s)?; let (s, c) = constant_expression(s)?; Ok((s, ConstantIndexedRange { nodes: (a, b, c) })) } #[packrat_parser] #[parser] pub(crate) fn expression(s: Span) -> IResult { alt(( expression_unary, map(inc_or_dec_expression, |x| { Expression::IncOrDecExpression(Box::new(x)) }), expression_operator_assignment, expression_binary, map(conditional_expression, |x| { Expression::ConditionalExpression(Box::new(x)) }), map(inside_expression, |x| { Expression::InsideExpression(Box::new(x)) }), map(tagged_union_expression, |x| { Expression::TaggedUnionExpression(Box::new(x)) }), map(primary, |x| Expression::Primary(Box::new(x))), ))(s) } #[parser] pub(crate) fn expression_unary(s: Span) -> IResult { let (s, x) = unary_operator(s)?; let (s, y) = many0(attribute_instance)(s)?; let (s, z) = primary(s)?; Ok(( s, Expression::Unary(Box::new(ExpressionUnary { nodes: (x, y, z) })), )) } #[parser] pub(crate) fn expression_operator_assignment(s: Span) -> IResult { let (s, a) = paren(operator_assignment)(s)?; Ok(( s, Expression::OperatorAssignment(Box::new(ExpressionOperatorAssignment { nodes: (a,) })), )) } #[parser(MaybeRecursive)] pub(crate) fn expression_binary(s: Span) -> IResult { let (s, a) = expression(s)?; let (s, b) = binary_operator(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = expression(s)?; Ok(( s, Expression::Binary(Box::new(ExpressionBinary { nodes: (a, b, c, d), })), )) } #[parser] pub(crate) fn tagged_union_expression(s: Span) -> IResult { let (s, a) = keyword("tagged")(s)?; let (s, b) = member_identifier(s)?; let (s, c) = opt(expression)(s)?; Ok((s, TaggedUnionExpression { nodes: (a, b, c) })) } #[parser(MaybeRecursive)] pub(crate) fn inside_expression(s: Span) -> IResult { let (s, a) = expression(s)?; let (s, b) = keyword("inside")(s)?; let (s, c) = brace(open_range_list)(s)?; Ok((s, InsideExpression { nodes: (a, b, c) })) } #[parser] pub(crate) fn value_range(s: Span) -> IResult { alt(( value_range_binary, map(expression, |x| ValueRange::Expression(Box::new(x))), ))(s) } #[parser] pub(crate) fn value_range_binary(s: Span) -> IResult { let (s, a) = bracket(triple(expression, symbol(":"), expression))(s)?; Ok(( s, ValueRange::Binary(Box::new(ValueRangeBinary { nodes: (a,) })), )) } #[parser] pub(crate) fn mintypmax_expression(s: Span) -> IResult { alt(( mintypmax_expression_ternary, map(expression, |x| MintypmaxExpression::Expression(Box::new(x))), ))(s) } #[parser(MaybeRecursive)] pub(crate) fn mintypmax_expression_ternary(s: Span) -> IResult { let (s, a) = expression(s)?; let (s, b) = symbol(":")(s)?; let (s, c) = expression(s)?; let (s, d) = symbol(":")(s)?; let (s, e) = expression(s)?; Ok(( s, MintypmaxExpression::Ternary(Box::new(MintypmaxExpressionTernary { nodes: (a, b, c, d, e), })), )) } #[parser(MaybeRecursive)] pub(crate) fn module_path_conditional_expression( s: Span, ) -> IResult { let (s, a) = module_path_expression(s)?; let (s, b) = symbol("?")(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = module_path_expression(s)?; let (s, e) = symbol(":")(s)?; let (s, f) = module_path_expression(s)?; Ok(( s, ModulePathConditionalExpression { nodes: (a, b, c, d, e, f), }, )) } #[parser] pub(crate) fn module_path_expression(s: Span) -> IResult { alt(( map(module_path_primary, |x| { ModulePathExpression::ModulePathPrimary(Box::new(x)) }), module_path_expression_unary, module_path_expression_binary, map(module_path_conditional_expression, |x| { ModulePathExpression::ModulePathConditionalExpression(Box::new(x)) }), ))(s) } #[parser] pub(crate) fn module_path_expression_unary(s: Span) -> IResult { let (s, a) = unary_module_path_operator(s)?; let (s, b) = many0(attribute_instance)(s)?; let (s, c) = module_path_primary(s)?; Ok(( s, ModulePathExpression::Unary(Box::new(ModulePathExpressionUnary { nodes: (a, b, c) })), )) } #[parser(MaybeRecursive)] pub(crate) fn module_path_expression_binary(s: Span) -> IResult { let (s, a) = module_path_expression(s)?; let (s, b) = binary_module_path_operator(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = module_path_expression(s)?; Ok(( s, ModulePathExpression::Binary(Box::new(ModulePathExpressionBinary { nodes: (a, b, c, d), })), )) } #[parser] pub(crate) fn module_path_mintypmax_expression( s: Span, ) -> IResult { alt(( module_path_mintypmax_expression_ternary, map(module_path_expression, |x| { ModulePathMintypmaxExpression::ModulePathExpression(Box::new(x)) }), ))(s) } #[parser(MaybeRecursive)] pub(crate) fn module_path_mintypmax_expression_ternary( s: Span, ) -> IResult { let (s, a) = module_path_expression(s)?; let (s, b) = symbol(":")(s)?; let (s, c) = module_path_expression(s)?; let (s, d) = symbol(":")(s)?; let (s, e) = module_path_expression(s)?; Ok(( s, ModulePathMintypmaxExpression::Ternary(Box::new(ModulePathMintypmaxExpressionTernary { nodes: (a, b, c, d, e), })), )) } #[parser] pub(crate) fn part_select_range(s: Span) -> IResult { alt(( map(constant_range, |x| { PartSelectRange::ConstantRange(Box::new(x)) }), map(indexed_range, |x| { PartSelectRange::IndexedRange(Box::new(x)) }), ))(s) } #[parser(MaybeRecursive)] pub(crate) fn indexed_range(s: Span) -> IResult { let (s, a) = expression(s)?; let (s, b) = alt((symbol("+:"), symbol("-:")))(s)?; let (s, c) = constant_expression(s)?; Ok((s, IndexedRange { nodes: (a, b, c) })) } #[parser] pub(crate) fn genvar_expression(s: Span) -> IResult { let (s, a) = constant_expression(s)?; Ok((s, GenvarExpression { nodes: (a,) })) }