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> ConcatExp::buildNFA() { NFA* nfa = new NFA(); for (auto& child : m_childExps) { unique_ptr<NFA> cnfa = child->buildNFA(); nfa->merge(*cnfa, std::make_pair(nfa->endPoint(), 0)); } return unique_ptr<NFA>(nfa); }