|
|
1.1 root 1: #include <stdio.h>
2: #include "1.incl.h"
3: #include "1.defs.h"
4: #include"def.h"
5:
6: extern int match[], symclass[], action[], newstate[];
7: extern char symbol[];
8: long *hashtab;
9: int *value, *chain;
10:
11: extern FILE *infd;
12:
13:
14: parse()
15: {int i,j,found,current, someread;
16: char c;
17:
18: hash_init();
19: routinit();
20: line_init();
21:
22: someread = 0; /* indicates haven't read part of a routine */
23:
24: empseek(0);
25: endbuf = getline(&endline, &endchar, &endcom, & comchar);
26: if (progress && endbuf != -1) fprintf(stderr,"parsing\n");
27: while(endbuf != -1) /* getline returns -1 when no more input */
28: {
29: someread = 1;
30: if (progress > 0)
31: {
32: for (i = begline; i <= endline; i++)
33: if (!(i % progress)) fprintf(stderr,"parsing line %d\n",i);
34: }
35: current = 0;
36: for (i = 0; i < endbuf; i++)
37: {
38:
39: c = buffer[i];
40: if(c != '~')
41: {
42: found = 0;
43: if ( (current < 0 || current >= snum) && current != ABORT)
44: {
45: strerr("in parsing:","","");
46: fprintf(stderr,"line %d of file, parser in invalid state", begline,current);
47: fprintf(stderr,"treating it as straight line code\n");
48: current = ABORT;
49: }
50: else
51: for (j = match[current]; j < match[current + 1]; j++)
52: {
53: if ((symclass[j] == 0 && c == symbol[j]) ||
54: (symclass[j] != 0 && classmatch(c,symclass[j]) ))
55: {found = 1; break;
56: }
57: }
58: if (!found)
59: {
60: error("in syntax:","","");
61: fprintf(stderr,"between lines %d and %d of file\n",begline, endline);
62: if (debug)
63: fprintf(stderr,"symbol '%c' does not match entries for state %d\n",c,current);
64: fprintf(stderr,"treating it as straight line code\n");
65: current = ABORT;
66: }
67: else if (!action[j])
68: current = newstate[j];
69: else
70: {
71: current = act(action[j],c,i);
72: if (current == nulls) current = newstate[j];
73: }
74: if (current == ABORT) break;
75: if (current == endrt)
76: {
77: return(1);
78: }
79: }
80: }
81: line_init();
82: endbuf = getline(&endline, &endchar, &endcom,&comchar);
83: }
84: if (someread) return(1);
85: else return(0);
86: }
87:
88:
89: hash_init()
90: {
91: int i;
92: hashtab = challoc(sizeof(*hashtab) * maxhash);
93: chain = challoc(sizeof(*chain) * maxhash);
94: value = challoc(sizeof(*value) * maxhash);
95: for (i = 0; i < maxhash; i++)
96: {
97: hashtab[i] = -1L;
98: value[i] = -2;
99: chain[i] = 0;
100: }
101: }
102:
103:
104: hash_check()
105: {
106: int i;
107: for (i = 0; i < maxhash; ++i)
108: if (value[i] == -2 && hashtab[i] != -1L)
109: {
110: error("in syntax; label used but does not appear as statement label:","","");
111: fprintf(stderr,"%D\n",hashtab[i]);
112: routerr = 1;
113: }
114: }
115:
116: hash_free()
117: {
118: chfree(hashtab,sizeof(*hashtab) * maxhash);
119: hashtab = 0;
120: chfree(chain,sizeof(*chain) * maxhash);
121: chain = 0;
122: chfree(value,sizeof(*value) * maxhash);
123: value = 0;
124: }
125: hash(x)
126: long x;
127: {
128: int quo, rem, hcount, temp;
129:
130: ASSERT(x >= 0L, hash);
131: quo = x/maxhash;
132: rem = x - (quo * maxhash);
133: if (quo == 0) quo = 1;
134:
135: temp = rem;
136: for (hcount=0; (hashtab[temp] != -1L) && (hashtab[temp] != x) && (hcount<maxhash); hcount++)
137: temp = (temp + quo)%maxhash;
138: if(hcount>=maxhash) faterr("hash table overflow - too many labels","","");
139: hashtab[temp] = x;
140: return(temp);
141: }
142:
143: addref(x,ptr) /* put ptr in chain for x or assign value of x to *ptr */
144: long x;
145: int *ptr;
146: {
147: int index;
148: index = hash(x);
149:
150: if (value[index] == -1)
151: { /* x already assigned value */
152: *ptr = chain[index];
153: return;
154: }
155:
156: /* add ptr to chain */
157:
158: if (chain[index] == 0)
159: *ptr = 0;
160: else
161: *ptr = chain[index];
162: chain[index] = ptr;
163: }
164:
165: fixvalue (x,ptr)
166: long x;
167: int ptr;
168: {
169: int *temp1, *temp2, index, temp0;
170: index = hash(x);
171:
172: while (index != -2)
173: { /* trace chain of linked labels */
174:
175: if (value[index] == -1)
176: {
177: error("in syntax: ","","");
178: fprintf(stderr,"attempt to redefine value of label %D between lines %d and %d\n",
179: x,begline,endline);
180: routerr = 1;
181: return;
182: }
183:
184: temp1 = &chain[index]; /* trace chain for each label */
185: while (temp1 != 0)
186: {
187: temp2 = *temp1;
188: *temp1 = ptr;
189: temp1 = temp2;
190: }
191: temp0 = index;
192: index = value[index];
193: value[temp0] = -1;
194: }
195: }
196:
197: connect(x,y)
198: long x,y;
199: {
200: int *temp, index, temp2;
201: index = hash(x);
202:
203: if (value[index] == -1)
204: fixvalue(y, chain[index]);
205: else
206: {
207: if (y == implicit)
208: { /* attach implicit chain to x chain */
209: temp = &chain[index];
210:
211: while (*temp != 0)
212: temp = *temp;
213:
214: *temp = chain[hash(y)];
215: }
216: temp2 = index; /* attach y linked labels to x linked labels */
217: while (value[temp2] >= 0)
218: temp2 = value[temp2];
219: if (y == implicit)
220: value[temp2] = value[hash(y)];
221: else
222: value[temp2] = hash(y);
223: }
224: if (y == implicit) clear(y);
225: }
226:
227:
228: clear(x)
229: long x;
230: {
231: int index;
232: index = hash(x);
233: value[index] = -2;
234: chain[index] = 0;
235: hashtab[index] = -1L;
236: }
237:
238:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.