Annotation of 43BSDTahoe/usr.bin/lex/sub1.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)sub1.c     4.4 (Berkeley) 1/12/88";
                      3: #endif
                      4: 
                      5: # include "ldefs.c"
                      6: char *
                      7: getl(p)        /* return next line of input, throw away trailing '\n' */
                      8:        /* returns 0 if eof is had immediately */
                      9:   char *p;
                     10:        {
                     11:        register int c;
                     12:        register char *s, *t;
                     13:        t = s = p;
                     14:        while(((c = gch()) != 0) && c != '\n')
                     15:                *t++ = c;
                     16:        *t = 0;
                     17:        if(c == 0 && s == t) return(0);
                     18:        prev = '\n';
                     19:        pres = '\n';
                     20:        return(s);
                     21:        }
                     22: space(ch)
                     23:        {
                     24:        switch(ch)
                     25:                {
                     26:                case ' ':
                     27:                case '\t':
                     28:                case '\n':
                     29:                        return(1);
                     30:                }
                     31:        return(0);
                     32:        }
                     33: 
                     34: digit(c)
                     35: {
                     36:        return(c>='0' && c <= '9');
                     37: }
                     38: error(s,p,d)
                     39:        {
                     40:        fprintf(errorf,"\"%s\", line %d: (Error) ",
                     41:                fptr > 0 ? sargv[fptr] : "<stdin>", yyline);
                     42:        fprintf(errorf,s,p,d);
                     43:        putc('\n',errorf);
                     44: # ifdef DEBUG
                     45:        if(debug && sect != ENDSECTION) {
                     46:                sect1dump();
                     47:                sect2dump();
                     48:        }
                     49: # endif
                     50:        if(
                     51: # ifdef DEBUG
                     52:                debug ||
                     53: # endif
                     54:                report == 1) statistics();
                     55:        exit(1);        /* error return code */
                     56:        }
                     57: 
                     58: warning(s,p,d)
                     59:        {
                     60:        fprintf(errorf,"\"%s\", line %d: (Warning) ",
                     61:                fptr > 0 ? sargv[fptr] : "<stdin>", yyline);
                     62:        fprintf(errorf,s,p,d);
                     63:        putc('\n',errorf);
                     64:        fflush(errorf);
                     65:        fflush(fout);
                     66:        fflush(stdout);
                     67:        }
                     68: index(a,s)
                     69:        char *s;
                     70: {
                     71:        register int k;
                     72:        for(k=0; s[k]; k++)
                     73:                if (s[k]== a)
                     74:                        return(k);
                     75:        return(-1);
                     76:        }
                     77: 
                     78: alpha(c)
                     79:   int c; {
                     80: # ifdef ASCII
                     81: return('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z');
                     82: # endif
                     83: # ifdef EBCDIC
                     84: return(index(c,"abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") >= 0);
                     85: # endif
                     86: }
                     87: printable(c)
                     88: {
                     89: # ifdef ASCII
                     90: return( c>040 && c < 0177);
                     91: # endif
                     92: # ifdef EBCDIC
                     93: return(index(c, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:><+*)('&%!-=\"")>=0);
                     94: # endif
                     95: }
                     96: lgate()
                     97: {
                     98:        char fname[20];
                     99:        if (lgatflg) return;
                    100:        lgatflg=1;
                    101:        if(fout == NULL){
                    102:                sprintf(fname, "lex.yy.%c", ratfor ? 'r' : 'c' );
                    103:                fout = fopen(fname, "w");
                    104:                }
                    105:        if(fout == NULL) error("Can't open %s",fname);
                    106:        if(ratfor) fprintf( fout, "#\n");
                    107:        phead1();
                    108:        }
                    109: /* scopy(ptr to str, ptr to str) - copy first arg str to second */
                    110: /* returns ptr to second arg */
                    111: scopy(s,t)
                    112:   char *s, *t; {
                    113:        register char *i;
                    114:        i = t;
                    115:        while(*i++ = *s++);
                    116:        return;
                    117:        }
                    118: siconv(t)      /* convert string t, return integer value */
                    119:   char *t; {
                    120:        register int i,sw;
                    121:        register char *s;
                    122:        s = t;
                    123:        while(!(('0' <= *s && *s <= '9') || *s == '-') && *s) s++;
                    124:        sw = 0;
                    125:        if(*s == '-'){  /* neg */
                    126:                sw = 1;
                    127:                s++;
                    128:                }
                    129:        i = 0;
                    130:        while('0' <= *s && *s <= '9')
                    131:                i = i * 10 + (*(s++)-'0');
                    132:        return(sw ? -i : i);
                    133:        }
                    134: /* slength(ptr to str) - return integer length of string arg */
                    135: /* excludes '\0' terminator */
                    136: slength(s)
                    137:   char *s; {
                    138:        register int n;
                    139:        register char *t;
                    140:        t = s;
                    141:        for (n = 0; *t++; n++);
                    142:        return(n);
                    143:        }
                    144: /* scomp(x,y) - return -1 if x < y,
                    145:                0 if x == y,
                    146:                return 1 if x > y, all lexicographically */
                    147: scomp(x,y)
                    148:   char *x,*y; {
                    149:        register char *a,*d;
                    150:        a = x;
                    151:        d = y;
                    152:        while(*a || *d){
                    153:                if(*a > *d)
                    154:                        return(1);      /* greater */
                    155:                if(*a < *d)
                    156:                        return(-1);     /* less */
                    157:                a++;
                    158:                d++;
                    159:                }
                    160:        return(0);      /* equal */
                    161:        }
                    162: ctrans(ss)
                    163:        char **ss;
                    164: {
                    165:        register int c, k;
                    166:        if ((c = **ss) != '\\')
                    167:                return(c);
                    168:        switch(c= *++*ss)
                    169:        {
                    170:        case 'n': c = '\n'; break;
                    171:        case 't': c = '\t'; break;
                    172:        case 'r': c = '\r'; break;
                    173:        case 'b': c = '\b'; break;
                    174:        case 'f': c = 014; break;               /* form feed for ascii */
                    175:        case '\\': c = '\\'; break;
                    176:        case '0': case '1': case '2': case '3':
                    177:        case '4': case '5': case '6': case '7':
                    178:                c -= '0';
                    179:                while ((k = *(*ss+1)) >= '0' && k <= '7')
                    180:                        {
                    181:                        c = c*8 + k - '0';
                    182:                        (*ss)++;
                    183:                        }
                    184:                break;
                    185:        }
                    186:        return(c);
                    187: }
                    188: cclinter(sw)
                    189:   int sw; {
                    190:                /* sw = 1 ==> ccl */
                    191:        register int i, j, k;
                    192:        int m;
                    193:        if(!sw){                /* is NCCL */
                    194:                for(i=1;i<NCH;i++)
                    195:                        symbol[i] ^= 1;                 /* reverse value */
                    196:                }
                    197:        for(i=1;i<NCH;i++)
                    198:                if(symbol[i]) break;
                    199:        if(i >= NCH) return;
                    200:        i = cindex[i];
                    201:        /* see if ccl is already in our table */
                    202:        j = 0;
                    203:        if(i){
                    204:                for(j=1;j<NCH;j++){
                    205:                        if((symbol[j] && cindex[j] != i) ||
                    206:                           (!symbol[j] && cindex[j] == i)) break;
                    207:                        }
                    208:                }
                    209:        if(j >= NCH) return;            /* already in */
                    210:        m = 0;
                    211:        k = 0;
                    212:        for(i=1;i<NCH;i++)
                    213:                if(symbol[i]){
                    214:                        if(!cindex[i]){
                    215:                                cindex[i] = ccount;
                    216:                                symbol[i] = 0;
                    217:                                m = 1;
                    218:                                }
                    219:                        else k = 1;
                    220:                        }
                    221:                        /* m == 1 implies last value of ccount has been used */
                    222:        if(m)ccount++;
                    223:        if(k == 0) return;      /* is now in as ccount wholly */
                    224:        /* intersection must be computed */
                    225:        for(i=1;i<NCH;i++){
                    226:                if(symbol[i]){
                    227:                        m = 0;
                    228:                        j = cindex[i];  /* will be non-zero */
                    229:                        for(k=1;k<NCH;k++){
                    230:                                if(cindex[k] == j){
                    231:                                        if(symbol[k]) symbol[k] = 0;
                    232:                                        else {
                    233:                                                cindex[k] = ccount;
                    234:                                                m = 1;
                    235:                                                }
                    236:                                        }
                    237:                                }
                    238:                        if(m)ccount++;
                    239:                        }
                    240:                }
                    241:        return;
                    242:        }
                    243: usescape(c)
                    244:   int c; {
                    245:        register char d;
                    246:        switch(c){
                    247:        case 'n': c = '\n'; break;
                    248:        case 'r': c = '\r'; break;
                    249:        case 't': c = '\t'; break;
                    250:        case 'b': c = '\b'; break;
                    251:        case 'f': c = 014; break;               /* form feed for ascii */
                    252:        case '0': case '1': case '2': case '3':
                    253:        case '4': case '5': case '6': case '7':
                    254:                c -= '0';
                    255:                while('0' <= (d=gch()) && d <= '7'){
                    256:                        c = c * 8 + (d-'0');
                    257:                        if(!('0' <= peek && peek <= '7')) break;
                    258:                        }
                    259:                break;
                    260:        }
                    261:        return(c);
                    262:        }
                    263: lookup(s,t)
                    264:   char *s;
                    265:   char **t; {
                    266:        register int i;
                    267:        i = 0;
                    268:        while(*t){
                    269:                if(scomp(s,*t) == 0)
                    270:                        return(i);
                    271:                i++;
                    272:                t++;
                    273:                }
                    274:        return(-1);
                    275:        }
                    276: cpyact(){ /* copy C action to the next ; or closing } */
                    277:        register int brac, c, mth;
                    278:        int savline, sw;
                    279: 
                    280:        brac = 0;
                    281:        sw = TRUE;
                    282: 
                    283: while(!eof){
                    284:        c = gch();
                    285: swt:
                    286:        switch( c ){
                    287: 
                    288: case '|':      if(brac == 0 && sw == TRUE){
                    289:                        if(peek == '|')gch();           /* eat up an extra '|' */
                    290:                        return(0);
                    291:                        }
                    292:                break;
                    293: 
                    294: case ';':
                    295:                if( brac == 0 ){
                    296:                        putc(c,fout);
                    297:                        putc('\n',fout);
                    298:                        return(1);
                    299:                        }
                    300:                break;
                    301: 
                    302: case '{':
                    303:                brac++;
                    304:                savline=yyline;
                    305:                break;
                    306: 
                    307: case '}':
                    308:                brac--;
                    309:                if( brac == 0 ){
                    310:                        putc(c,fout);
                    311:                        putc('\n',fout);
                    312:                        return(1);
                    313:                        }
                    314:                break;
                    315: 
                    316: case '/':      /* look for comments */
                    317:                putc(c,fout);
                    318:                c = gch();
                    319:                if( c != '*' ) goto swt;
                    320: 
                    321:                /* it really is a comment */
                    322: 
                    323:                putc(c,fout);
                    324:                savline=yyline;
                    325:                while( c=gch() ){
                    326:                        if( c=='*' ){
                    327:                                putc(c,fout);
                    328:                                if( (c=gch()) == '/' ) goto loop;
                    329:                                }
                    330:                        putc(c,fout);
                    331:                        }
                    332:                yyline=savline;
                    333:                error( "EOF inside comment" );
                    334: 
                    335: case '\'':     /* character constant */
                    336:                mth = '\'';
                    337:                goto string;
                    338: 
                    339: case '"':      /* character string */
                    340:                mth = '"';
                    341: 
                    342:        string:
                    343: 
                    344:                putc(c,fout);
                    345:                while( c=gch() ){
                    346:                        if( c=='\\' ){
                    347:                                putc(c,fout);
                    348:                                c=gch();
                    349:                                }
                    350:                        else if( c==mth ) goto loop;
                    351:                        putc(c,fout);
                    352:                        if (c == '\n')
                    353:                                {
                    354:                                yyline--;
                    355:                                error( "Non-terminated string or character constant");
                    356:                                }
                    357:                        }
                    358:                error( "EOF in string or character constant" );
                    359: 
                    360: case '\0':
                    361:                yyline = savline;
                    362:                error("Action does not terminate");
                    363: default:
                    364:                break;          /* usual character */
                    365:                }
                    366: loop:
                    367:        if(c != ' ' && c != '\t' && c != '\n') sw = FALSE;
                    368:        putc(c,fout);
                    369:        }
                    370: error("Premature EOF");
                    371: }
                    372: gch(){
                    373:        register int c;
                    374:        static int hadeof;
                    375: 
                    376:        if (hadeof) {
                    377:                hadeof = 0;
                    378:                yyline = 0;
                    379:        }
                    380:        prev = pres;
                    381:        c = pres = peek;
                    382:        peek = pushptr > pushc ? *--pushptr : getc(fin);
                    383:        if(peek == EOF && sargc > 1){
                    384:                hadeof = 1;
                    385:                fclose(fin);
                    386:                fin = fopen(sargv[++fptr],"r");
                    387:                if(fin == NULL) {
                    388:                        yyline = 0;
                    389:                        error("Cannot open file %s",sargv[fptr]);
                    390:                }
                    391:                peek = getc(fin);
                    392:                sargc--;
                    393:                }
                    394:        if(c == EOF) {
                    395:                eof = TRUE;
                    396:                fclose(fin);
                    397:                return(0);
                    398:                }
                    399:        if(c == '\n')yyline++;
                    400:        return(c);
                    401:        }
                    402: mn2(a,d,c)
                    403:   int a,d,c;
                    404:        {
                    405:        name[tptr] = a;
                    406:        left[tptr] = d;
                    407:        right[tptr] = c;
                    408:        parent[tptr] = 0;
                    409:        nullstr[tptr] = 0;
                    410:        switch(a){
                    411:        case RSTR:
                    412:                parent[d] = tptr;
                    413:                break;
                    414:        case BAR:
                    415:        case RNEWE:
                    416:                if(nullstr[d] || nullstr[c]) nullstr[tptr] = TRUE;
                    417:                parent[d] = parent[c] = tptr;
                    418:                break;
                    419:        case RCAT:
                    420:        case DIV:
                    421:                if(nullstr[d] && nullstr[c])nullstr[tptr] = TRUE;
                    422:                parent[d] = parent[c] = tptr;
                    423:                break;
                    424:        case RSCON:
                    425:                parent[d] = tptr;
                    426:                nullstr[tptr] = nullstr[d];
                    427:                break;
                    428: # ifdef DEBUG
                    429:        default:
                    430:                warning("bad switch mn2 %d %d",a,d);
                    431:                break;
                    432: # endif
                    433:                }
                    434:        if(tptr > treesize)
                    435:                error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":""));
                    436:        return(tptr++);
                    437:        }
                    438: mn1(a,d)
                    439:   int a,d;
                    440:        {
                    441:        name[tptr] = a;
                    442:        left[tptr] = d;
                    443:        parent[tptr] = 0;
                    444:        nullstr[tptr] = 0;
                    445:        switch(a){
                    446:        case RCCL:
                    447:        case RNCCL:
                    448:                if(slength(d) == 0) nullstr[tptr] = TRUE;
                    449:                break;
                    450:        case STAR:
                    451:        case QUEST:
                    452:                nullstr[tptr] = TRUE;
                    453:                parent[d] = tptr;
                    454:                break;
                    455:        case PLUS:
                    456:        case CARAT:
                    457:                nullstr[tptr] = nullstr[d];
                    458:                parent[d] = tptr;
                    459:                break;
                    460:        case S2FINAL:
                    461:                nullstr[tptr] = TRUE;
                    462:                break;
                    463: # ifdef DEBUG
                    464:        case FINAL:
                    465:        case S1FINAL:
                    466:                break;
                    467:        default:
                    468:                warning("bad switch mn1 %d %d",a,d);
                    469:                break;
                    470: # endif
                    471:                }
                    472:        if(tptr > treesize)
                    473:                error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":""));
                    474:        return(tptr++);
                    475:        }
                    476: mn0(a)
                    477:   int a;
                    478:        {
                    479:        name[tptr] = a;
                    480:        parent[tptr] = 0;
                    481:        nullstr[tptr] = 0;
                    482:        if(a >= NCH) switch(a){
                    483:        case RNULLS: nullstr[tptr] = TRUE; break;
                    484: # ifdef DEBUG
                    485:        default:
                    486:                warning("bad switch mn0 %d",a);
                    487:                break;
                    488: # endif
                    489:        }
                    490:        if(tptr > treesize)
                    491:                error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":""));
                    492:        return(tptr++);
                    493:        }
                    494: munput(t,p)    /* implementation dependent */
                    495:   char *p;
                    496:   int t; {
                    497:        register int i,j;
                    498:        if(t == 'c'){
                    499:                *pushptr++ = peek;              /* watch out for this */
                    500:                peek = (int)p;
                    501:                }
                    502:        else if(t == 's'){
                    503:                *pushptr++ = peek;
                    504:                peek = p[0];
                    505:                i = slength(p);
                    506:                for(j = i-1; j>=1; j--)
                    507:                        *pushptr++ = p[j];
                    508:                }
                    509: # ifdef DEBUG
                    510:        else error("Unrecognized munput option %c",t);
                    511: # endif
                    512:        if(pushptr >= pushc+TOKENSIZE)
                    513:                error("Too many characters pushed");
                    514:        return;
                    515:        }
                    516: 
                    517: dupl(n)
                    518:   int n; {
                    519:        /* duplicate the subtree whose root is n, return ptr to it */
                    520:        register int i;
                    521:        i = name[n];
                    522:        if(i < NCH) return(mn0(i));
                    523:        switch(i){
                    524:        case RNULLS:
                    525:                return(mn0(i));
                    526:        case RCCL: case RNCCL: case FINAL: case S1FINAL: case S2FINAL:
                    527:                return(mn1(i,left[n]));
                    528:        case STAR: case QUEST: case PLUS: case CARAT:
                    529:                return(mn1(i,dupl(left[n])));
                    530:        case RSTR: case RSCON:
                    531:                return(mn2(i,dupl(left[n]),right[n]));
                    532:        case BAR: case RNEWE: case RCAT: case DIV:
                    533:                return(mn2(i,dupl(left[n]),dupl(right[n])));
                    534: # ifdef DEBUG
                    535:        default:
                    536:                warning("bad switch dupl %d",n);
                    537: # endif
                    538:        }
                    539:        return(0);
                    540:        }
                    541: # ifdef DEBUG
                    542: allprint(c)
                    543:   char c; {
                    544:        switch(c){
                    545:                case 014:
                    546:                        printf("\\f");
                    547:                        charc++;
                    548:                        break;
                    549:                case '\n':
                    550:                        printf("\\n");
                    551:                        charc++;
                    552:                        break;
                    553:                case '\t':
                    554:                        printf("\\t");
                    555:                        charc++;
                    556:                        break;
                    557:                case '\b':
                    558:                        printf("\\b");
                    559:                        charc++;
                    560:                        break;
                    561:                case ' ':
                    562:                        printf("\\\bb");
                    563:                        break;
                    564:                default:
                    565:                        if(!printable(c)){
                    566:                                printf("\\%-3o",c);
                    567:                                charc += 3;
                    568:                                }
                    569:                        else 
                    570:                                putchar(c);
                    571:                        break;
                    572:                }
                    573:        charc++;
                    574:        return;
                    575:        }
                    576: strpt(s)
                    577:   char *s; {
                    578:        charc = 0;
                    579:        while(*s){
                    580:                allprint(*s++);
                    581:                if(charc > LINESIZE){
                    582:                        charc = 0;
                    583:                        printf("\n\t");
                    584:                        }
                    585:                }
                    586:        return;
                    587:        }
                    588: sect1dump(){
                    589:        register int i;
                    590:        printf("Sect 1:\n");
                    591:        if(def[0]){
                    592:                printf("str     trans\n");
                    593:                i = -1;
                    594:                while(def[++i])
                    595:                        printf("%s\t%s\n",def[i],subs[i]);
                    596:                }
                    597:        if(sname[0]){
                    598:                printf("start names\n");
                    599:                i = -1;
                    600:                while(sname[++i])
                    601:                        printf("%s\n",sname[i]);
                    602:                }
                    603:        if(chset == TRUE){
                    604:                printf("char set changed\n");
                    605:                for(i=1;i<NCH;i++){
                    606:                        if(i != ctable[i]){
                    607:                                allprint(i);
                    608:                                putchar(' ');
                    609:                                printable(ctable[i]) ? putchar(ctable[i]) : printf("%d",ctable[i]);
                    610:                                putchar('\n');
                    611:                                }
                    612:                        }
                    613:                }
                    614:        }
                    615: sect2dump(){
                    616:        printf("Sect 2:\n");
                    617:        treedump();
                    618:        }
                    619: treedump()
                    620:        {
                    621:        register int t;
                    622:        register char *p;
                    623:        printf("treedump %d nodes:\n",tptr);
                    624:        for(t=0;t<tptr;t++){
                    625:                printf("%4d ",t);
                    626:                parent[t] ? printf("p=%4d",parent[t]) : printf("      ");
                    627:                printf("  ");
                    628:                if(name[t] < NCH) {
                    629:                                allprint(name[t]);
                    630:                                }
                    631:                else switch(name[t]){
                    632:                        case RSTR:
                    633:                                printf("%d ",left[t]);
                    634:                                allprint(right[t]);
                    635:                                break;
                    636:                        case RCCL:
                    637:                                printf("ccl ");
                    638:                                strpt(left[t]);
                    639:                                break;
                    640:                        case RNCCL:
                    641:                                printf("nccl ");
                    642:                                strpt(left[t]);
                    643:                                break;
                    644:                        case DIV:
                    645:                                printf("/ %d %d",left[t],right[t]);
                    646:                                break;
                    647:                        case BAR:
                    648:                                printf("| %d %d",left[t],right[t]);
                    649:                                break;
                    650:                        case RCAT:
                    651:                                printf("cat %d %d",left[t],right[t]);
                    652:                                break;
                    653:                        case PLUS:
                    654:                                printf("+ %d",left[t]);
                    655:                                break;
                    656:                        case STAR:
                    657:                                printf("* %d",left[t]);
                    658:                                break;
                    659:                        case CARAT:
                    660:                                printf("^ %d",left[t]);
                    661:                                break;
                    662:                        case QUEST:
                    663:                                printf("? %d",left[t]);
                    664:                                break;
                    665:                        case RNULLS:
                    666:                                printf("nullstring");
                    667:                                break;
                    668:                        case FINAL:
                    669:                                printf("final %d",left[t]);
                    670:                                break;
                    671:                        case S1FINAL:
                    672:                                printf("s1final %d",left[t]);   
                    673:                                break;
                    674:                        case S2FINAL:
                    675:                                printf("s2final %d",left[t]);
                    676:                                break;
                    677:                        case RNEWE:
                    678:                                printf("new %d %d",left[t],right[t]);
                    679:                                break;
                    680:                        case RSCON:
                    681:                                p = right[t];
                    682:                                printf("start %s",sname[*p++-1]);
                    683:                                while(*p)
                    684:                                        printf(", %s",sname[*p++-1]);
                    685:                                printf(" %d",left[t]);
                    686:                                break;
                    687:                        default:
                    688:                                printf("unknown %d %d %d",name[t],left[t],right[t]);
                    689:                                break;
                    690:                        }
                    691:                if(nullstr[t])printf("\t(null poss.)");
                    692:                putchar('\n');
                    693:                }
                    694:        }
                    695: # endif

unix.superglobalmegacorp.com

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