00001 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 #include <sent/stddefs.h>
00051 #include <sent/dfa.h>
00052 
00059 void
00060 extract_cpair(DFA_INFO *dinfo)
00061 {
00062   int i;
00063   DFA_ARC *arc_l, *arc_r, *arc_r2;
00064   int left, right;
00065 
00066   
00067   malloc_dfa_cp(dinfo, dinfo->term_num);
00068 
00069   
00070   for (i=0;i<dinfo->state_num;i++) {
00071     if ((dinfo->st[i].status & INITIAL_S) != 0) { 
00072       for (arc_r = dinfo->st[i].arc; arc_r; arc_r = arc_r->next) {
00073         if (dinfo->is_sp[arc_r->label]) {
00074           j_error("Error: skippable sp should not appear at end of sentence\n");
00075         }
00076         set_dfa_cp_end(dinfo, arc_r->label, TRUE);
00077       }
00078     }
00079     for(arc_l = dinfo->st[i].arc; arc_l; arc_l = arc_l->next) {
00080       left = arc_l->label;
00081       if ((dinfo->st[arc_l->to_state].status & ACCEPT_S) != 0) {
00082         if (dinfo->is_sp[left]) {
00083           j_error("Error: skippable sp should not appear at beginning of sentence\n");
00084         }
00085         set_dfa_cp_begin(dinfo, left, TRUE);
00086       }
00087       
00088       for (arc_r = dinfo->st[arc_l->to_state].arc; arc_r; arc_r = arc_r->next) {
00089         right = arc_r->label;
00090         set_dfa_cp(dinfo, right, left, TRUE);
00091         if (dinfo->is_sp[right]) {
00092           for (arc_r2 = dinfo->st[arc_r->to_state].arc; arc_r2; arc_r2 = arc_r2->next) {
00093             if (dinfo->is_sp[arc_r2->label]) { 
00094               j_error("Error: skippable sp should not repeat\n");
00095             }
00096             set_dfa_cp(dinfo, arc_r2->label, left, TRUE);
00097           }
00098         }
00099       }
00100 
00101     }
00102   }
00103 }
00104 
00112 void
00113 cpair_append(DFA_INFO *dst, DFA_INFO *src, int coffset)
00114 {
00115   int i,j;
00116 
00117   
00118   
00119   if (dst->term_num - coffset != src->term_num) {
00120     j_error("InternalError: append term num not match!: %d, %d, %d\n",
00121             dst->term_num, src->term_num, coffset);
00122   }
00123 
00124   
00125   realloc_dfa_cp(dst, coffset, dst->term_num);
00126   
00127   
00128   for(i=coffset;i<dst->term_num;i++) {
00129     for(j=coffset;j<dst->term_num;j++) {
00130       set_dfa_cp(dst, i, j, dfa_cp(src, i-coffset, j-coffset));
00131     }
00132     set_dfa_cp_begin(dst, i, dfa_cp_begin(src, i-coffset));
00133     set_dfa_cp_end(dst, i, dfa_cp_end(src, i-coffset));
00134   }
00135 }