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