|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)yylex.c 5.1 (Berkeley) 6/5/85"; ! 9: #endif not lint ! 10: ! 11: #include "whoami.h" ! 12: #include "0.h" ! 13: #include "tree_ty.h" /* must be included for yy.h */ ! 14: #include "yy.h" ! 15: ! 16: /* ! 17: * Scanner ! 18: */ ! 19: int yylacnt; ! 20: ! 21: #define YYLASIZ 10 ! 22: ! 23: struct yytok Yla[YYLASIZ]; ! 24: ! 25: unyylex(y) ! 26: struct yytok *y; ! 27: { ! 28: ! 29: if (yylacnt == YYLASIZ) ! 30: panic("unyylex"); ! 31: copy((char *) &Yla[yylacnt], (char *) y, sizeof Yla[0]); ! 32: yylacnt++; ! 33: ! 34: } ! 35: ! 36: yylex() ! 37: { ! 38: register c; ! 39: register int **ip; ! 40: register char *cp; ! 41: int f; ! 42: char delim; ! 43: ! 44: if (yylacnt != 0) { ! 45: yylacnt--; ! 46: copy((char *) &Y, (char *) &Yla[yylacnt], sizeof Y); ! 47: return (yychar); ! 48: } ! 49: if (c = yysavc) ! 50: yysavc = 0; ! 51: else ! 52: c = readch(); ! 53: #ifdef PXP ! 54: yytokcnt++; ! 55: #endif ! 56: ! 57: next: ! 58: /* ! 59: * skip white space ! 60: */ ! 61: #ifdef PXP ! 62: yywhcnt = 0; ! 63: #endif ! 64: while (c == ' ' || c == '\t') { ! 65: #ifdef PXP ! 66: if (c == '\t') ! 67: yywhcnt++; ! 68: yywhcnt++; ! 69: #endif ! 70: c = readch(); ! 71: } ! 72: yyecol = yycol; ! 73: yyeline = yyline; ! 74: yyefile = filename; ! 75: yyeseqid = yyseqid; ! 76: yyseekp = yylinpt; ! 77: cp = token; ! 78: yylval = yyline; ! 79: switch (c) { ! 80: case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': ! 81: case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': ! 82: case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': ! 83: case 'v': case 'w': case 'x': case 'y': case 'z': ! 84: case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': ! 85: case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': ! 86: case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': ! 87: case 'V': case 'W': case 'X': case 'Y': case 'Z': ! 88: do { ! 89: *cp++ = c; ! 90: c = readch(); ! 91: } while (alph(c) || digit(c)); ! 92: *cp = 0; ! 93: if (opt('s')) ! 94: for (cp = token; *cp; cp++) ! 95: if (*cp >= 'A' && *cp <= 'Z') { ! 96: *cp |= ' '; ! 97: } ! 98: yysavc = c; ! 99: ip = (int **) hash((char *) 0, 1); ! 100: if (*ip < (int *) yykey || *ip >= (int *) lastkey) { ! 101: yylval = (int) *ip; ! 102: return (YID); ! 103: } ! 104: yylval = yyline; ! 105: /* ! 106: * For keywords ! 107: * the lexical token ! 108: * is magically retrieved ! 109: * from the keyword table. ! 110: */ ! 111: return ((*ip)[1]); ! 112: case '0': case '1': case '2': case '3': case '4': ! 113: case '5': case '6': case '7': case '8': case '9': ! 114: f = 0; ! 115: do { ! 116: *cp++ = c; ! 117: c = readch(); ! 118: } while (digit(c)); ! 119: if (c == 'b' || c == 'B') { ! 120: /* ! 121: * nonstandard - octal constants ! 122: */ ! 123: if (opt('s')) { ! 124: standard(); ! 125: yerror("Octal constants are non-standard"); ! 126: } ! 127: *cp = 0; ! 128: yylval = copystr(token); ! 129: return (YBINT); ! 130: } ! 131: if (c == '.') { ! 132: c = readch(); ! 133: if (c == '.') { ! 134: *cp = 0; ! 135: yysavc = YDOTDOT; ! 136: yylval = copystr(token); ! 137: return (YINT); ! 138: } ! 139: infpnumb: ! 140: f++; ! 141: *cp++ = '.'; ! 142: if (!digit(c)) { ! 143: yyset(); ! 144: recovered(); ! 145: yerror("Digits required after decimal point"); ! 146: *cp++ = '0'; ! 147: } else ! 148: while (digit(c)) { ! 149: *cp++ = c; ! 150: c = readch(); ! 151: } ! 152: } ! 153: if (c == 'e' || c == 'E') { ! 154: f++; ! 155: *cp++ = c; ! 156: if ((c = yysavc) == 0) ! 157: c = readch(); ! 158: if (c == '+' || c == '-') { ! 159: *cp++ = c; ! 160: c = readch(); ! 161: } ! 162: if (!digit(c)) { ! 163: yyset(); ! 164: yerror("Digits required in exponent"); ! 165: *cp++ = '0'; ! 166: } else ! 167: while (digit(c)) { ! 168: *cp++ = c; ! 169: c = readch(); ! 170: } ! 171: } ! 172: *cp = 0; ! 173: yysavc = c; ! 174: yylval = copystr(token); ! 175: if (f) ! 176: return (YNUMB); ! 177: return (YINT); ! 178: case '"': ! 179: case '`': ! 180: case '#': ! 181: if (!any(bufp + 1, c)) ! 182: goto illch; ! 183: if (!dquote) { ! 184: recovered(); ! 185: dquote++; ! 186: yerror("Character/string delimiter is '"); ! 187: } ! 188: case '\'': ! 189: delim = c; ! 190: do { ! 191: do { ! 192: c = readch(); ! 193: if (c == '\n') { ! 194: yerror("Unmatched %c for string", (char *) delim); ! 195: if (cp == token) ! 196: *cp++ = ' ', cp++; ! 197: break; ! 198: } ! 199: *cp++ = c; ! 200: } while (c != delim); ! 201: c = readch(); ! 202: } while (c == delim); ! 203: *--cp = 0; ! 204: if (cp == token) { ! 205: yerror("Null string not allowed"); ! 206: *cp++ = ' '; ! 207: *cp++ = 0; ! 208: } ! 209: yysavc = c; ! 210: yylval = copystr(token); ! 211: return (YSTRING); ! 212: case '.': ! 213: c = readch(); ! 214: if (c == '.') ! 215: return (YDOTDOT); ! 216: if (digit(c)) { ! 217: recovered(); ! 218: yerror("Digits required before decimal point"); ! 219: *cp++ = '0'; ! 220: goto infpnumb; ! 221: } ! 222: yysavc = c; ! 223: return ('.'); ! 224: case '{': ! 225: /* ! 226: * { ... } comment ! 227: */ ! 228: #ifdef PXP ! 229: getcm(c); ! 230: #endif ! 231: #ifdef PI ! 232: c = options(); ! 233: while (c != '}') { ! 234: if (c <= 0) ! 235: goto nonterm; ! 236: if (c == '{') { ! 237: warning(); ! 238: yyset(); ! 239: yerror("{ in a { ... } comment"); ! 240: } ! 241: c = readch(); ! 242: } ! 243: #endif ! 244: c = readch(); ! 245: goto next; ! 246: case '(': ! 247: if ((c = readch()) == '*') { ! 248: /* ! 249: * (* ... *) comment ! 250: */ ! 251: #ifdef PXP ! 252: getcm(c); ! 253: c = readch(); ! 254: goto next; ! 255: #endif ! 256: #ifdef PI ! 257: c = options(); ! 258: for (;;) { ! 259: if (c < 0) { ! 260: nonterm: ! 261: yerror("Comment does not terminate - QUIT"); ! 262: pexit(ERRS); ! 263: } ! 264: if (c == '(' && (c = readch()) == '*') { ! 265: warning(); ! 266: yyset(); ! 267: yerror("(* in a (* ... *) comment"); ! 268: } ! 269: if (c == '*') { ! 270: if ((c = readch()) != ')') ! 271: continue; ! 272: c = readch(); ! 273: goto next; ! 274: } ! 275: c = readch(); ! 276: } ! 277: #endif ! 278: } ! 279: yysavc = c; ! 280: c = '('; ! 281: case ';': ! 282: case ',': ! 283: case ':': ! 284: case '=': ! 285: case '*': ! 286: case '+': ! 287: case '/': ! 288: case '-': ! 289: case ')': ! 290: case '[': ! 291: case ']': ! 292: case '<': ! 293: case '>': ! 294: case '^': ! 295: return (c); ! 296: case '~': ! 297: case '|': ! 298: case '&': ! 299: if ( opt('s') ) { ! 300: yyset(); ! 301: standard(); ! 302: yerror("%c is non-standard", (char *) c); ! 303: } ! 304: return c; ! 305: default: ! 306: switch (c) { ! 307: case YDOTDOT: ! 308: return (c); ! 309: case '\n': ! 310: c = readch(); ! 311: #ifdef PXP ! 312: yytokcnt++; ! 313: #endif ! 314: goto next; ! 315: case '\f': ! 316: c = readch(); ! 317: goto next; ! 318: } ! 319: if (c <= 0) ! 320: return (YEOF); ! 321: illch: ! 322: do ! 323: yysavc = readch(); ! 324: while (yysavc == c); ! 325: yylval = c; ! 326: return (YILLCH); ! 327: } ! 328: } ! 329: ! 330: yyset() ! 331: { ! 332: ! 333: yyecol = yycol; ! 334: yyeline = yyline; ! 335: yyefile = filename; ! 336: yyseekp = yylinpt; ! 337: } ! 338: ! 339: /* ! 340: * Setuflg trims the current ! 341: * input line to at most 72 chars ! 342: * for the u option. ! 343: */ ! 344: setuflg() ! 345: { ! 346: ! 347: if (charbuf[71] != '\n') { ! 348: charbuf[72] = '\n'; ! 349: charbuf[73] = 0; ! 350: } ! 351: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.