mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
ng_expr_info: more complete analysis passes
This commit is contained in:
parent
c4e2459318
commit
9aee3b22b5
13
src/hs.cpp
13
src/hs.cpp
@ -39,10 +39,8 @@
|
|||||||
#include "compiler/error.h"
|
#include "compiler/error.h"
|
||||||
#include "nfagraph/ng.h"
|
#include "nfagraph/ng.h"
|
||||||
#include "nfagraph/ng_expr_info.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/Parser.h"
|
||||||
|
#include "parser/parse_error.h"
|
||||||
#include "parser/prefilter.h"
|
#include "parser/prefilter.h"
|
||||||
#include "parser/unsupported.h"
|
#include "parser/unsupported.h"
|
||||||
#include "util/compile_error.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.");
|
throw ParseError("Internal error.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate graph's suitability for fuzzing
|
fillExpressionInfo(rm, cc, *g, expr, &local_info);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
catch (const CompileError &e) {
|
catch (const CompileError &e) {
|
||||||
// Compiler error occurred
|
// Compiler error occurred
|
||||||
|
@ -37,10 +37,14 @@
|
|||||||
#include "ng_asserts.h"
|
#include "ng_asserts.h"
|
||||||
#include "ng_depth.h"
|
#include "ng_depth.h"
|
||||||
#include "ng_edge_redundancy.h"
|
#include "ng_edge_redundancy.h"
|
||||||
|
#include "ng_extparam.h"
|
||||||
|
#include "ng_fuzzy.h"
|
||||||
#include "ng_holder.h"
|
#include "ng_holder.h"
|
||||||
|
#include "ng_prune.h"
|
||||||
#include "ng_reports.h"
|
#include "ng_reports.h"
|
||||||
#include "ng_util.h"
|
#include "ng_util.h"
|
||||||
#include "ue2common.h"
|
#include "ue2common.h"
|
||||||
|
#include "compiler/expression_info.h"
|
||||||
#include "parser/position.h" // for POS flags
|
#include "parser/position.h" // for POS flags
|
||||||
#include "util/boundary_reports.h"
|
#include "util/boundary_reports.h"
|
||||||
#include "util/compile_context.h"
|
#include "util/compile_context.h"
|
||||||
@ -135,15 +139,48 @@ bool hasOffsetAdjust(const ReportManager &rm, const NGHolder &g) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fillExpressionInfo(ReportManager &rm, NGHolder &g,
|
void fillExpressionInfo(ReportManager &rm, const CompileContext &cc,
|
||||||
const ExpressionInfo &expr, hs_expr_info *info) {
|
NGHolder &g, ExpressionInfo &expr,
|
||||||
|
hs_expr_info *info) {
|
||||||
assert(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 */
|
/* ensure utf8 starts at cp boundary */
|
||||||
ensureCodePointStart(rm, g, expr);
|
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);
|
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);
|
optimiseVirtualStarts(g);
|
||||||
|
|
||||||
|
propagateExtendedParams(g, expr, rm);
|
||||||
|
|
||||||
removeLeadingVirtualVerticesFromRoot(g, g.start);
|
removeLeadingVirtualVerticesFromRoot(g, g.start);
|
||||||
removeLeadingVirtualVerticesFromRoot(g, g.startDs);
|
removeLeadingVirtualVerticesFromRoot(g, g.startDs);
|
||||||
|
|
||||||
|
@ -41,9 +41,10 @@ namespace ue2 {
|
|||||||
class ExpressionInfo;
|
class ExpressionInfo;
|
||||||
class NGHolder;
|
class NGHolder;
|
||||||
class ReportManager;
|
class ReportManager;
|
||||||
|
struct CompileContext;
|
||||||
|
|
||||||
void fillExpressionInfo(ReportManager &rm, NGHolder &g,
|
void fillExpressionInfo(ReportManager &rm, const CompileContext &cc,
|
||||||
const ExpressionInfo &expr, hs_expr_info *info);
|
NGHolder &g, ExpressionInfo &expr, hs_expr_info *info);
|
||||||
|
|
||||||
} // namespace ue2
|
} // namespace ue2
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user