|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2:
3: /*
4: $Header: b2stc.c,v 1.4 85/08/22 16:55:56 timo Exp $
5: */
6:
7: /* B (intra-unit) type check */
8:
9: #include "b.h"
10: #include "b1obj.h"
11: #include "b2nod.h"
12: #include "b2syn.h" /* temporary? for Cap in tc_refinement */
13: #include "b2tcP.h"
14: #include "b2tcU.h"
15: #include "b2tcE.h"
16: #include "b3err.h"
17:
18: /* ******************************************************************** */
19:
20: Hidden value refname;
21:
22: /*
23: * if in commandsuite of refinement:
24: * holds refinement name;
25: * if in commandsuite of yield unit:
26: * holds B-text "returned value"
27: * (used in error messages, no confusion possible)
28: * else
29: * Vnil
30: * To be used in tc_return()
31: */
32:
33: /* ******************************************************************** */
34:
35: Forward polytype pt_expr();
36:
37: Visible Procedure type_check(v) parsetree v; {
38: typenode n;
39: extern bool extcmds; /* Set in main by -E option */
40:
41: if (extcmds || !still_ok || v EQ NilTree)
42: return;
43: n = nodetype(v);
44: curline= v; curlino= one;
45: start_vars();
46: refname = Vnil;
47: usetypetable(mk_elt());
48: if (Unit(n)) tc_unit(v);
49: else if (Command(n)) tc_command(v);
50: else if (Expression(n)) p_release(pt_expr(v));
51: else syserr(MESS(2300, "wrong argument of 'type_check'"));
52: end_vars();
53: deltypetable();
54: }
55:
56: #define TABSIZE 72
57:
58: Hidden Procedure (*(uni_tab[TABSIZE]))(); /*Units*/
59: Hidden Procedure (*(cmd_tab[TABSIZE]))(); /*Commands*/
60: Hidden polytype (*(exp_tab[TABSIZE]))(); /*Expressions*/
61: Hidden Procedure (*(tes_tab[TABSIZE]))(); /*Tests*/
62:
63: #define FF First_fieldnr
64:
65: Hidden Procedure tc_node(v, tab) parsetree v; int (*(tab[]))(); {
66: auto (*f)()= tab[nodetype(v)];
67: switch (Nbranches(v)) {
68: case 0: (*f)(); break;
69: case 1: (*f)(*Branch(v,FF)); break;
70: case 2: (*f)(*Branch(v,FF), *Branch(v,FF+1)); break;
71: case 3: (*f)(*Branch(v,FF), *Branch(v,FF+1),
72: *Branch(v,FF+2)); break;
73: case 4: (*f)(*Branch(v,FF), *Branch(v,FF+1),
74: *Branch(v,FF+2), *Branch(v,FF+3)); break;
75: case 5: (*f)(*Branch(v,FF), *Branch(v,FF+1),
76: *Branch(v,FF+2), *Branch(v,FF+3),
77: *Branch(v,FF+4)); break;
78: case 6: (*f)(*Branch(v,FF), *Branch(v,FF+1),
79: *Branch(v,FF+2), *Branch(v,FF+3),
80: *Branch(v,FF+4), *Branch(v,FF+5)); break;
81: case 7: (*f)(*Branch(v,FF), *Branch(v,FF+1),
82: *Branch(v,FF+2), *Branch(v,FF+3),
83: *Branch(v,FF+4), *Branch(v,FF+5),
84: *Branch(v,FF+6)); break;
85: case 8: (*f)(*Branch(v,FF), *Branch(v,FF+1),
86: *Branch(v,FF+2), *Branch(v,FF+3),
87: *Branch(v,FF+4), *Branch(v,FF+5),
88: *Branch(v,FF+6), *Branch(v,FF+7)); break;
89: case 9: (*f)(*Branch(v,FF), *Branch(v,FF+1),
90: *Branch(v,FF+2), *Branch(v,FF+3),
91: *Branch(v,FF+4), *Branch(v,FF+5),
92: *Branch(v,FF+6), *Branch(v,FF+7),
93: *Branch(v,FF+8)); break;
94: default: syserr(MESS(2301, "Wrong size node in tc_node"));
95: }
96: }
97:
98: Hidden polytype pt_node(v, tab) parsetree v; polytype (*(tab[]))(); {
99: polytype (*f)()= tab[nodetype(v)];
100: switch (Nbranches(v)) {
101: case 0: (*f)(); break;
102: case 1: (*f)(*Branch(v,FF)); break;
103: case 2: (*f)(*Branch(v,FF), *Branch(v,FF+1)); break;
104: case 3: (*f)(*Branch(v,FF), *Branch(v,FF+1),
105: *Branch(v,FF+2)); break;
106: case 4: (*f)(*Branch(v,FF), *Branch(v,FF+1),
107: *Branch(v,FF+2), *Branch(v,FF+3)); break;
108: case 5: (*f)(*Branch(v,FF), *Branch(v,FF+1),
109: *Branch(v,FF+2), *Branch(v,FF+3),
110: *Branch(v,FF+4)); break;
111: case 6: (*f)(*Branch(v,FF), *Branch(v,FF+1),
112: *Branch(v,FF+2), *Branch(v,FF+3),
113: *Branch(v,FF+4), *Branch(v,FF+5)); break;
114: case 7: (*f)(*Branch(v,FF), *Branch(v,FF+1),
115: *Branch(v,FF+2), *Branch(v,FF+3),
116: *Branch(v,FF+4), *Branch(v,FF+5),
117: *Branch(v,FF+6)); break;
118: case 8: (*f)(*Branch(v,FF), *Branch(v,FF+1),
119: *Branch(v,FF+2), *Branch(v,FF+3),
120: *Branch(v,FF+4), *Branch(v,FF+5),
121: *Branch(v,FF+6), *Branch(v,FF+7)); break;
122: case 9: (*f)(*Branch(v,FF), *Branch(v,FF+1),
123: *Branch(v,FF+2), *Branch(v,FF+3),
124: *Branch(v,FF+4), *Branch(v,FF+5),
125: *Branch(v,FF+6), *Branch(v,FF+7),
126: *Branch(v,FF+8)); break;
127: default: syserr(MESS(2302, "Wrong size node in pt_node"));
128: /* NOTREACHED */
129: }
130: }
131:
132: /* ******************************************************************** */
133: /* Type Check units */
134: /* ******************************************************************** */
135:
136: Hidden Procedure tc_unit(v) parsetree v; {
137: if (v != NilTree) tc_node(v, uni_tab);
138: }
139:
140: Hidden Procedure tc_howto_unit(name, formals, cmt,
141: suite, refinement, reftab, nlocals)
142: parsetree suite, refinement;
143: value name, formals, cmt, reftab, nlocals; {
144:
145: tc_command(suite);
146: tc_unit(refinement);
147: }
148:
149: Hidden Procedure tc_yield_unit(name, adic, formals, cmt,
150: suite, refinement, reftab, nlocals)
151: parsetree suite, refinement;
152: value name, adic, formals, cmt, reftab, nlocals; {
153:
154: refname = mk_text("returned value");
155: tc_command(suite);
156: release(refname); refname = Vnil;
157: tc_unit(refinement);
158: }
159:
160: Hidden Procedure tc_test_unit(name, adic, formals, cmt,
161: suite, refinement, reftab, nlocals)
162: parsetree suite, refinement;
163: value name, adic, formals, cmt, reftab, nlocals; {
164:
165: tc_command(suite);
166: tc_unit(refinement);
167: }
168:
169: Hidden Procedure tc_refinement(name, cmt, suite, next)
170: parsetree suite, next; value name, cmt; {
171: value n1 = curtail(name, one);
172:
173: if (!Cap(charval(n1))) /* should test for expression refinement */
174: refname = copy(name);
175: release(n1);
176: tc_command(suite);
177: if (refname NE Vnil) {
178: release(refname); refname = Vnil;
179: }
180:
181: tc_unit(next);
182: }
183:
184: /* ******************************************************************** */
185: /* TypeCheck commands */
186: /* ******************************************************************** */
187:
188: Hidden Procedure tc_command(v) parsetree v; {
189: curline= v;
190: end_vars();
191: start_vars();
192: if (v != NilTree) tc_node(v, cmd_tab);
193: }
194:
195: Hidden Procedure tc_suite(lino, cmd, cmt, next)
196: parsetree cmd, next; value lino, cmt; {
197:
198: curlino= lino;
199: tc_command(cmd);
200: tc_command(next);
201: }
202:
203: Hidden Procedure tc_put(e, t) parsetree e, t; {
204: polytype te, tt, u;
205: te = pt_expr(e);
206: tt = pt_expr(t);
207: unify(te, tt, &u);
208: p_release(te); p_release(tt); p_release(u);
209: }
210:
211: Hidden Procedure tc_ins_rem(e, t) parsetree e, t; {
212: polytype t_list_e, tt, u;
213: t_list_e = mkt_list(pt_expr(e));
214: tt = pt_expr(t);
215: unify(tt, t_list_e, &u);
216: p_release(t_list_e); p_release(tt); p_release(u);
217: }
218:
219: Hidden Procedure tc_choose(t, e) parsetree t, e; {
220: polytype t_tlt_t, te, u;
221: t_tlt_t = mkt_tlt(pt_expr(t));
222: te = pt_expr(e);
223: unify(te, t_tlt_t, &u);
224: p_release(te); p_release(t_tlt_t); p_release(u);
225: }
226:
227: Hidden Procedure tc_draw(t) parsetree t; {
228: polytype t_number, tt, u;
229: tt = pt_expr(t);
230: t_number = mkt_number();
231: unify(tt, t_number, &u);
232: p_release(t_number); p_release(tt); p_release(u);
233: }
234:
235: Hidden Procedure tc_set_random(e) parsetree e; {
236: p_release(pt_expr(e));
237: }
238:
239: Hidden Procedure tc_delete(t) parsetree t; {
240: p_release(pt_expr(t));
241: }
242:
243: Hidden Procedure tc_check(c) parsetree c; {
244: tc_test(c);
245: }
246:
247: Hidden Procedure tc_nothing(t) parsetree t; {}
248:
249: Hidden Procedure tc_write(nl1, e, nl2) parsetree e; value nl1, nl2; {
250: if (e != NilTree)
251: p_release(pt_expr(e));
252: }
253:
254: Hidden Procedure tc_read(t, e) parsetree t, e; {
255: polytype te, tt, u;
256: te = pt_expr(e);
257: tt = pt_expr(t);
258: unify(tt, te, &u);
259: p_release(te); p_release(tt); p_release(u);
260: }
261:
262: Hidden Procedure tc_raw_read(t) parsetree t; {
263: polytype t_text, tt, u;
264: t_text = mkt_text();
265: tt = pt_expr(t);
266: unify(tt, t_text, &u);
267: p_release(t_text); p_release(tt); p_release(u);
268: }
269:
270: Hidden Procedure tc_ifwhile(c, cmt, s) parsetree c, s; value cmt; {
271: tc_test(c);
272: tc_command(s);
273: }
274:
275: Hidden Procedure tc_for(t, e, cmt, s) parsetree t, e, s; value cmt; {
276: polytype t_tlt_t, te, u;
277:
278: t_tlt_t = mkt_tlt(pt_expr(t));
279: te = pt_expr(e);
280: unify(te, t_tlt_t, &u);
281: p_release(te); p_release(t_tlt_t); p_release(u);
282:
283: tc_command(s);
284: }
285:
286: Hidden Procedure tc_select(cmt, s) parsetree s; value cmt; {
287: tc_command(s);
288: }
289:
290: Hidden Procedure tc_tes_suite(lino, c, cmt, s, next)
291: parsetree c, s, next; value lino, cmt; {
292: curlino= lino;
293: if (c != NilTree) {
294: tc_test(c);
295: tc_command(s);
296: }
297: tc_command(next);
298: }
299:
300: Hidden Procedure tc_else(lino, cmt, s) parsetree s; value lino, cmt; {
301: curlino= lino;
302: tc_command(s);
303: }
304:
305: Hidden Procedure tc_return(e) parsetree e; {
306: polytype te, tt, u;
307: te = pt_expr(e);
308: if (refname EQ Vnil)
309: error(MESS(2303, "RETURN not in YIELD unit or expression refinement"));
310: else {
311: tt = mkt_var(copy(refname));
312: unify(tt, te, &u);
313: p_release(tt); p_release(u);
314: }
315: p_release(te);
316: }
317:
318: Hidden Procedure tc_report(c) parsetree c; {
319: tc_test(c);
320: }
321:
322: Hidden Procedure tc_user_command(name, v) value name, v; {
323: parsetree e; value w= v;
324: while (w != Vnil) {
325: e= *Branch(w, ACT_EXPR);
326: if (e != NilTree)
327: p_release(pt_expr(e));
328: w= *Branch(w, ACT_NEXT);
329: }
330: }
331:
332: /* ******************************************************************** */
333: /* calculate PolyType of EXPRessions
334: /* ******************************************************************** */
335:
336: Hidden polytype pt_expr(v) parsetree v; {
337: return pt_node(v, exp_tab);
338: }
339:
340: Hidden polytype pt_compound(e) parsetree e; {
341: return pt_expr(e);
342: }
343:
344: Hidden polytype pt_collateral(e) value e; {
345: intlet k, len= Nfields(e);
346: polytype tc;
347: tc = mkt_compound(len);
348: for (k = 0; k < len; k++)
349: putsubtype(pt_expr(*Field(e, k)), tc, k);
350: return tc;
351: }
352:
353: Hidden bool is_string(v, s) value v; string s; {
354: value t;
355: relation rel;
356:
357: rel = compare(v, t= mk_text(s));
358: release(t);
359: return (rel EQ 0 ? Yes : No);
360: }
361:
362: Hidden bool monf_on_number(n) value n; {
363: return (is_string(n, "~") ||
364: is_string(n, "+") ||
365: is_string(n, "-") ||
366: is_string(n, "*/") ||
367: is_string(n, "/*") ||
368: is_string(n, "root") ||
369: is_string(n, "abs") ||
370: is_string(n, "sign") ||
371: is_string(n, "floor") ||
372: is_string(n, "ceiling") ||
373: is_string(n, "round") ||
374: is_string(n, "sin") ||
375: is_string(n, "cos") ||
376: is_string(n, "tan") ||
377: is_string(n, "atan") ||
378: is_string(n, "exp") ||
379: is_string(n, "log")
380: );
381: }
382:
383: Hidden bool dyaf_on_number(n) value n; {
384: return (is_string(n, "+") ||
385: is_string(n, "-") ||
386: is_string(n, "*") ||
387: is_string(n, "/") ||
388: is_string(n, "**") ||
389: is_string(n, "root") ||
390: is_string(n, "round") ||
391: is_string(n, "mod") ||
392: is_string(n, "atan") ||
393: is_string(n, "log")
394: );
395: }
396:
397: Hidden polytype pt_monf(name, r, fct) parsetree r; value name, fct; {
398: polytype tr, tf, u;
399:
400: tr = pt_expr(r);
401:
402: if (monf_on_number(name)) {
403: polytype t_number = mkt_number();
404: unify(tr, t_number, &u);
405: p_release(u);
406: tf = t_number;
407: }
408: else if (is_string(name, "keys")) {
409: polytype t_table, t_keys;
410: t_keys = mkt_newvar();
411: t_table = mkt_table(p_copy(t_keys), mkt_newvar());
412: unify(tr, t_table, &u);
413: p_release(t_table); p_release(u);
414: tf = mkt_list(t_keys);
415: }
416: else if (is_string(name, "#")) {
417: polytype t_tlt = mkt_tlt(mkt_newvar());
418: unify(tr, t_tlt, &u);
419: p_release(t_tlt); p_release(u);
420: tf = mkt_number();
421: }
422: else if (is_string(name, "min") || is_string(name, "max")) {
423: polytype t_tlt_x, t_x;
424: t_x = mkt_newvar();
425: t_tlt_x = mkt_tlt(p_copy(t_x));
426: unify(tr, t_tlt_x, &u);
427: p_release(t_tlt_x); p_release(u);
428: tf = t_x;
429: }
430: else {
431: tf = mkt_newvar();
432: }
433:
434: p_release(tr);
435: return tf;
436: }
437:
438: Hidden polytype pt_dyaf(l, name, r, fct) parsetree l, r; value name, fct; {
439: polytype tl, tr, tf, u;
440:
441: tl = pt_expr(l);
442: tr = pt_expr(r);
443: if (dyaf_on_number(name)){
444: polytype t_number = mkt_number();
445: unify(tl, t_number, &u);
446: p_release(u);
447: unify(tr, t_number, &u);
448: p_release(u);
449: tf = t_number;
450: }
451: else if (is_string(name, "^")) {
452: polytype t_text = mkt_text();
453: unify(tl, t_text, &u);
454: p_release(u);
455: unify(tr, t_text, &u);
456: p_release(u);
457: tf = t_text;
458: }
459: else if (is_string(name, "^^")) {
460: polytype t_text = mkt_text(), t_number = mkt_number();
461: unify(tl, t_text, &u);
462: p_release(u);
463: unify(tr, t_number, &u);
464: p_release(u); p_release(t_number);
465: tf = t_text;
466: }
467: else if (is_string(name, "<<")
468: ||
469: is_string(name, "><")
470: ||
471: is_string(name, ">>"))
472: {
473: polytype t_number = mkt_number();
474: unify(tr, t_number, &u);
475: p_release(u); p_release(t_number);
476: tf = mkt_text();
477: }
478: else if (is_string(name, "#")) {
479: polytype t_tlt_l = mkt_tlt(p_copy(tl));
480: unify(tr, t_tlt_l, &u);
481: p_release(t_tlt_l); p_release(u);
482: tf = mkt_number();
483: }
484: else if (is_string(name, "min") || is_string(name, "max")) {
485: polytype t_tlt_l = mkt_tlt(p_copy(tl));
486: unify(tr, t_tlt_l, &u);
487: tf = p_copy(asctype(u));
488: p_release(t_tlt_l); p_release(u);
489: }
490: else if (is_string(name, "th'of")) {
491: polytype t_number, t_tlt_x, t_x;
492: t_number = mkt_number();
493: unify(tl, t_number, &u);
494: p_release(t_number); p_release(u);
495: t_x = mkt_newvar();
496: t_tlt_x = mkt_tlt(p_copy(t_x));
497: unify(tr, t_tlt_x, &u);
498: p_release(t_tlt_x); p_release(u);
499: tf = t_x;
500: }
501: else {
502: tf = mkt_newvar();
503: }
504:
505: p_release(tl);
506: p_release(tr);
507:
508: return tf;
509: }
510:
511: Hidden polytype pt_tag(name) value name; {
512: polytype var;
513: /*
514: * if (is_globalstring(name, "pi") || is_globalstring(name, "e"))
515: * return mkt_number();
516: * else
517: */
518: var = mkt_var(copy(name));
519: add_var(var);
520: return var;
521: }
522:
523: Hidden polytype pt_tformal(name, number) value name, number; {
524: return pt_tag(name);
525: }
526:
527: Hidden polytype pt_tlocal(name, number) value name, number; {
528: return pt_tag(name);
529: }
530:
531: Hidden polytype pt_tglobal(name) value name; {
532: return pt_tag(name);
533: }
534:
535: Hidden polytype pt_tmystery(name, number) value name, number; {
536: return pt_tag(name);
537: }
538:
539: Hidden polytype pt_trefinement(name) value name; {
540: return pt_tag(name);
541: }
542:
543: Hidden polytype pt_tfun(name, fct) value name, fct; {
544: return pt_tag(name);
545: }
546:
547: Hidden polytype pt_tprd(name, fct) value name, fct; {
548: return pt_tag(name);
549: }
550:
551: Hidden polytype pt_number(v, t) value v, t; {
552: return mkt_number();
553: }
554:
555: Hidden polytype pt_text_dis(q, v) parsetree v; value q; {
556: while(v NE NilTree) {
557: switch (nodetype(v)) {
558: case TEXT_LIT:
559: v = *Branch(v, XLIT_NEXT);
560: break;
561: case TEXT_CONV:
562: p_release(pt_expr(*Branch(v, XCON_EXPR)));
563: v = *Branch(v, XCON_NEXT);
564: break;
565: default:
566: v = NilTree;
567: }
568: }
569: return mkt_text();
570: }
571:
572: Hidden polytype pt_elt_dis() {
573: return mkt_lt(mkt_newvar());
574: }
575:
576: Hidden polytype pt_list_dis(e) value e; {
577: intlet k, len= Nfields(e);
578: polytype tres = pt_expr(*Field(e, 0));
579: for (k = 1; k < len; k++) {
580: polytype te, u;
581: te = pt_expr(*Field(e, k));
582: unify(te, tres, &u);
583: p_release(te); p_release(tres);
584: tres = u;
585: }
586: return mkt_list(tres);
587: }
588:
589: Hidden polytype pt_range_dis(l, h) parsetree l, h; {
590: polytype tl, th, t_tn, tres, u;
591: t_tn = mkt_tn();
592: tl = pt_expr(l);
593: unify(tl, t_tn, &tres);
594: p_release(tl); p_release(t_tn);
595: th = pt_expr(h);
596: unify(th, tres, &u);
597: release(th); release(tres);
598: return mkt_list(u);
599: }
600:
601: Hidden polytype pt_tab_dis(e) value e; {
602: intlet k, len= Nfields(e);
603: polytype tresk, tresa;
604: tresk = pt_expr(*Field(e, 0));
605: tresa = pt_expr(*Field(e, 1));
606: for (k = 2; k < len; k += 2) {
607: polytype tk, ta, u;
608: tk = pt_expr(*Field(e, k));
609: unify(tk, tresk, &u);
610: p_release(tk); p_release(tresk);
611: tresk = u;
612: ta = pt_expr(*Field(e, k+1));
613: unify(ta, tresa, &u);
614: p_release(ta); p_release(tresa);
615: tresa = u;
616: }
617: return mkt_table(tresk, tresa);
618: }
619:
620: Hidden polytype pt_selection(t, k) parsetree t, k; {
621: polytype tt, ta, ttab, u;
622: tt = pt_expr(t);
623: ta = mkt_newvar();
624: ttab = mkt_table(pt_expr(k), p_copy(ta));
625: unify(tt, ttab, &u);
626: p_release(tt); p_release(ttab); p_release(u);
627: return ta;
628: }
629:
630: Hidden polytype pt_trim(l, r) parsetree l, r; {
631: polytype tl, tr, t_text, t_number, u;
632:
633: tl = pt_expr(l);
634: t_text = mkt_text();
635: unify(tl, t_text, &u);
636: p_release(tl); p_release(u);
637: tr = pt_expr(r);
638: t_number = mkt_number();
639: unify(tr, t_number, &u);
640: p_release(tr); p_release(t_number); p_release(u);
641: return t_text;
642: }
643:
644: Hidden polytype pt_unparsed(v, t) parsetree v, t; {
645: return mkt_newvar();
646: }
647:
648: /* ******************************************************************** */
649: /* Type Check tests */
650: /* ******************************************************************** */
651:
652: Hidden Procedure tc_test(v) parsetree v; {
653: tc_node(v, tes_tab);
654: }
655:
656: Hidden Procedure tc_compound(c) parsetree c; {
657: tc_test(c);
658: }
659:
660: Hidden Procedure tc_junction(l, r) parsetree l, r; {
661: tc_test(l);
662: tc_test(r);
663: }
664:
665: Hidden Procedure tc_not(r) parsetree r; {
666: tc_test(r);
667: }
668:
669: Hidden Procedure tc_in_quantification(t, e, c) parsetree t, e, c; {
670: polytype t_tlt_t, te, u;
671:
672: t_tlt_t = mkt_tlt(pt_expr(t));
673: te = pt_expr(e);
674: unify(te, t_tlt_t, &u);
675: p_release(te); p_release(t_tlt_t); p_release(u);
676:
677: tc_test(c);
678: }
679:
680: Hidden Procedure tc_p_quantification(t, e, c) parsetree t, e, c; {
681: intlet k, len;
682: value ct; /* the Collateral Tag in t */
683: polytype t_text, te, u;
684:
685: t_text = mkt_text();
686:
687: ct = *Branch(t, COLL_SEQ);
688: len = Nfields(ct);
689: k_Over_len {
690: polytype ttag;
691: ttag = mkt_var(copy(*Branch(*Field(ct, k), TAG_NAME)));
692: add_var(ttag);
693: unify(ttag, t_text, &u);
694: p_release(ttag); p_release(u);
695: }
696:
697: te = pt_expr(e);
698: unify(te, t_text, &u);
699: p_release(te); p_release(t_text); p_release(u);
700:
701: tc_test(c);
702: }
703:
704: Hidden Procedure tc_tag(name) value name; {}
705:
706: Hidden Procedure tc_tformal(name, number) value name, number; {
707: tc_tag(name);
708: }
709:
710: Hidden Procedure tc_tlocal(name, number) value name, number; {
711: tc_tag(name);
712: }
713:
714: Hidden Procedure tc_tglobal(name) value name; {
715: tc_tag(name);
716: }
717:
718: Hidden Procedure tc_tmystery(name, number) value name, number; {
719: tc_tag(name);
720: }
721:
722: Hidden Procedure tc_trefinement(name) value name; {
723: tc_tag(name);
724: }
725:
726: Hidden Procedure tc_tfun(name, fct) value name, fct; {
727: tc_tag(name);
728: }
729:
730: Hidden Procedure tc_tprd(name, fct) value name, fct; {
731: tc_tag(name);
732: }
733:
734: Hidden Procedure tc_monprd(name, r, pred) parsetree r; value name, pred; {
735: p_release(pt_expr(r));
736: }
737:
738: Hidden Procedure tc_dyaprd(l, name, r, pred) parsetree l, r; value name, pred; {
739: polytype tl, tr;
740: tl = pt_expr(l);
741: tr = pt_expr(r);
742: if (is_string(name, "in") || is_string(name, "not'in")) {
743: polytype t_tlt_l, u;
744: t_tlt_l = mkt_tlt(p_copy(tl));
745: unify(tr, t_tlt_l, &u);
746: p_release(t_tlt_l); p_release(u);
747: }
748: p_release(tl); p_release(tr);
749: }
750:
751: Forward polytype pt_relop();
752:
753: Hidden Procedure tc_relop(l, r) parsetree l, r; {
754: p_release(pt_relop(l, r));
755: }
756:
757: Hidden polytype pt_relop(l, r) parsetree l, r; {
758: polytype tl, tr, u;
759:
760: if (Comparison(nodetype(l)))
761: tl = pt_relop(*Branch(l, REL_LEFT), *Branch(l, REL_RIGHT));
762: else
763: tl = pt_expr(l);
764: tr = pt_expr(r);
765: unify(tl, tr, &u);
766: p_release(tl); p_release(tr);
767: return u;
768: }
769:
770: Hidden Procedure tc_unparsed(c, t) parsetree c, t; {}
771:
772: Hidden Procedure uni_bad() { syserr(MESS(2304, "bad uni node in type check")); }
773: Hidden Procedure cmd_bad() { syserr(MESS(2305, "bad cmd node in type check")); }
774: Hidden polytype exp_bad() { syserr(MESS(2306, "bad exp node in type check"));
775: return (polytype) 0; }
776: Hidden Procedure tes_bad() { syserr(MESS(2307, "bad tes node in type check")); }
777:
778: Visible Procedure inittyp() {
779: int i;
780: for (i= 0; i<TABSIZE; i++) {
781: uni_tab[i]= uni_bad;
782: cmd_tab[i]= cmd_bad;
783: exp_tab[i]= exp_bad;
784: tes_tab[i]= tes_bad;
785: }
786:
787: uni_tab[HOW_TO]= tc_howto_unit;
788: uni_tab[YIELD]= tc_yield_unit;
789: uni_tab[TEST]= tc_test_unit;
790: uni_tab[REFINEMENT]= tc_refinement;
791:
792: cmd_tab[SUITE]= tc_suite;
793: cmd_tab[PUT]= tc_put;
794: cmd_tab[INSERT]= tc_ins_rem;
795: cmd_tab[REMOVE]= tc_ins_rem;
796: cmd_tab[CHOOSE]= tc_choose;
797: cmd_tab[DRAW]= tc_draw;
798: cmd_tab[SET_RANDOM]= tc_set_random;
799: cmd_tab[DELETE]= tc_delete;
800: cmd_tab[CHECK]= tc_check;
801: cmd_tab[SHARE]= tc_nothing;
802: cmd_tab[WRITE]= tc_write;
803: cmd_tab[READ]= tc_read;
804: cmd_tab[READ_RAW]= tc_raw_read;
805: cmd_tab[IF]= tc_ifwhile;
806: cmd_tab[WHILE]= tc_ifwhile;
807: cmd_tab[FOR]= tc_for;
808: cmd_tab[SELECT]= tc_select;
809: cmd_tab[TEST_SUITE]= tc_tes_suite;
810: cmd_tab[ELSE]= tc_else;
811: cmd_tab[QUIT]= tc_nothing;
812: cmd_tab[RETURN]= tc_return;
813: cmd_tab[REPORT]= tc_report;
814: cmd_tab[SUCCEED]= tc_nothing;
815: cmd_tab[FAIL]= tc_nothing;
816: cmd_tab[USER_COMMAND]= tc_user_command;
817: cmd_tab[EXTENDED_COMMAND]= tc_nothing;
818: exp_tab[TAG]= pt_tag;
819: tes_tab[TAG]= tc_tag;
820: exp_tab[TAGformal]= pt_tformal;
821: tes_tab[TAGformal]= tc_tformal;
822: exp_tab[TAGlocal]= pt_tlocal;
823: tes_tab[TAGlocal]= tc_tlocal;
824: exp_tab[TAGglobal]= pt_tglobal;
825: tes_tab[TAGglobal]= tc_tglobal;
826: exp_tab[TAGmystery]= pt_tmystery;
827: tes_tab[TAGmystery]= tc_tmystery;
828: exp_tab[TAGrefinement]= pt_trefinement;
829: tes_tab[TAGrefinement]= tc_trefinement;
830: exp_tab[TAGzerfun]= pt_tfun;
831: tes_tab[TAGzerfun]= tc_tfun;
832: exp_tab[TAGzerprd]= pt_tprd;
833: tes_tab[TAGzerprd]= tc_tprd;
834:
835: exp_tab[COMPOUND]= pt_compound;
836: tes_tab[COMPOUND]= tc_compound;
837: exp_tab[COLLATERAL]= pt_collateral;
838: exp_tab[SELECTION]= pt_selection;
839: exp_tab[BEHEAD]= pt_trim;
840: exp_tab[CURTAIL]= pt_trim;
841:
842: exp_tab[UNPARSED]= pt_unparsed;
843: tes_tab[UNPARSED]= tc_unparsed;
844:
845: exp_tab[MONF]= pt_monf;
846: exp_tab[DYAF]= pt_dyaf;
847: exp_tab[NUMBER]= pt_number;
848: exp_tab[TEXT_DIS]= pt_text_dis;
849: exp_tab[ELT_DIS]= pt_elt_dis;
850: exp_tab[LIST_DIS]= pt_list_dis;
851: exp_tab[RANGE_DIS]= pt_range_dis;
852: exp_tab[TAB_DIS]= pt_tab_dis;
853:
854: tes_tab[AND]= tc_junction;
855: tes_tab[OR]= tc_junction;
856: tes_tab[NOT]= tc_not;
857: tes_tab[SOME_IN]= tc_in_quantification;
858: tes_tab[EACH_IN]= tc_in_quantification;
859: tes_tab[NO_IN]= tc_in_quantification;
860: tes_tab[SOME_PARSING]= tc_p_quantification;
861: tes_tab[EACH_PARSING]= tc_p_quantification;
862: tes_tab[NO_PARSING]= tc_p_quantification;
863: tes_tab[MONPRD]= tc_monprd;
864: tes_tab[DYAPRD]= tc_dyaprd;
865: tes_tab[LESS_THAN]= tc_relop;
866: tes_tab[AT_MOST]= tc_relop;
867: tes_tab[GREATER_THAN]= tc_relop;
868: tes_tab[AT_LEAST]= tc_relop;
869: tes_tab[EQUAL]= tc_relop;
870: tes_tab[UNEQUAL]= tc_relop;
871: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.