|
|
1.1 ! root 1: #define lv yylval ! 2: #define v yyval ! 3: ! 4: ! 5: yylex() ! 6: { ! 7: register c; ! 8: register struct tab *tp; ! 9: extern TERMtype; ! 10: ! 11: if(nlexsym != -1) { ! 12: if (TERMtype == 1) dofix(); /* convert iline */ ! 13: c = nlexsym; ! 14: nlexsym = -1; ! 15: return(c); ! 16: ! 17: } ! 18: while(litflag > 0) { ! 19: if (TERMtype == 0)c = (int)*iline++; ! 20: else c = asciich(); ! 21: if(c == '\n') { ! 22: nlexsym = 0; ! 23: return(eol); ! 24: } ! 25: } ! 26: do ! 27: if (TERMtype == 0)c = (int)*iline++; ! 28: else c = asciich(); ! 29: while(c == ' '); ! 30: if(c == '\n') { ! 31: nlexsym = 0; ! 32: return(eol); ! 33: } ! 34: if(alpha(c)) ! 35: return(getnam(c)); ! 36: if(digit(c) || c == '@' || ! 37: (c=='.' && digit(*iline))) ! 38: return(getnum(c)); ! 39: c &= 0377; ! 40: for(tp = tab; tp->input; tp++) ! 41: if(tp->input == c) { ! 42: lv = tp->lexval; ! 43: return(tp->retval); ! 44: } ! 45: return(unk); ! 46: } ! 47: ! 48: getnam(ic) ! 49: { ! 50: char name[NAMS]; ! 51: register c; ! 52: register char *cp; ! 53: register struct nlist *np; ! 54: ! 55: cp = name; ! 56: do { ! 57: *cp++ = c; ! 58: if (TERMtype == 0)c = (int)*iline++; ! 59: else c = asciich(); ! 60: } while(alpha(c) || digit(c)); ! 61: *cp++ = 0; ! 62: iline--; ! 63: if(litflag < 0) { /* commands */ ! 64: litflag = 0; ! 65: for(c=0; comtab[c]; c+=3) ! 66: if(equal(name, comtab[c])) ! 67: break; ! 68: lv = comtab[c+2]; ! 69: return(comtab[c+1]); ! 70: } ! 71: if(a_label(name)){ ! 72: return(numb); ! 73: } ! 74: for(np=nlist; np->namep; np++) ! 75: if(equal(np->namep, name)) { ! 76: lv = np; ! 77: switch(np->use) { ! 78: ! 79: case NF: ! 80: return(nfun); ! 81: ! 82: case MF: ! 83: return(mfun); ! 84: ! 85: case DF: ! 86: return(dfun); ! 87: } ! 88: return(nam); ! 89: } ! 90: np->namep = alloc(cp-name); ! 91: copy(CH, name, np->namep, cp-name); ! 92: np->type = LV; ! 93: lv = np; ! 94: return(nam); ! 95: } ! 96: ! 97: a_label(x) ! 98: register char *x; ! 99: { ! 100: register struct lablist *lblthru; ! 101: ! 102: lblthru = labldefs.nextll; ! 103: while(lblthru) { ! 104: if(equal(lblthru->lname,x)) { ! 105: datum = (double) lblthru->lno; ! 106: return(1); ! 107: } ! 108: lblthru = lblthru->nextll; ! 109: } ! 110: return(0); ! 111: } ! 112: ! 113: getnum(ic) ! 114: { ! 115: double d1, d2; ! 116: register c, n, n1; ! 117: int s, s1; ! 118: ! 119: s = 0; ! 120: n = 0; ! 121: d1 = 0.; ! 122: c = ic; ! 123: if(c == '@') { ! 124: s++; ! 125: if (TERMtype == 0)c = (int)*iline++; ! 126: else c = asciich(); ! 127: } ! 128: while(digit(c)) { ! 129: d1 = d1*10. + c - '0'; ! 130: if (TERMtype == 0)c = (int)*iline++; ! 131: else c = asciich(); ! 132: } ! 133: if(c == '.') { ! 134: if (TERMtype == 0)c = (int)*iline++; ! 135: else c = asciich(); ! 136: while(digit(c)) { ! 137: d1 = d1*10. + c - '0'; ! 138: if (TERMtype == 0)c = (int)*iline++; ! 139: else c = asciich(); ! 140: n--; ! 141: } ! 142: } ! 143: if(c == 'e') { ! 144: s1 = 0; ! 145: n1 = 0; ! 146: if (TERMtype == 0)c = (int)*iline++; ! 147: else c = asciich(); ! 148: if(c == '@') { ! 149: s1++; ! 150: if (TERMtype == 0)c = (int)*iline++; ! 151: else c = asciich(); ! 152: } ! 153: while(digit(c)) { ! 154: n1 = n1*10 + c - '0'; ! 155: if (TERMtype == 0)c = (int)*iline++; ! 156: else c = asciich(); ! 157: } ! 158: if(s1) ! 159: n -= n1; else ! 160: n += n1; ! 161: } ! 162: n1 = n; ! 163: if(n1 < 0) ! 164: n1 = -n1; ! 165: d2 = 1.; ! 166: while(n1--) ! 167: d2 *= 10.; ! 168: if(n < 0) ! 169: d1 /= d2; else ! 170: d1 *= d2; ! 171: if(s) ! 172: d1 = -d1; ! 173: iline--; ! 174: datum = d1; ! 175: return(numb); ! 176: } ! 177: ! 178: alpha(s) ! 179: { ! 180: register c; ! 181: ! 182: c = s & 0377; ! 183: if(c >= 'a' && c <= 'z') ! 184: return(1); ! 185: if(c == 'H') ! 186: return(1); ! 187: if(c == 'F') ! 188: return(1); ! 189: if(c >= 0220 && c<=0252) ! 190: return(1); ! 191: return(0); ! 192: } ! 193: ! 194: digit(s) ! 195: { ! 196: register c; ! 197: ! 198: c = s; ! 199: if(c >='0' && c <= '9') ! 200: return(1); ! 201: return(0); ! 202: } ! 203: ! 204: /* ! 205: * s is statement ! 206: * f is execution flag: ! 207: * 0 compile immediate ! 208: * 1 compile L ! 209: * 2 function definition ! 210: * 3 function prolog ! 211: * 4 function epilog ! 212: * 5 function body ! 213: */ ! 214: int ilex[] ! 215: { ! 216: lex0, lex1, lex2, lex3, lex4, lex5, lex6 ! 217: }; ! 218: compile(s, f) ! 219: { ! 220: register char *p, *q; ! 221: char oline[OBJS]; ! 222: ! 223: iline = s; ! 224: ccharp = oline; ! 225: litflag = 0; ! 226: nlexsym = ilex[f]; ! 227: context = nlexsym; ! 228: if(yyparse()) { ! 229: pline(s, iline-s); ! 230: return(0); ! 231: } ! 232: *ccharp++ = EOF; ! 233: p = alloc(ccharp-oline); ! 234: iline = p; ! 235: for(q=oline; q<ccharp;) ! 236: *p++ = *q++; ! 237: return(iline); ! 238: } ! 239: ! 240: yyerror() ! 241: { ! 242: } ! 243: ! 244: name(np, c2) ! 245: { ! 246: register char *p; ! 247: ! 248: p = ccharp; ! 249: *ccharp++ = c2; ! 250: *ccharp++ = np.c[0]; ! 251: *ccharp++ = np.c[1]; ! 252: *ccharp++ = np.c[2]; ! 253: *ccharp++ = np.c[3]; ! 254: return(p); ! 255: } ! 256: ! 257: equal(a, b) ! 258: char *a, *b; ! 259: { ! 260: register char *c1, *c2; ! 261: ! 262: c1 = a; ! 263: c2 = b; ! 264: while(*c1++ == *c2) ! 265: if(*c2++ == 0) ! 266: return(1); ! 267: return(0); ! 268: } ! 269: ! 270: invert(a, b) ! 271: { ! 272: ! 273: flop(a, b); ! 274: flop(b, ccharp); ! 275: flop(a, ccharp); ! 276: } ! 277: ! 278: flop(a, b) ! 279: char *a, *b; ! 280: { ! 281: register char *a1, *a2; ! 282: register c; ! 283: ! 284: a1 = a; ! 285: a2 = b; ! 286: while(a1 < a2) { ! 287: c = *a1; ! 288: *a1++ = *--a2; ! 289: *a2 = c; ! 290: } ! 291: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.