NFA getNFA_Star(NFA nfa) { int head = 0; int tail = 1; int offset = 2; int start = nfa.start_state + offset; vector<State> states; NFA ret; ret.setAlphabetSet(nfa.alphabet); ret.setStartState(head); ret.setTransFunc(head, map<char, vector<int> >()); ret.setTransFunc(tail, map<char, vector<int> >()); states.push_back(State(false)); states.push_back(State(true)); for(int i = 0; i < nfa.states.size(); i++) { ret.setTransFunc(i+offset, nfa.trans_func[i]); for(map<char, vector<int> >::iterator it = ret.trans_func[i+offset].begin(); it != ret.trans_func[i+offset].end(); it++) { for(vector<int>::iterator jt = it->second.begin(); jt != it->second.end(); jt++) { *jt = *jt + offset; } } states.push_back(State(false)); if(nfa.states[i].isAccepted()) { ret.trans_func[i + offset][NFA::lambda].push_back(start); ret.trans_func[i + offset][NFA::lambda].push_back(tail); } } if(find(ret.alphabet.begin(), ret.alphabet.end(), NFA::lambda) == ret.alphabet.end()) ret.alphabet.push_back(NFA::lambda); ret.trans_func[head][NFA::lambda].push_back(start); ret.setStateSet(states); return ret; }
NFA getNFA_AND(NFA n1, NFA n2) { int offset = n1.states.size(); vector<State> states; NFA ret = n1; for(int i = 0; i < n1.states.size(); i++) { states.push_back(State(false)); if(n1.states[i].isAccepted()) ret.trans_func[i][NFA::lambda].push_back(n2.start_state + offset); } for(int i = 0; i < n2.states.size(); i++) { ret.setTransFunc(i + offset, n2.trans_func[i]); for(map<char, vector<int> >::iterator it = ret.trans_func[i+offset].begin(); it != ret.trans_func[i+offset].end(); it++) { if(find(ret.alphabet.begin(), ret.alphabet.end(), it->first) == ret.alphabet.end()) ret.alphabet.push_back(it->first); for(vector<int>::iterator jt = it->second.begin(); jt != it->second.end(); jt++) { *jt = *jt + offset; } } if(n2.states[i].isAccepted()) states.push_back(State(true)); else states.push_back(State(false)); } if(find(ret.alphabet.begin(), ret.alphabet.end(), NFA::lambda) == ret.alphabet.end()) ret.alphabet.push_back(NFA::lambda); ret.setStateSet(states); return ret; }
NFA getNFA_OR(NFA n1, NFA n2) { int head = n1.states.size() + n2.states.size(); int tail = head + 1; int offset = n1.states.size(); vector<State> states; map<char, vector<int> > h_trans, t_trans; NFA ret; ret.setStartState(head); ret.alphabet = n1.alphabet; for(int i = 0; i < n1.states.size(); i++) { ret.setTransFunc(i, n1.trans_func[i]); states.push_back(State(false)); if(n1.states[i].isAccepted()) ret.trans_func[i][NFA::lambda].push_back(tail); } for(int i = 0; i < n2.states.size(); i++) { ret.setTransFunc(i + offset, n2.trans_func[i]); for(map<char, vector<int> >::iterator it = ret.trans_func[i+offset].begin(); it != ret.trans_func[i+offset].end(); it++) { if(find(ret.alphabet.begin(), ret.alphabet.end(), it->first) == ret.alphabet.end()) ret.alphabet.push_back(it->first); for(vector<int>::iterator jt = it->second.begin(); jt != it->second.end(); jt++) { *jt = *jt + offset; } } states.push_back(State(false)); if(n2.states[i].isAccepted()) ret.trans_func[i + offset][NFA::lambda].push_back(tail); } if(find(ret.alphabet.begin(), ret.alphabet.end(), NFA::lambda) == ret.alphabet.end()) ret.alphabet.push_back(NFA::lambda); h_trans[NFA::lambda].push_back(n1.start_state); h_trans[NFA::lambda].push_back(n2.start_state + offset); ret.setTransFunc(head, h_trans); ret.setTransFunc(tail, t_trans); states.push_back(State(false)); states.push_back(State(true)); ret.setStateSet(states); return ret; }
NFA getNFAbyString(const char str[]) { NFA ret; ret.setStartState(0); vector<State> states; vector<char> alphabets; int len = strlen(str); set<char> S; for(int i = 0; i < len; i++) { map<char, vector<int> > trans_func; trans_func[str[i]].push_back(i+1); states.push_back(State()); ret.setTransFunc(i, trans_func); if(S.find(str[i]) == S.end()) S.insert(str[i]), alphabets.push_back(str[i]); } ret.setTransFunc(len, map<char, vector<int> >()); states.push_back(State(true)); ret.setStateSet(states); ret.setAlphabetSet(alphabets); return ret; }