Fix parse error of cast

This commit is contained in:
dalance 2020-02-13 18:19:11 +09:00
parent 782f120b4a
commit 1e281dcc35
4 changed files with 62 additions and 7 deletions

View File

@ -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

View File

@ -12,7 +12,23 @@ pub(crate) fn casting_type(s: Span) -> IResult<Span, CastingType> {
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<Span, CastingType> {
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)

View File

@ -41,6 +41,42 @@ pub(crate) fn constant_primary(s: Span) -> IResult<Span, ConstantPrimary> {
))(s)
}
#[tracable_parser]
#[packrat_parser]
pub(crate) fn constant_primary_without_cast(s: Span) -> IResult<Span, ConstantPrimary> {
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<Span, ConstantPrimary> {
@ -402,7 +438,7 @@ pub(crate) fn constant_select(s: Span) -> IResult<Span, ConstantSelect> {
#[tracable_parser]
#[packrat_parser]
pub(crate) fn constant_cast(s: Span) -> IResult<Span, ConstantCast> {
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) }))

View File

@ -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();
}