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