Annotation of 40BSD/cmd/pi/yylex.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.