bool DFAMerger::add(const DFA& dfa) { if (_start == -1) { _start = new_state(); } assert(_start >= 0); size_t size = dfa.size(); size_t base = _trans.size(); _trans.resize(base + size); for (size_t i = 0; i < size; i++) { const DFATran& tran = dfa[i]; for (DFATran::const_iterator it = tran.begin(); it != tran.end(); ++it) { _trans[base + i][it->first].insert(base + it->second); } const Tag& tag = dfa.tags(i); if (!tag.empty()) { Tag& to = _tags[base + i]; to.insert(tag.begin(), tag.end()); } } _trans[_start][EPSILON].insert(base + dfa.start()); const States& last = dfa.last(); for (States::const_iterator it = last.begin(); it != last.end(); ++it) { _last.insert(base + *it); } return true; }
void print_dfa(const DFA& dfa) { cout << "start : " << dfa.start() << endl; cout << "last : "; const ::mpl::lexer::detail::States& last = dfa.last(); print_set(last); cout << endl; for (size_t i = 0; i < dfa.size(); i++) { const ::mpl::lexer::detail::DFATran& tran = dfa[i]; for (::mpl::lexer::detail::DFATran::const_iterator it = tran.begin(); it != tran.end(); ++it) { cout << i << "("; if (it->first == ::mpl::lexer::detail::EPSILON) { cout << "\\0"; } else if (it->first == ::mpl::lexer::detail::OTHER) { cout << "-1"; } else { //cout << it->first; cout << "0x" << hex << (int)(it->first & 0xFF) << dec; } cout << ")"; cout << "\t->\t"; cout << it->second; cout << endl; } } for (::mpl::lexer::detail::States::const_iterator it = last.begin(); it != last.end(); ++it) { const ::mpl::lexer::detail::Tag& tag = dfa.tags(*it); cout << *it << ": "; print_set(tag); cout << endl; } }