ウォンツテック

そでやまのーと

正規表現コーディング完了。
./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じゃなくて構文木作るときの問題ぽい。