unique_ptr<raw_dfa> mergeTwoDfas(const raw_dfa *d1, const raw_dfa *d2, size_t max_states, const ReportManager *rm, const Grey &grey) { assert(d1 && d2); assert(d1->kind == d2->kind); assert(max_states <= MAX_DFA_STATES); auto rdfa = ue2::make_unique<raw_dfa>(d1->kind); Automaton_Merge autom(d1, d2, rm, grey); if (!determinise(autom, rdfa->states, max_states)) { rdfa->start_anchored = autom.start_anchored; rdfa->start_floating = autom.start_floating; rdfa->alpha_size = autom.alphasize; rdfa->alpha_remap = autom.alpha; DEBUG_PRINTF("merge succeeded, %zu states\n", rdfa->states.size()); if (autom.shouldMinimize()) { minimize_hopcroft(*rdfa, grey); DEBUG_PRINTF("minimized, %zu states\n", rdfa->states.size()); } return rdfa; } return nullptr; }
tree::node_ptr operator()(state_loc const& pred) const { std::string autom(pred.aut); std::string context=my_symbol_table.get_context(); if (autom == "") { autom = context; context = ""; } return tree::node_ptr(hybrid_automata::location_node_creator::create( autom, context, pred.loc, pred.eq)); }