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 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; }