unique_ptr<NFA> RepeatExp::buildNFA() { assert(childCount() == 1); NFA* nfa = new NFA(); nfa->allocPoint(); nfa->addEdge(0, epsilon, 1); unique_ptr<NFA> cnfa = firstChild()->buildNFA(); nfa->merge(*cnfa, std::make_pair(nfa->endPoint(), 0)); nfa->addEdge(nfa->endPoint(), epsilon, 1); nfa->addEdge(0, epsilon, nfa->endPoint()); return unique_ptr<NFA>(nfa); }
unique_ptr<NFA> OrExp::buildNFA() { NFA* nfa = new NFA(); std::vector<int> v; for (auto& child : m_childExps) { unique_ptr<NFA> cnfa = child->buildNFA(); int ne = nfa->merge(*cnfa, std::make_pair(0, 0)); v.push_back(ne); } int end = nfa->allocPoint(); for (int ne : v) { nfa->addEdge(ne, epsilon, end); } return unique_ptr<NFA>(nfa); }
unique_ptr<NFA> CharExp::buildNFA() { NFA* nfa = new NFA(); nfa->addEdge(0, getChar()); return unique_ptr<NFA>(nfa); }