コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}