ng_expr_info: more complete analysis passes

This commit is contained in:
Justin Viiret 2017-06-08 10:33:23 +10:00 committed by Matthew Barr
parent c4e2459318
commit 9aee3b22b5
3 changed files with 44 additions and 15 deletions

View File

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

View File

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

View File

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