Annotation of 43BSDTahoe/new/B/src/bint/b2stc.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.