diff --git a/CHANGELOG.md b/CHANGELOG.md index 9963aa8..ecfbedd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.1.4...Unreleased) - ReleaseDate +* [Fixed] cond_predicate in cond_predicate * [Fixed] fixed_number priority in delay_value * [Fixed] cast/const_cast priority * [Added] unwrap_node macro diff --git a/sv-parser-parser/src/expressions/expressions.rs b/sv-parser-parser/src/expressions/expressions.rs index 9bd8a1e..6a5add2 100644 --- a/sv-parser-parser/src/expressions/expressions.rs +++ b/sv-parser-parser/src/expressions/expressions.rs @@ -37,7 +37,7 @@ pub(crate) fn inc_or_dec_expression_suffix(s: Span) -> IResult IResult { - let (s, a) = cond_predicate(s)?; + let (s, a) = cond_predicate_ternary(s)?; let (s, b) = symbol("?")(s)?; let (s, c) = many0(attribute_instance)(s)?; let (s, d) = expression(s)?; @@ -51,6 +51,29 @@ pub(crate) fn conditional_expression(s: Span) -> IResult IResult { + let (s, a) = list(symbol("&&&"), expression_or_cond_pattern_ternary)(s)?; + Ok((s, CondPredicate { nodes: (a,) })) +} + +#[tracable_parser] +#[packrat_parser] +pub(crate) fn expression_or_cond_pattern_ternary( + s: Span, +) -> IResult { + alt(( + map(cond_pattern, |x| { + ExpressionOrCondPattern::CondPattern(Box::new(x)) + }), + map(expression, |x| { + ExpressionOrCondPattern::Expression(Box::new(x)) + }), + ))(s) +} + #[tracable_parser] #[packrat_parser] pub(crate) fn constant_expression(s: Span) -> IResult {