Annotation of researchv9/cmd/lex/sub1.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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