|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
2: /* $Header: b2tar.c,v 1.1 84/06/28 00:49:23 timo Exp $ */
3:
4: /* B target locating */
5: #include "b.h"
6: #include "b1obj.h"
7: #include "b2env.h"
8: #include "b2syn.h"
9: #include "b2sem.h"
10:
11: Visible loc statrimloc(l, v) loc l; value v; {
12: /* temporary, while no static type check */
13: return (loc) mk_elt();
14: }
15:
16: Visible loc statbseloc(l, k) loc l; value k; {
17: /* temporary, while no static type check */
18: return (loc) mk_elt();
19: }
20:
21: Visible loc targ(q) txptr q; {
22: value c; loc l; txptr i, j; intlet len, k;
23: if ((len= 1+count(",", q)) == 1) return bastarg(q);
24: c= mk_compound(len);
25: k_Overfields {
26: if (!Lastfield(k)) req(",", q, &i, &j);
27: else i= q;
28: l= bastarg(i);
29: put_in_field(l, &c, k);
30: if (!Lastfield(k)) tx= j;
31: }
32: return (loc) c;
33: }
34:
35: Visible loc bastarg(q) txptr q; {
36: loc l; txptr i, j; value k;
37: Skipsp(tx);
38: nothing(q, "target");
39: if (Char(tx) == '(') {
40: tx++; req(")", q, &i, &j);
41: l= targ(i); tx= j;
42: } else if (Letter(Char(tx))) {
43: value t= tag(), *aa;
44: aa= lookup(t);
45: if (aa == Pnil) l= local_loc(t);
46: else if (Is_refinement(*aa))
47: pprerr("refined targets are not allowed", "");
48: else if (Is_formal(*aa)) {
49: l= loc_formal(*aa);
50: } else if (Is_shared(*aa))
51: l= global_loc(t);
52: else l= local_loc(t);
53: release(t);
54: } else parerr("no target where expected", "");
55: Skipsp(tx);
56: while (tx < q && Char(tx) == '[') {
57: if (xeq) check_location(l);
58: tx++; req("]", q, &i, &j);
59: k= expr(i); tx= j;
60: if (xeq) {
61: loc ll= l;
62: l= tbsel_loc(l, k);
63: release(k); release(ll);
64: } else l= statbseloc(l, k);
65: Skipsp(tx);
66: }
67: if (tx < q && (Char(tx) == '@' || Char(tx) == '|')) {
68: value v= xeq ? content(l) : Vnil; intlet B, C;
69: if (xeq && !Is_text(v))
70: error("in the target t@p or t|p, t does not contain a text");
71: trimbc(q, xeq ? length(v) : 0, &B, &C);
72: release(v);
73: if (xeq) l= trim_loc(l, B, C);
74: else l= statrimloc(l, k);
75: Skipsp(tx);
76: }
77: if (tx < q) parerr(Char(tx) == ',' ? "comma not allowed here" :
78: "garbage following target", "");
79: return l;
80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.