From c9456ee99305bc3058d27c684b3adee9c4bdb9f1 Mon Sep 17 00:00:00 2001 From: dalance Date: Thu, 22 Aug 2019 21:24:57 +0900 Subject: [PATCH] Improve performance --- sv-parser-parser/Cargo.toml | 5 +++-- sv-parser-parser/src/expressions/expressions.rs | 3 +++ sv-parser-parser/src/expressions/primaries.rs | 14 +++++++------- sv-parser-parser/src/lib.rs | 2 +- sv-parser-parser/src/source_text/module_items.rs | 4 ++-- sv-parser-parser/src/tests.rs | 7 +------ sv-parser-parser/src/utils.rs | 6 ++++-- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/sv-parser-parser/Cargo.toml b/sv-parser-parser/Cargo.toml index 29bc4ae..61adc9b 100644 --- a/sv-parser-parser/Cargo.toml +++ b/sv-parser-parser/Cargo.toml @@ -11,9 +11,10 @@ trace = ["nom-tracable/trace"] [dependencies] nom = "5.0.0" nom_locate = "1.0.0" -nom-packrat = "0.2.0" +#nom-packrat = "0.2.0" +nom-packrat = {path = "../../nom-packrat/nom-packrat"} nom-recursive = {version = "0.1.1", features = ["tracer128"]} -nom-tracable = "0.3.1" +nom-tracable = "0.4.0" str-concat = "0.1.4" sv-parser-macros = {path = "../sv-parser-macros"} sv-parser-syntaxtree = {path = "../sv-parser-syntaxtree"} diff --git a/sv-parser-parser/src/expressions/expressions.rs b/sv-parser-parser/src/expressions/expressions.rs index 98c8040..9bd8a1e 100644 --- a/sv-parser-parser/src/expressions/expressions.rs +++ b/sv-parser-parser/src/expressions/expressions.rs @@ -218,6 +218,9 @@ pub(crate) fn constant_indexed_range(s: Span) -> IResult IResult { alt(( + map(terminated(primary, peek(one_of(",();"))), |x| { + Expression::Primary(Box::new(x)) + }), expression_binary, map(conditional_expression, |x| { Expression::ConditionalExpression(Box::new(x)) diff --git a/sv-parser-parser/src/expressions/primaries.rs b/sv-parser-parser/src/expressions/primaries.rs index 43917af..a978798 100644 --- a/sv-parser-parser/src/expressions/primaries.rs +++ b/sv-parser-parser/src/expressions/primaries.rs @@ -153,18 +153,18 @@ pub(crate) fn module_path_primary_mintypmax_expression( #[packrat_parser] pub(crate) fn primary(s: Span) -> IResult { alt(( + terminated( + primary_hierarchical, + peek(not(alt(( + map(one_of("(.'"), |_| ()), + map(keyword("with"), |_| ()), + )))), + ), map(assignment_pattern_expression, |x| { Primary::AssignmentPatternExpression(Box::new(x)) }), map(primary_literal, |x| Primary::PrimaryLiteral(Box::new(x))), map(cast, |x| Primary::Cast(Box::new(x))), - terminated( - primary_hierarchical, - peek(not(alt(( - map(one_of("(."), |_| ()), - map(keyword("with"), |_| ()), - )))), - ), map(empty_unpacked_array_concatenation, |x| { Primary::EmptyUnpackedArrayConcatenation(Box::new(x)) }), diff --git a/sv-parser-parser/src/lib.rs b/sv-parser-parser/src/lib.rs index bcfd140..885bfcf 100644 --- a/sv-parser-parser/src/lib.rs +++ b/sv-parser-parser/src/lib.rs @@ -82,7 +82,7 @@ impl HasExtraState<()> for SpanInfo { // ----------------------------------------------------------------------------- -nom_packrat::storage!(AnyNode); +nom_packrat::storage!(AnyNode, 1024); pub fn sv_parser(s: Span) -> IResult { source_text(s) diff --git a/sv-parser-parser/src/source_text/module_items.rs b/sv-parser-parser/src/source_text/module_items.rs index ffceef9..251a879 100644 --- a/sv-parser-parser/src/source_text/module_items.rs +++ b/sv-parser-parser/src/source_text/module_items.rs @@ -138,10 +138,10 @@ pub(crate) fn module_item(s: Span) -> IResult { pub(crate) fn module_or_generate_item(s: Span) -> IResult { alt(( module_or_generate_item_parameter, - module_or_generate_item_gate, - module_or_generate_item_udp, module_or_generate_item_module, module_or_generate_item_module_item, + module_or_generate_item_gate, + module_or_generate_item_udp, ))(s) } diff --git a/sv-parser-parser/src/tests.rs b/sv-parser-parser/src/tests.rs index 1a932e2..16d211c 100644 --- a/sv-parser-parser/src/tests.rs +++ b/sv-parser-parser/src/tests.rs @@ -15704,10 +15704,5 @@ mod spec { #[test] fn debug() { - test!( - source_text, - r##"//aaa - //bbb"##, - Ok((_, _)) - ); + nom_tracable::cumulative_histogram(); } diff --git a/sv-parser-parser/src/utils.rs b/sv-parser-parser/src/utils.rs index 51cf0ea..56983d3 100644 --- a/sv-parser-parser/src/utils.rs +++ b/sv-parser-parser/src/utils.rs @@ -260,8 +260,10 @@ pub(crate) fn white_space(s: Span) -> IResult { map(multispace1, |x: Span| { WhiteSpace::Space(Box::new(into_locate(x))) }), - map(comment, |x| WhiteSpace::Comment(Box::new(x))), - map(compiler_directive, |x| { + map(preceded(peek(char('/')), comment), |x| { + WhiteSpace::Comment(Box::new(x)) + }), + map(preceded(peek(char('`')), compiler_directive), |x| { WhiteSpace::CompilerDirective(Box::new(x)) }), ))(s)