44 #include "EST_cutils.h"
47 static LISP lts_find_feasible_pairs(LISP rules);
48 static LISP make_fp(LISP in, LISP out);
49 static LISP find_outs(LISP rule);
50 static LISP find_ins(LISP rule);
51 static LISP add_alpha(LISP n, LISP existing);
52 static LISP lts_find_alphabets(LISP rules);
53 static void ltsrule_compile(LISP inalpha, LISP outalpha,
54 LISP fp, LISP sets, LISP rule,
56 static LISP analyse_rule(LISP rule);
57 static LISP expand_sets(LISP l, LISP fp, LISP sets);
58 static LISP expand_set(LISP p, LISP fp, LISP sets);
59 static LISP find_notMAP(LISP MAP,LISP fp);
61 void ltscompile(LISP lts_rules,
EST_WFST &all_wfst)
69 LISP inalpha,outalpha,alphas;
70 LISP sets=siod_nth(2,lts_rules);
71 LISP rules=siod_nth(3,lts_rules);
74 alphas = lts_find_alphabets(lts_rules);
75 inalpha = car(alphas);
76 outalpha = cdr(alphas);
78 fp = lts_find_feasible_pairs(rules);
81 all_wfst.build_from_regex(inalpha,outalpha,NIL);
83 nots.build_from_regex(inalpha,outalpha,
85 cons(cons(rintern(
"or"),fp),NIL)));
88 for (r=rules; r != NIL; r=cdr(r))
93 ltsrule_compile(inalpha,outalpha,fp,sets,car(r),a,not_a);
111 static LISP lts_find_alphabets(LISP rules)
115 LISP in=NIL, out=NIL;
117 for (r=siod_nth(3,rules); r != NIL; r=cdr(r))
119 in = add_alpha(find_ins(car(r)),in);
120 out = add_alpha(find_outs(car(r)),out);
126 static LISP add_alpha(LISP n, LISP existing)
132 for (t=n; t != NIL; t=cdr(t))
133 if (!siod_member_str(get_c_string(car(t)),e))
139 static LISP find_ins(LISP rule)
146 for (c=rule; c != NIL; c=cdr(c))
148 if (streq(
"[",get_c_string(car(c))))
150 else if (streq(
"]",get_c_string(car(c))))
153 ins = cons(car(c),ins);
158 static LISP find_outs(LISP rule)
165 for (c=rule; c != NIL; c=cdr(c))
167 if (streq(
"=",get_c_string(car(c))))
170 outs = cons(car(c),outs);
172 return reverse(outs);
175 static LISP lts_find_feasible_pairs(LISP rules)
185 for (r=rules; r != NIL; r=cdr(r))
187 LISP in = find_ins(car(r));
188 LISP out = find_outs(car(r));
190 LISP pairs = make_fp(in,out);
192 for (LISP p=pairs; p != NIL; p=cdr(p))
194 if (!siod_member_str(get_c_string(car(p)),fp))
195 fp = cons(car(p),fp);
201 static LISP make_fp(LISP in, LISP out)
210 if (siod_llength(in) > siod_llength(out))
211 m = siod_llength(in);
213 m = siod_llength(out);
215 for (i=in,o=out ; m > 0; --m,i=cdr(i),o=cdr(o))
220 is = get_c_string(car(i));
224 os = get_c_string(car(o));
225 fp = cons(strintern(is+
"/"+os),fp);
230 static void ltsrule_compile(LISP inalpha, LISP outalpha,
231 LISP fp, LISP sets, LISP rule,
236 LISP LC,MAP,RC,notMAP,r;
238 r = analyse_rule(rule);
243 LC = expand_sets(LC,fp,sets);
244 RC = expand_sets(RC,fp,sets);
245 notMAP = find_notMAP(MAP,fp);
248 LISP kk = cons(LC,cons(MAP,cons(RC,NIL)));
249 cout <<
"kk rule" << endl;
251 a.kkrule_compile(inalpha,outalpha,fp,kk,NIL);
254 LISP regex_r = cons(rintern(
"and"),append(LC,append(MAP,RC)));
259 LISP nn = cons(rintern(
"not"),cons(regex_r,NIL));
260 not_a.build_from_regex(inalpha,outalpha,nn);
264 static LISP analyse_rule(LISP rule)
267 LISP LC=NIL, RC=NIL, in=NIL, out=NIL;
271 for (l=rule; l != NIL; l=cdr(l))
273 if ((state==0) && (!streq(
"[",get_c_string(car(l)))))
274 LC = cons(car(l),LC);
275 else if ((state==0) && (streq(
"[",get_c_string(car(l)))))
277 else if ((state==1) && (!streq(
"]",get_c_string(car(l)))))
278 in = cons(car(l),in);
279 else if ((state==1) && (streq(
"]",get_c_string(car(l)))))
281 else if ((state==2) && (!streq(
"=",get_c_string(car(l)))))
282 RC = cons(car(l),RC);
283 else if ((state==2) && (streq(
"=",get_c_string(car(l)))))
292 return cons(reverse(LC),
293 cons(make_fp(reverse(in),out),
294 cons(reverse(RC),NIL)));
298 static LISP expand_sets(LISP l, LISP fp, LISP sets)
303 for (r=l; r != NIL; r=cdr(r))
305 LISP s = expand_set(car(r),fp,sets);
306 if (cdr(r) && (streq(
"*",get_c_string(car(cdr(r))))))
308 es = cons(cons(rintern(
"*"),s),es);
311 else if (cdr(r) && (streq(
"+",get_c_string(car(cdr(r))))))
313 es = cons(cons(rintern(
"+"),s),es);
317 es = cons(cons(rintern(
"and"),s),es);
322 static LISP expand_set(LISP p, LISP fp, LISP sets)
325 LISP
set = siod_assoc_str(get_c_string(p),sets);
332 for (s=
set; s != NIL; s=cdr(s))
334 for (f=fp; f != NIL; f=cdr(f))
347 static LISP find_notMAP(LISP MAP,LISP fp)
351 LISP r,notrp=NIL,m,np;
354 for (m=MAP; m != NIL; m=cdr(m))
356 p = get_c_string(car(m));
368 for (np=NIL,r=fp; r != NIL; r = cdr(r))
370 rr = get_c_string(car(r));
381 if ((s == sr) && (l != lr))
382 np = cons(car(r),np);
384 notrp = cons(cons(rintern(
"or"),np),notrp);
387 return reverse(notrp);