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

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: 
        !             3: /*
        !             4:   $Header: b2tcE.c,v 1.4 85/08/22 16:56:55 timo Exp $
        !             5: */
        !             6: 
        !             7: /* process type unification errors */
        !             8: 
        !             9: #include "b.h"
        !            10: #include "b1obj.h"
        !            11: #include "b2tcP.h"
        !            12: #include "b2tcE.h"
        !            13: #include "b2tcU.h"
        !            14: 
        !            15: /* 
        !            16:  * The variables from the users line are inserted in var_list.
        !            17:  * This is used to produce the right variable names
        !            18:  * in the error message.
        !            19:  * Call start_vars() when a new error context is established
        !            20:  * with the setting of curline.
        !            21:  */
        !            22: 
        !            23: Hidden value var_list;
        !            24: 
        !            25: Visible Procedure start_vars() {
        !            26:        var_list = mk_elt();
        !            27: }
        !            28: 
        !            29: Visible Procedure add_var(tvar) polytype tvar; {
        !            30:        insert(tvar, &var_list);
        !            31: }
        !            32: 
        !            33: Hidden bool in_vars(t) polytype t; {
        !            34:        return in(t, var_list);
        !            35: }
        !            36: 
        !            37: Visible Procedure end_vars() {
        !            38:        release(var_list);
        !            39: }
        !            40: 
        !            41: /* t_repr(u) is used to print polytypes when an error
        !            42:  * has occurred.
        !            43:  * Because the errors are printed AFTER unification, the variable 
        !            44:  * polytypes in question have changed to the error-type.
        !            45:  * To print the real types in error, the table has to be 
        !            46:  * saved in reprtable.
        !            47:  * The routines are called in unify().
        !            48:  */
        !            49: 
        !            50: Hidden value reprtable;
        !            51: extern value typeof;           /* defined in b2tcP.c */
        !            52: 
        !            53: Visible Procedure setreprtable() {
        !            54:        reprtable = copy(typeof);
        !            55: }
        !            56: 
        !            57: Visible Procedure delreprtable() {
        !            58:        release(reprtable);
        !            59: }
        !            60: 
        !            61: /* miscellaneous procs */
        !            62: 
        !            63: Hidden value conc(v, w) value v, w; {
        !            64:        value c;
        !            65:        c = concat(v, w);
        !            66:        release(v); release(w);
        !            67:        return c;
        !            68: }
        !            69: 
        !            70: Hidden bool newvar(u) polytype u; {
        !            71:        value u1;
        !            72:        char ch;
        !            73:        u1 = curtail(ident(u), one);
        !            74:        ch = charval(u1);
        !            75:        release(u1);
        !            76:        return (bool) ('0' <= ch && ch <= '9');
        !            77: }
        !            78: 
        !            79: #define Known(tu) (!t_is_var(kind(tu)) && !t_is_error(kind(tu)))
        !            80: 
        !            81: Hidden bool knowntype(u) polytype u; {
        !            82:        value tu;
        !            83:        tu = u;
        !            84:        while (t_is_var(kind(tu)) && in_keys(ident(tu), reprtable))
        !            85:                tu = *adrassoc(reprtable, ident(tu));
        !            86:        return Known(tu);
        !            87: }
        !            88: 
        !            89: Hidden bool outervar = Yes;
        !            90: 
        !            91: Hidden value t_repr(u) polytype u; {
        !            92:        typekind u_kind;
        !            93:        value c;
        !            94:        
        !            95:        u_kind = kind(u);
        !            96:        if (t_is_number(u_kind)) {
        !            97:                return mk_text("0");
        !            98:        }
        !            99:        else if (t_is_text(u_kind)) {
        !           100:                return mk_text("''");
        !           101:        }
        !           102:        else if (t_is_tn(u_kind)) {
        !           103:                return mk_text("'' or 0");
        !           104:        }
        !           105:        else if (t_is_compound(u_kind)) {
        !           106:                intlet k, len = nsubtypes(u);
        !           107:                c = mk_text("(");
        !           108:                for (k = 0; k < len - 1; k++) {
        !           109:                        c = conc(c, t_repr(subtype(u, k)));
        !           110:                        c = conc(c, mk_text(", "));
        !           111:                }
        !           112:                c = conc(c, t_repr(subtype(u, k)));
        !           113:                return conc(c, mk_text(")"));
        !           114:        }
        !           115:        else if (t_is_error(u_kind)) {
        !           116:                return mk_text(" ");
        !           117:        }
        !           118:        else if (t_is_var(u_kind)) {
        !           119:                value tu;
        !           120:                tu = u;
        !           121:                while (t_is_var(kind(tu)) && in_keys(ident(tu), reprtable))
        !           122:                        tu = *adrassoc(reprtable, ident(tu));
        !           123:                if (in_vars(u)) {
        !           124:                        if (Known(tu)) {
        !           125:                                if (outervar) {
        !           126:                                        outervar = No;
        !           127:                                        c = conc(t_repr(tu), mk_text(" for "));
        !           128:                                        outervar = Yes;
        !           129:                                        return conc(c, copy(ident(u)));
        !           130:                                }
        !           131:                                else
        !           132:                                        return t_repr(tu);
        !           133:                        }
        !           134:                        else {
        !           135:                                return copy(ident(u));
        !           136:                        }
        !           137:                }
        !           138:                else if (Known(tu))
        !           139:                        return t_repr(tu);
        !           140:                else if (newvar(u))
        !           141:                        return mk_text(" ");
        !           142:                else
        !           143:                        return copy(ident(u));
        !           144:        }
        !           145:        else if (t_is_table(u_kind)) {
        !           146:                if (knowntype(keytype(u))) {
        !           147:                        if (knowntype(asctype(u))) {
        !           148:                                c = conc(mk_text("{["),
        !           149:                                        t_repr(keytype(u)));
        !           150:                                c = conc(c, mk_text("]:"));
        !           151:                                c = conc(c, t_repr(asctype(u)));
        !           152:                                return conc(c, mk_text("}"));
        !           153:                        }
        !           154:                        else {
        !           155:                                c = conc(mk_text("table with type "),
        !           156:                                        t_repr(keytype(u)));
        !           157:                                return conc(c, mk_text(" keys"));
        !           158:                        }
        !           159:                }
        !           160:                else if (knowntype(asctype(u))) {
        !           161:                        c = conc(mk_text("table with type "),
        !           162:                                t_repr(asctype(u)));
        !           163:                        return conc(c, mk_text(" associates"));
        !           164:                }
        !           165:                else {
        !           166:                        return mk_text("table");
        !           167:                }
        !           168:        }
        !           169:        else if (t_is_list(u_kind)) {
        !           170:                if (knowntype(asctype(u))) {
        !           171:                        c = conc(mk_text("{"), t_repr(asctype(u)));
        !           172:                        return conc(c, mk_text("}"));
        !           173:                }
        !           174:                else {
        !           175:                        return mk_text("list");
        !           176:                }
        !           177:        }
        !           178:        else if (t_is_lt(u_kind)) {
        !           179:                if (knowntype(asctype(u)))
        !           180:                        return conc(mk_text("list or table of "),
        !           181:                                    t_repr(asctype(u)));
        !           182:                else
        !           183:                        return mk_text("{}");
        !           184:        }
        !           185:        else if (t_is_tlt(u_kind)) {
        !           186:                if (knowntype(asctype(u)))
        !           187:                        return conc(mk_text("text list or table of "),
        !           188:                                    t_repr(asctype(u)));
        !           189:                else
        !           190:                        return mk_text("text list or table");
        !           191:        }
        !           192:        else {
        !           193:                syserr(MESS(4300, "unknown polytype in t_repr"));
        !           194:                return mk_text("***");
        !           195:        }
        !           196: }
        !           197: 
        !           198: /* now, the real error messages */
        !           199: 
        !           200: Visible Procedure badtyperr(a, b) polytype a, b; {
        !           201:        value t;
        !           202: 
        !           203: /*error4("incompatible types: ", ta, ", and ", tb); */
        !           204: 
        !           205:        t = conc(t_repr(a), mk_text(" and "));
        !           206:        t = conc(t, t_repr(b));
        !           207:        error2(MESS(4301, "incompatible types "), t);
        !           208:        release(t);
        !           209: }
        !           210: 
        !           211: Visible Procedure cyctyperr(a) polytype a; {
        !           212:        value vcyc;
        !           213:        
        !           214:        vcyc = Vnil;
        !           215:        if (in_vars(a))
        !           216:                vcyc = ident(a);
        !           217:        else {
        !           218:                value n, m, nvars, v;
        !           219:                n = copy(one);
        !           220:                nvars = size(var_list);
        !           221:                while (compare(n, nvars) <= 0) {
        !           222:                        v = th_of(n, var_list);
        !           223:                        if (equal_vars(v, a) || contains(v, a)) {
        !           224:                                vcyc = ident(v);
        !           225:                                break;
        !           226:                        }
        !           227:                        m = n;
        !           228:                        n = sum(n, one);
        !           229:                        release(m); release(v);
        !           230:                }
        !           231:                release(n); release(nvars);
        !           232:                if (vcyc EQ Vnil) {
        !           233:                        error2(MESS(4302, "unknown cyclic type"), ident(a));
        !           234:                        syserr(MESS(4303, "unknown cyclic type"));
        !           235:                        return;
        !           236:                }
        !           237:        }
        !           238:        error3(MESS(4304, "(sub)type of "), vcyc,
        !           239:                MESS(4305, " contains itself"));
        !           240: }

unix.superglobalmegacorp.com

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