void makeDFA( void ) { if( !SW_Quiet ){ fprintf( stderr, "Now making deterministic finite automaton" ); NoNewLine = 1; } r_makeDFA( FAlist ); if( !SW_Quiet ){ fprintf( stderr, "\rNow making deterministic finite automaton[%d/%d] \n", FAprocessed, FAtotal ); if( FAtotal != FAprocessed ){ fprintf( stderr, "* %d released FA nodes are left on isolated loop\n", FAtotal - FAprocessed ); } NoNewLine = 0; } /* 何かバグがあったとき恐いが孤立ループのチェックが 不可能なのでしょうがない */ FAtotal = FAprocessed; if( SW_Verbose ){ verboseMes( "** traversing efficiency ( success/total )" ); verboseMes( "r_makeDFA: %d/%d(%d%%)", DFAtravSuccess, DFAtravTotal, 100*DFAtravSuccess/DFAtravTotal); } newLineAdjust(); freeFAlist( GroupList ); }
void verboseGroup( FALIST *group ) { verboseMes( "Created New Group" ); while( group != NULL ){ verboseMes( " FAadr: %08x", (long)group->fa ); group = group->next; } }
void makeTriplet( void ) { FILE *fp_fa; FA *fa; FAprocessed = 0; if( (fp_fa = fopen( FAfile, "w" )) == NULL ){ errMes( "Can't open dfa File for writting\"%s\"", FAfile ); } getNewStatNo( FAlist ); if( !SW_Quiet ){ fprintf( stderr, "Now making triplet list" ); NoNewLine = 1; } while( 1 ){ if( (fa = processTripletQueue( NULL )) == NULL ) break; r_makeTriplet( fa, fp_fa ); } fclose( fp_fa ); if( !SW_Quiet ){ fprintf( stderr, "\rNow making triplet list[%d/%d]\n", FAprocessed, FAtotal ); NoNewLine = 0; } if( SW_Verbose ){ verboseMes( "r_makeTriplet: %d/%d(%d%%)", TFAtravSuccess, TFAtravTotal, 100*TFAtravSuccess/TFAtravTotal); } newLineAdjust(); }
void killFA( FA *fa ) { ARC *arc = fa->nsList; verboseMes( "a FA node is vanished" ); while( arc != NULL ){ arc = unconnectFA( fa, NULL, arc ); } free( fa ); FAtotal--; }
void r_makeDFA( FA *fa ) { ARC *prevarc = NULL; ARC *curarc; int inp; int bundleNum; FLAG reserved = 0; int i; FLAG newFlag; FALIST *volatileList = NULL; CLASSFLAGS unifyAccptFlag; CLASSFLAGS unifyStartFlag; verboseMes( "[func]r_makeDFA(FA %08x)", (long)fa ); DFAtravTotal++; if( fa->traversed == 1 ){ verboseMes( "traversed..." ); return; } fa->traversed = 1; DFAtravSuccess++; FAprocessed++; if( !SW_SemiQuiet ){ fprintf( stderr, "\rNow making deterministic finite automaton[%d/%d] ", FAprocessed, FAtotal ); NoNewLine = 1; } curarc = fa->nsList; while( curarc != NULL ){ FA *unifyingDstFA = NULL; { ARC *arc = curarc; int inp = arc->inp; FALIST *group = NULL; CLASSFLAGS accptFlag = 0; CLASSFLAGS startFlag = 0; bundleNum = 0; while( 1 ){ if( arc == NULL || arc->inp != inp ) break; group = appendGroup( group, arc->fa ); accptFlag |= arc->fa->accpt; startFlag |= arc->fa->start; arc = arc->next; bundleNum++; } if( bundleNum > 1 ){ unifyingDstFA = chkGroup( group, accptFlag, startFlag,&newFlag ); } else { /* この下4行はブロック外のwhileに対してのもの */ freeFAlist( group ); prevarc = curarc; curarc = curarc->next; continue; } } inp = curarc->inp; unifyAccptFlag = 0; unifyStartFlag = 0; for( i = 0; i < bundleNum; i++ ){ unifyAccptFlag |= curarc->accpt; unifyStartFlag |= curarc->start; if( !newFlag ){ /* volatileList = volatileFA( volatileList, curarc->ns );*/ curarc = unconnectFA( fa, prevarc, curarc ); } else { if( curarc->fa == fa /* self-loop */ ){ reserved = 1; /* volatileList = volatileFA( volatileList, fa );*/ curarc = unconnectFA( fa, prevarc, curarc ); } else { curarc = unifyFA( unifyingDstFA, prevarc, curarc, fa ); } } } connectUnifyFA( fa, inp, unifyingDstFA, reserved, unifyAccptFlag, unifyStartFlag ); reserved = 0; } usArc2nsArc( fa ); /* unvolatileFA( volatileList );*/ curarc = fa->nsList; while( curarc != NULL ){ r_makeDFA( curarc->fa ); curarc = curarc->next; } }