■
正規表現コーディング完了。
./RegeX '(a*|b+)de(f|c)' adef こんなんとかちゃんと認識してくれた。(adefは左記の正規表現を満たす)
いやー ちゃんと動くと楽しいねやっぱ。
NFAからDFAへの変換メイン部は以下の感じ
void DfaClass::nfaToDfa(NfaClass& nfa) { int numCheckingDnode = 0; while (numCheckingDnode <= numOfDnode) { for (Dtrans* dtOuter = dtrans[numCheckingDnode]; dtOuter != NULL; dtOuter = dtOuter->next) { int nnode_no = dtOuter->nnode_no; // final point of nnode if (nfa.nnode[nnode_no] == NULL) continue; char ch = nfa.nnode[nnode_no]->ch; if (ch == EMPTY) continue; int next_nnode_no = nfa.nnode[nnode_no]->to; Dtrans* dtrans_tmp = new Dtrans(); dtrans_tmp->nnode_no = next_nnode_no; dtrans_tmp->next = NULL; // If the next of this nnode[] is EMPTY, // add the EMPTY state to dtrans_tmp. setEmptyFromNnode(nfa, nfa.nnode[next_nnode_no], &dtrans_tmp); // ch != EMPTY. Search same ch at next dtranses. for (Dtrans* dtInner = dtOuter->next; dtInner != NULL; dtInner = dtInner->next) { int noNext = dtInner->nnode_no; char chNext = nfa.nnode[noNext]->ch; if (chNext != ch) continue; int next_noNext = nfa.nnode[noNext]->to; Dtrans* newTransNext = new Dtrans(); newTransNext->nnode_no = next_noNext; newTransNext->next = dtrans_tmp; dtrans_tmp = newTransNext; // If the next of this nnode[] is EMPTY, // add the EMPTY state to dtrans_tmp. setEmptyFromNnode(nfa, nfa.nnode[next_noNext], &dtrans_tmp); } /** Now, not empty dtrans_tmp exist. * We compare this dtrans_tmp to dtrans[x] as x <= numOfDnode */ int needMakeNew = compareDtrans(dtrans_tmp, numOfDnode); if (needMakeNew != -1) { // The same state already exist as dtrans_tmp. Dnode* newDnode = new Dnode(); newDnode->op = e_transition; newDnode->tr_ch = ch; newDnode->tr_next = dnode[needMakeNew]; newDnode->tr_sib = dnode[numCheckingDnode]->nd_sib; dnode[numCheckingDnode]->nd_sib = newDnode; } else { // not exist. and make new state numOfDnode++; dtrans[numOfDnode] = dtrans_tmp; dnode[numOfDnode] = new Dnode(); dnode[numOfDnode]->op = e_node; dnode[numOfDnode]->nd_sib = NULL; Dnode* newDnode = new Dnode(); newDnode->op = e_transition; newDnode->tr_ch = ch; newDnode->tr_next = dnode[numOfDnode]; newDnode->tr_sib = dnode[numCheckingDnode]->nd_sib; dnode[numCheckingDnode]->nd_sib = newDnode; if (isFinal(numOfDnode)) dnode[numOfDnode]->op = e_final; } } numCheckingDnode++; } }
ただ、二重括弧( (a+|(b|c)) みたいなの)がまだ出来てないっぽい。
これはDFAじゃなくて構文木作るときの問題ぽい。