Clear internal state at each parse

This commit is contained in:
dalance 2021-01-08 15:21:11 +09:00
parent 50fd04c3bd
commit bc25ea914e
4 changed files with 66 additions and 6 deletions

View File

@ -2,6 +2,8 @@
## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.10.3...Unreleased) - ReleaseDate ## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.10.3...Unreleased) - ReleaseDate
* [Fixed] uncleared internal state
## [v0.10.3](https://github.com/dalance/sv-parser/compare/v0.10.2...v0.10.3) - 2021-01-08 ## [v0.10.3](https://github.com/dalance/sv-parser/compare/v0.10.2...v0.10.3) - 2021-01-08
* [Fixed] empty port list is parsed as non-ANSI style * [Fixed] empty port list is parsed as non-ANSI style

View File

@ -91,26 +91,32 @@ impl HasExtraState<bool> for SpanInfo {
nom_packrat::storage!(AnyNode, bool, 1024); nom_packrat::storage!(AnyNode, bool, 1024);
pub fn sv_parser(s: Span) -> IResult<Span, SourceText> { pub fn sv_parser(s: Span) -> IResult<Span, SourceText> {
nom_packrat::init!(); init();
source_text(s) source_text(s)
} }
pub fn sv_parser_incomplete(s: Span) -> IResult<Span, SourceText> { pub fn sv_parser_incomplete(s: Span) -> IResult<Span, SourceText> {
nom_packrat::init!(); init();
source_text_incomplete(s) source_text_incomplete(s)
} }
pub fn lib_parser(s: Span) -> IResult<Span, LibraryText> { pub fn lib_parser(s: Span) -> IResult<Span, LibraryText> {
nom_packrat::init!(); init();
library_text(s) library_text(s)
} }
pub fn lib_parser_incomplete(s: Span) -> IResult<Span, LibraryText> { pub fn lib_parser_incomplete(s: Span) -> IResult<Span, LibraryText> {
nom_packrat::init!(); init();
library_text_incomplete(s) library_text_incomplete(s)
} }
pub fn pp_parser(s: Span) -> IResult<Span, PreprocessorText> { pub fn pp_parser(s: Span) -> IResult<Span, PreprocessorText> {
nom_packrat::init!(); init();
preprocessor_text(s) preprocessor_text(s)
} }
fn init() {
nom_packrat::init!();
clear_directive();
clear_version();
}

View File

@ -351,9 +351,13 @@ pub(crate) fn end_directive() {
IN_DIRECTIVE.with(|x| x.borrow_mut().pop()); IN_DIRECTIVE.with(|x| x.borrow_mut().pop());
} }
pub(crate) fn clear_directive() {
IN_DIRECTIVE.with(|x| x.borrow_mut().clear());
}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#[derive(Clone, Copy)] #[derive(Clone, Copy, Debug)]
pub(crate) enum VersionSpecifier { pub(crate) enum VersionSpecifier {
Ieee1364_1995, Ieee1364_1995,
Ieee1364_2001, Ieee1364_2001,
@ -418,6 +422,12 @@ pub(crate) fn current_version() -> Option<VersionSpecifier> {
}) })
} }
pub(crate) fn clear_version() {
CURRENT_VERSION.with(|current_version| {
current_version.borrow_mut().clear();
});
}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
pub(crate) fn concat<'a>(a: Span<'a>, b: Span<'a>) -> Option<Span<'a>> { pub(crate) fn concat<'a>(a: Span<'a>, b: Span<'a>) -> Option<Span<'a>> {

View File

@ -277,4 +277,46 @@ mod test {
let comment = unwrap_node!(&syntax_tree, Comment); let comment = unwrap_node!(&syntax_tree, Comment);
assert!(comment.is_some()); assert!(comment.is_some());
} }
#[test]
fn test_continuous() {
let src = r##"`ifdef A
`endif
module FetchStage();
always_comb begin
for (int j = i + 1; j < FETCH_WIDTH; j++) begin
end
break;
end
AddrPath fetchAddrOut;
endmodule"##;
let src_broken = r##"`ifdef A
endif
module FetchStage();
always_comb begin
for (int j = i + 1; j < FETCH_WIDTH; j++) begin
end
break;
end
AddrPath fetchAddrOut;
endmodule"##;
let path = PathBuf::from("");
let defines = HashMap::new();
let ret = parse_sv_str(src, &path, &defines, &[""], false, false);
assert!(ret.is_ok());
let ret = parse_sv_str(src_broken, &path, &defines, &[""], false, false);
assert!(ret.is_err());
let ret = parse_sv_str(src, &path, &defines, &[""], false, false);
assert!(ret.is_ok());
let ret = parse_sv_str(src_broken, &path, &defines, &[""], false, false);
assert!(ret.is_err());
let ret = parse_sv_str(src, &path, &defines, &[""], false, false);
assert!(ret.is_ok());
}
} }