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

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

unix.superglobalmegacorp.com

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