1: #include <stdio.h> 2: #include "1.incl.h" 3: #include "1.defs.h" 4: #include "def.h" 5: 6: 7: act(k,c,bufptr) 8: int k,bufptr; 9: char c; 10: { 11: long ftemp; 12: struct lablist *makelab(); 13: switch(k) 14: /*handle labels */ 15: {case 1: 16: if (c != ' ') 17: { 18: ftemp = c - '0'; 19: newlab->labelt = 10L * newlab->labelt + ftemp; 20: 21: if (newlab->labelt > 99999L) 22: { 23: error("in syntax:\n","",""); 24: fprintf(stderr,"line %d: label beginning %D too long\n%s\n", 25: begline,newlab->labelt,buffer); 26: fprintf(stderr,"treating line as straight line code\n"); 27: return(ABORT); 28: } 29: } 30: break; 31: 32: case 3: nlabs++; 33: newlab = newlab->nxtlab = makelab(0L); 34: break; 35: 36: /* handle labsw- switches and labels */ 37: /* handle if statements */ 38: case 30: counter++; break; 39: 40: case 31: 41: counter--; 42: if (counter) return(_if1); 43: else 44: { 45: pred = remtilda(stralloc(&buffer[p1],bufptr - p1)); 46: p3 = bufptr + 1; /* p3 pts. to 1st symbol after ) */ 47: flag = 1; 48: return(_if2); } 49: 50: case 45: /* set p1 to pt.to 1st symbol of pred */ 51: p1 = bufptr + 1; 52: act(30,c,bufptr); break; 53: 54: /* handle do loops */ 55: case 61: p1 = bufptr; break; /* p1 pts. to 1st symbol of increment string */ 56: 57: case 62: counter ++; break; 58: 59: case 63: counter --; break; 60: 61: case 64: 62: if (counter != 0) break; 63: act(162,c,bufptr); 64: return(ABORT); 65: 66: case 70: if (counter) return(_rwp); 67: r1 = bufptr; 68: return(_rwlab); 69: 70: case 72: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); break; 71: 72: case 73: endlab = newlab; 73: break; 74: 75: case 74: errlab = newlab; 76: break; 77: 78: case 75: reflab = newlab; 79: act(3,c,bufptr); 80: break; 81: 82: case 76: r1 = bufptr; break; 83: 84: case 77: 85: if (!counter) 86: { 87: act(111,c,bufptr); 88: return(ABORT); 89: } 90: counter--; 91: break; 92: /* generate nodes of all types */ 93: case 111: /* st. line code */ 94: stcode = remtilda(stralloc(&buffer[p3],endbuf - p3)); 95: recognize(STLNVX,flag); 96: return(ABORT); 97: 98: case 122: /* uncond. goto */ 99: recognize(ungo,flag); 100: break; 101: 102: case 123: /* assigned goto */ 103: act(72,c,bufptr); 104: faterr("in parsing:\n","assigned goto must have list of labels",""); 105: 106: case 124: /* ass. goto, labels */ 107: recognize(ASGOVX, flag); 108: break; 109: 110: case 125: /* computed goto*/ 111: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); 112: recognize(COMPVX, flag); 113: return(ABORT); 114: 115: case 133: /* if() = is a simple statement, so reset flag to 0 */ 116: flag = 0; 117: act(111,c,bufptr); 118: return(ABORT); 119: 120: case 141: /* arith. if */ 121: recognize(arithif, 0); 122: break; 123: 124: case 150: /* label assignment */ 125: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); 126: recognize(ASVX, flag); 127: break; 128: 129: case 162: /* do node */ 130: inc = remtilda(stralloc(&buffer[p1],endbuf - p1)); 131: recognize(DOVX, 0); 132: break; 133: 134: case 180: /* continue statement */ 135: recognize(contst, 0); 136: break; 137: 138: case 200: /* function or subroutine statement */ 139: progtype = sub; 140: nameline = begline; 141: recognize(STLNVX,0); 142: break; 143: 144: 145: case 210: /* block data statement */ 146: progtype = blockdata; 147: act(111,c,bufptr); 148: return(ABORT); 149: 150: case 300: /* return statement */ 151: recognize(RETVX,flag); 152: break; 153: 154: 155: case 350: /* stop statement */ 156: recognize(STOPVX, flag); 157: break; 158: 159: 160: case 400: /* end statement */ 161: if (progtype == sub) 162: act(300, c, bufptr); 163: else 164: act(350, c, bufptr); 165: return(endrt); 166: 167: case 500: 168: prerw = remtilda(stralloc(&buffer[p3],r1 - p3 + 1)); 169: postrw = remtilda(stralloc(&buffer[r2],endbuf - r2)); 170: if (reflab || endlab || errlab) recognize(IOVX,flag); 171: else recognize(STLNVX,flag); 172: return(ABORT); 173: 174: case 510: r2 = bufptr; 175: act(3,c,bufptr); 176: act(500,c,bufptr); 177: return(ABORT); 178: 179: case 520: r2 = bufptr; 180: reflab = newlab; 181: act(3,c,bufptr); 182: act(500,c,bufptr); 183: return(ABORT); 184: 185: 186: case 600: 187: recognize(FMTVX,0); return(ABORT); 188: 189: case 700: 190: stcode = remtilda(stralloc(&buffer[p3],endbuf - p3)); 191: recognize(entry,0); return(ABORT); 192: /* error */ 193: case 999: 194: fprintf(stderr,"error: symbol '%c' should not occur as %d'th symbol of: \n%s\n", 195: c,bufptr, buffer); 196: return(ABORT); 197: } 198: return(nulls); 199: } 200: 201: 202: 203: struct lablist *makelab(x) 204: long x; 205: { 206: struct lablist *p; 207: p = challoc (sizeof(*p)); 208: p->labelt = x; 209: p->nxtlab = 0; 210: return(p); 211: } 212: 213: 214: long label(i) 215: int i; 216: { 217: struct lablist *j; 218: for (j = linelabs; i > 0; i--) 219: { 220: if (j == 0) return(0L); 221: j = j->nxtlab; 222: } 223: if (j) 224: return(j->labelt); 225: else 226: return(0L); 227: } 228: 229: 230: freelabs() 231: { 232: struct lablist *j,*k; 233: j = linelabs; 234: while(j != 0) 235: { 236: k = j->nxtlab; 237: chfree(j,sizeof(*j)); 238: j = k; 239: } 240: } 241: 242: 243: stralloc(ad,n) /* allocate space, copy n chars from address ad, add '0' */ 244: int n; char *ad; 245: { 246: char *cp; 247: cp = galloc(n+1); 248: copycs(ad,cp,n); 249: return(cp); 250: } 251: 252: 253: remtilda(s) /* change ~ to blank */ 254: char *s; 255: { 256: int i; 257: for (i = 0; s[i] != '\0'; i++) 258: if (s[i] == '~') s[i] = ' '; 259: return(s); 260: }