NFA or_selection(vector<NFA> selections, int no_of_selections) { NFA result; int vertex_count = 2; int i, j; NFA med; trans new_trans; for(i = 0; i < no_of_selections; i++) { vertex_count += selections.at(i).get_vertex_count(); } result.set_vertex(vertex_count); int adder_track = 1; for(i = 0; i < no_of_selections; i++) { result.set_transition(0, adder_track, '^'); med = selections.at(i); for(j = 0; j < med.transitions.size(); j++) { new_trans = med.transitions.at(j); result.set_transition(new_trans.vertex_from + adder_track, new_trans.vertex_to + adder_track, new_trans.trans_symbol); } adder_track += med.get_vertex_count(); result.set_transition(adder_track - 1, vertex_count - 1, '^'); } result.set_final_state(vertex_count - 1); return result; }
NFA kleene(NFA a) { NFA result; int i; trans new_trans; result.set_vertex(a.get_vertex_count() + 2); result.set_transition(0, 1, '^'); for(i = 0; i < a.transitions.size(); i++) { new_trans = a.transitions.at(i); result.set_transition(new_trans.vertex_from + 1, new_trans.vertex_to + 1, new_trans.trans_symbol); } result.set_transition(a.get_vertex_count(), a.get_vertex_count() + 1, '^'); result.set_transition(a.get_vertex_count(), 1, '^'); result.set_transition(0, a.get_vertex_count() + 1, '^'); result.set_final_state(a.get_vertex_count() + 1); return result; }
NFA concat(NFA a, NFA b) { NFA result; result.set_vertex(a.get_vertex_count() + b.get_vertex_count()); int i; trans new_trans; for(i = 0; i < a.transitions.size(); i++) { new_trans = a.transitions.at(i); result.set_transition(new_trans.vertex_from, new_trans.vertex_to, new_trans.trans_symbol); } result.set_transition(a.get_final_state(), a.get_vertex_count(), '^'); for(i = 0; i < b.transitions.size(); i++) { new_trans = b.transitions.at(i); result.set_transition(new_trans.vertex_from + a.get_vertex_count(), new_trans.vertex_to + a.get_vertex_count(), new_trans.trans_symbol); } result.set_final_state(a.get_vertex_count() + b.get_vertex_count() - 1); return result; }