|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.