diff --git a/CHANGELOG.md b/CHANGELOG.md index c9eb542..8b5a166 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.6.1...Unreleased) - ReleaseDate +* [Fixed] parse error of cast + ## [v0.6.1](https://github.com/dalance/sv-parser/compare/v0.6.0...v0.6.1) - 2020-02-09 * [Changed] update str-concat diff --git a/sv-parser-parser/src/declarations/net_and_variable_types.rs b/sv-parser-parser/src/declarations/net_and_variable_types.rs index a5eae98..93ffcbc 100644 --- a/sv-parser-parser/src/declarations/net_and_variable_types.rs +++ b/sv-parser-parser/src/declarations/net_and_variable_types.rs @@ -12,7 +12,23 @@ pub(crate) fn casting_type(s: Span) -> IResult { map(signing, |x| CastingType::Signing(Box::new(x))), map(keyword("string"), |x| CastingType::String(Box::new(x))), map(keyword("const"), |x| CastingType::Const(Box::new(x))), - map(constant_primary, |x| { + map(constant_primary_without_cast, |x| { + CastingType::ConstantPrimary(Box::new(x)) + }), + ))(s) +} + +#[recursive_parser] +#[packrat_parser] +#[tracable_parser] +#[packrat_parser] +pub(crate) fn constant_casting_type(s: Span) -> IResult { + alt(( + map(simple_type, |x| CastingType::SimpleType(Box::new(x))), + map(signing, |x| CastingType::Signing(Box::new(x))), + map(keyword("string"), |x| CastingType::String(Box::new(x))), + map(keyword("const"), |x| CastingType::Const(Box::new(x))), + map(constant_primary_without_cast, |x| { CastingType::ConstantPrimary(Box::new(x)) }), ))(s) diff --git a/sv-parser-parser/src/expressions/primaries.rs b/sv-parser-parser/src/expressions/primaries.rs index 1ad2819..1b75e54 100644 --- a/sv-parser-parser/src/expressions/primaries.rs +++ b/sv-parser-parser/src/expressions/primaries.rs @@ -41,6 +41,42 @@ pub(crate) fn constant_primary(s: Span) -> IResult { ))(s) } +#[tracable_parser] +#[packrat_parser] +pub(crate) fn constant_primary_without_cast(s: Span) -> IResult { + alt(( + // BNF-WA + map(keyword("$"), |x| ConstantPrimary::Dollar(Box::new(x))), + map(keyword("null"), |x| ConstantPrimary::Null(Box::new(x))), + map(constant_assignment_pattern_expression, |x| { + ConstantPrimary::ConstantAssignmentPatternExpression(Box::new(x)) + }), + map(primary_literal, |x| { + ConstantPrimary::PrimaryLiteral(Box::new(x)) + }), + constant_primary_mintypmax_expression, + map( + terminated(constant_function_call, peek(not(one_of("[.")))), + |x| ConstantPrimary::ConstantFunctionCall(Box::new(x)), + ), + constant_primary_ps_parameter, + constant_primary_specparam, + map(genvar_identifier, |x| { + ConstantPrimary::GenvarIdentifier(Box::new(x)) + }), + constant_primary_formal_port, + constant_primary_enum, + constant_primary_concatenation, + constant_primary_multiple_concatenation, + map(constant_let_expression, |x| { + ConstantPrimary::ConstantLetExpression(Box::new(x)) + }), + map(type_reference, |x| { + ConstantPrimary::TypeReference(Box::new(x)) + }), + ))(s) +} + #[tracable_parser] #[packrat_parser] pub(crate) fn constant_primary_ps_parameter(s: Span) -> IResult { @@ -402,7 +438,7 @@ pub(crate) fn constant_select(s: Span) -> IResult { #[tracable_parser] #[packrat_parser] pub(crate) fn constant_cast(s: Span) -> IResult { - let (s, a) = casting_type(s)?; + let (s, a) = constant_casting_type(s)?; let (s, b) = symbol("'")(s)?; let (s, c) = paren(constant_expression)(s)?; Ok((s, ConstantCast { nodes: (a, b, c) })) diff --git a/sv-parser-parser/src/tests.rs b/sv-parser-parser/src/tests.rs index 11ef683..793d569 100644 --- a/sv-parser-parser/src/tests.rs +++ b/sv-parser-parser/src/tests.rs @@ -418,6 +418,11 @@ mod unit { r##"module test(); specify $setup(posedge CSB, edge[01,0x,x1,1x] CL, tps, a); endspecify endmodule"##, Ok((_, _)) ); + test!( + source_text, + r##"module a; assign a = a[$clog2(a)'(a)]; endmodule"##, + Ok((_, _)) + ); } } @@ -15876,10 +15881,6 @@ mod spec { #[test] fn debug() { - test!( - source_text, - r##"module a; initial begin #1 ps[idx] = 1'b1; end endmodule"##, - Ok((_, _)) - ); + test!(expression, r##"a[$clog2(a)'(a)]"##, Ok((_, _))); nom_tracable::cumulative_histogram(); }