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