From 9aee3b22b50e0f369d7bf50cd25cbc4e3725771b Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Thu, 8 Jun 2017 10:33:23 +1000 Subject: [PATCH] ng_expr_info: more complete analysis passes --- src/hs.cpp | 13 ++--------- src/nfagraph/ng_expr_info.cpp | 41 +++++++++++++++++++++++++++++++++-- src/nfagraph/ng_expr_info.h | 5 +++-- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/hs.cpp b/src/hs.cpp index 33459347..e3c1f811 100644 --- a/src/hs.cpp +++ b/src/hs.cpp @@ -39,10 +39,8 @@ #include "compiler/error.h" #include "nfagraph/ng.h" #include "nfagraph/ng_expr_info.h" -#include "nfagraph/ng_extparam.h" -#include "nfagraph/ng_fuzzy.h" -#include "parser/parse_error.h" #include "parser/Parser.h" +#include "parser/parse_error.h" #include "parser/prefilter.h" #include "parser/unsupported.h" #include "util/compile_error.h" @@ -394,14 +392,7 @@ hs_error_t hs_expression_info_int(const char *expression, unsigned int flags, throw ParseError("Internal error."); } - // validate graph's suitability for fuzzing - validate_fuzzy_compile(*g, expr.edit_distance, expr.utf8, cc.grey); - - // fuzz graph - this must happen before any transformations are made - make_fuzzy(*g, expr.edit_distance, cc.grey); - - propagateExtendedParams(*g, expr, rm); - fillExpressionInfo(rm, *g, expr, &local_info); + fillExpressionInfo(rm, cc, *g, expr, &local_info); } catch (const CompileError &e) { // Compiler error occurred diff --git a/src/nfagraph/ng_expr_info.cpp b/src/nfagraph/ng_expr_info.cpp index 6a625ddf..5f5bbea7 100644 --- a/src/nfagraph/ng_expr_info.cpp +++ b/src/nfagraph/ng_expr_info.cpp @@ -37,10 +37,14 @@ #include "ng_asserts.h" #include "ng_depth.h" #include "ng_edge_redundancy.h" +#include "ng_extparam.h" +#include "ng_fuzzy.h" #include "ng_holder.h" +#include "ng_prune.h" #include "ng_reports.h" #include "ng_util.h" #include "ue2common.h" +#include "compiler/expression_info.h" #include "parser/position.h" // for POS flags #include "util/boundary_reports.h" #include "util/compile_context.h" @@ -135,15 +139,48 @@ bool hasOffsetAdjust(const ReportManager &rm, const NGHolder &g) { return false; } -void fillExpressionInfo(ReportManager &rm, NGHolder &g, - const ExpressionInfo &expr, hs_expr_info *info) { +void fillExpressionInfo(ReportManager &rm, const CompileContext &cc, + NGHolder &g, ExpressionInfo &expr, + hs_expr_info *info) { assert(info); + // remove reports that aren't on vertices connected to accept. + clearReports(g); + + assert(allMatchStatesHaveReports(g)); + + /* + * Note: the following set of analysis passes / transformations should + * match those in NG::addGraph(). + */ + /* ensure utf8 starts at cp boundary */ ensureCodePointStart(rm, g, expr); + + if (can_never_match(g)) { + throw CompileError(expr.index, "Pattern can never match."); + } + + // validate graph's suitability for fuzzing + validate_fuzzy_compile(g, expr.edit_distance, expr.utf8, cc.grey); + resolveAsserts(rm, g, expr); + assert(allMatchStatesHaveReports(g)); + + // fuzz graph - this must happen before any transformations are made + make_fuzzy(g, expr.edit_distance, cc.grey); + + pruneUseless(g); + pruneEmptyVertices(g); + + if (can_never_match(g)) { + throw CompileError(expr.index, "Pattern can never match."); + } + optimiseVirtualStarts(g); + propagateExtendedParams(g, expr, rm); + removeLeadingVirtualVerticesFromRoot(g, g.start); removeLeadingVirtualVerticesFromRoot(g, g.startDs); diff --git a/src/nfagraph/ng_expr_info.h b/src/nfagraph/ng_expr_info.h index e518738c..f9bd6809 100644 --- a/src/nfagraph/ng_expr_info.h +++ b/src/nfagraph/ng_expr_info.h @@ -41,9 +41,10 @@ namespace ue2 { class ExpressionInfo; class NGHolder; class ReportManager; +struct CompileContext; -void fillExpressionInfo(ReportManager &rm, NGHolder &g, - const ExpressionInfo &expr, hs_expr_info *info); +void fillExpressionInfo(ReportManager &rm, const CompileContext &cc, + NGHolder &g, ExpressionInfo &expr, hs_expr_info *info); } // namespace ue2