Annotation of 43BSD/usr.bin/lex/parser.y, revision 1.1.1.1

1.1       root        1: %token CHAR CCL NCCL STR DELIM SCON ITER NEWE NULLS
                      2: %left SCON '/' NEWE
                      3: %left '|'
                      4: %left '$' '^'
                      5: %left CHAR CCL NCCL '(' '.' STR NULLS
                      6: %left ITER
                      7: %left CAT
                      8: %left '*' '+' '?'
                      9: 
                     10: %{
                     11: #ifndef lint
                     12: static char sccsid[] = "@(#)parser.y   4.1 (Berkeley) 8/11/83";
                     13: #endif
                     14: 
                     15: # include "ldefs.c"
                     16: %}
                     17: %%
                     18: %{
                     19: int i;
                     20: int j,k;
                     21: int g;
                     22: char *p;
                     23: %}
                     24: acc    :       lexinput
                     25:        ={      
                     26: # ifdef DEBUG
                     27:                if(debug) sect2dump();
                     28: # endif
                     29:        }
                     30:        ;
                     31: lexinput:      defns delim prods end
                     32:        |       defns delim end
                     33:        ={
                     34:                if(!funcflag)phead2();
                     35:                funcflag = TRUE;
                     36:        }
                     37:        | error
                     38:        ={
                     39: # ifdef DEBUG
                     40:                if(debug) {
                     41:                        sect1dump();
                     42:                        sect2dump();
                     43:                        }
                     44: # endif
                     45:                }
                     46:        ;
                     47: end:           delim | ;
                     48: defns: defns STR STR
                     49:        ={      scopy($2,dp);
                     50:                def[dptr] = dp;
                     51:                dp += slength($2) + 1;
                     52:                scopy($3,dp);
                     53:                subs[dptr++] = dp;
                     54:                if(dptr >= DEFSIZE)
                     55:                        error("Too many definitions");
                     56:                dp += slength($3) + 1;
                     57:                if(dp >= dchar+DEFCHAR)
                     58:                        error("Definitions too long");
                     59:                subs[dptr]=def[dptr]=0; /* for lookup - require ending null */
                     60:        }
                     61:        |
                     62:        ;
                     63: delim: DELIM
                     64:        ={
                     65: # ifdef DEBUG
                     66:                if(sect == DEFSECTION && debug) sect1dump();
                     67: # endif
                     68:                sect++;
                     69:                }
                     70:        ;
                     71: prods: prods pr
                     72:        ={      $$ = mn2(RNEWE,$1,$2);
                     73:                }
                     74:        |       pr
                     75:        ={      $$ = $1;}
                     76:        ;
                     77: pr:    r NEWE
                     78:        ={
                     79:                if(divflg == TRUE)
                     80:                        i = mn1(S1FINAL,casecount);
                     81:                else i = mn1(FINAL,casecount);
                     82:                $$ = mn2(RCAT,$1,i);
                     83:                divflg = FALSE;
                     84:                casecount++;
                     85:                }
                     86:        | error NEWE
                     87:        ={
                     88: # ifdef DEBUG
                     89:                if(debug) sect2dump();
                     90: # endif
                     91:                }
                     92: r:     CHAR
                     93:        ={      $$ = mn0($1); }
                     94:        | STR
                     95:        ={
                     96:                p = $1;
                     97:                i = mn0(*p++);
                     98:                while(*p)
                     99:                        i = mn2(RSTR,i,*p++);
                    100:                $$ = i;
                    101:                }
                    102:        | '.'
                    103:        ={      symbol['\n'] = 0;
                    104:                if(psave == FALSE){
                    105:                        p = ccptr;
                    106:                        psave = ccptr;
                    107:                        for(i=1;i<'\n';i++){
                    108:                                symbol[i] = 1;
                    109:                                *ccptr++ = i;
                    110:                                }
                    111:                        for(i='\n'+1;i<NCH;i++){
                    112:                                symbol[i] = 1;
                    113:                                *ccptr++ = i;
                    114:                                }
                    115:                        *ccptr++ = 0;
                    116:                        if(ccptr > ccl+CCLSIZE)
                    117:                                error("Too many large character classes");
                    118:                        }
                    119:                else
                    120:                        p = psave;
                    121:                $$ = mn1(RCCL,p);
                    122:                cclinter(1);
                    123:                }
                    124:        | CCL
                    125:        ={      $$ = mn1(RCCL,$1); }
                    126:        | NCCL
                    127:        ={      $$ = mn1(RNCCL,$1); }
                    128:        | r '*'
                    129:        ={      $$ = mn1(STAR,$1); }
                    130:        | r '+'
                    131:        ={      $$ = mn1(PLUS,$1); }
                    132:        | r '?'
                    133:        ={      $$ = mn1(QUEST,$1); }
                    134:        | r '|' r
                    135:        ={      $$ = mn2(BAR,$1,$3); }
                    136:        | r r %prec CAT
                    137:        ={      $$ = mn2(RCAT,$1,$2); }
                    138:        | r '/' r
                    139:        ={      if(!divflg){
                    140:                        j = mn1(S2FINAL,-casecount);
                    141:                        i = mn2(RCAT,$1,j);
                    142:                        $$ = mn2(DIV,i,$3);
                    143:                        }
                    144:                else {
                    145:                        $$ = mn2(RCAT,$1,$3);
                    146:                        warning("Extra slash removed");
                    147:                        }
                    148:                divflg = TRUE;
                    149:                }
                    150:        | r ITER ',' ITER '}'
                    151:        ={      if($2 > $4){
                    152:                        i = $2;
                    153:                        $2 = $4;
                    154:                        $4 = i;
                    155:                        }
                    156:                if($4 <= 0)
                    157:                        warning("Iteration range must be positive");
                    158:                else {
                    159:                        j = $1;
                    160:                        for(k = 2; k<=$2;k++)
                    161:                                j = mn2(RCAT,j,dupl($1));
                    162:                        for(i = $2+1; i<=$4; i++){
                    163:                                g = dupl($1);
                    164:                                for(k=2;k<=i;k++)
                    165:                                        g = mn2(RCAT,g,dupl($1));
                    166:                                j = mn2(BAR,j,g);
                    167:                                }
                    168:                        $$ = j;
                    169:                        }
                    170:        }
                    171:        | r ITER '}'
                    172:        ={
                    173:                if($2 < 0)warning("Can't have negative iteration");
                    174:                else if($2 == 0) $$ = mn0(RNULLS);
                    175:                else {
                    176:                        j = $1;
                    177:                        for(k=2;k<=$2;k++)
                    178:                                j = mn2(RCAT,j,dupl($1));
                    179:                        $$ = j;
                    180:                        }
                    181:                }
                    182:        | r ITER ',' '}'
                    183:        ={
                    184:                                /* from n to infinity */
                    185:                if($2 < 0)warning("Can't have negative iteration");
                    186:                else if($2 == 0) $$ = mn1(STAR,$1);
                    187:                else if($2 == 1)$$ = mn1(PLUS,$1);
                    188:                else {          /* >= 2 iterations minimum */
                    189:                        j = $1;
                    190:                        for(k=2;k<$2;k++)
                    191:                                j = mn2(RCAT,j,dupl($1));
                    192:                        k = mn1(PLUS,dupl($1));
                    193:                        $$ = mn2(RCAT,j,k);
                    194:                        }
                    195:                }
                    196:        | SCON r
                    197:        ={      $$ = mn2(RSCON,$2,$1); }
                    198:        | '^' r
                    199:        ={      $$ = mn1(CARAT,$2); }
                    200:        | r '$'
                    201:        ={      i = mn0('\n');
                    202:                if(!divflg){
                    203:                        j = mn1(S2FINAL,-casecount);
                    204:                        k = mn2(RCAT,$1,j);
                    205:                        $$ = mn2(DIV,k,i);
                    206:                        }
                    207:                else $$ = mn2(RCAT,$1,i);
                    208:                divflg = TRUE;
                    209:                }
                    210:        | '(' r ')'
                    211:        ={      $$ = $2; }
                    212:        |       NULLS
                    213:        ={      $$ = mn0(RNULLS); }
                    214:        ;
                    215: %%
                    216: yylex(){
                    217:        register char *p;
                    218:        register int c, i;
                    219:        char  *t, *xp;
                    220:        int n, j, k, x;
                    221:        static int sectbegin;
                    222:        static char token[TOKENSIZE];
                    223:        static int iter;
                    224: 
                    225: # ifdef DEBUG
                    226:        yylval = 0;
                    227: # endif
                    228: 
                    229:        if(sect == DEFSECTION) {                /* definitions section */
                    230:                while(!eof) {
                    231:                        if(prev == '\n'){               /* next char is at beginning of line */
                    232:                                getl(p=buf);
                    233:                                switch(*p){
                    234:                                case '%':
                    235:                                        switch(c= *(p+1)){
                    236:                                        case '%':
                    237:                                                lgate();
                    238:                                                if(!ratfor)fprintf(fout,"# ");
                    239:                                                fprintf(fout,"define YYNEWLINE %d\n",ctable['\n']);
                    240:                                                if(!ratfor)fprintf(fout,"yylex(){\nint nstr; extern int yyprevious;\n");
                    241:                                                sectbegin = TRUE;
                    242:                                                i = treesize*(sizeof(*name)+sizeof(*left)+
                    243:                                                        sizeof(*right)+sizeof(*nullstr)+sizeof(*parent))+ALITTLEEXTRA;
                    244:                                                c = myalloc(i,1);
                    245:                                                if(c == 0)
                    246:                                                        error("Too little core for parse tree");
                    247:                                                p = c;
                    248:                                                cfree(p,i,1);
                    249:                                                name = myalloc(treesize,sizeof(*name));
                    250:                                                left = myalloc(treesize,sizeof(*left));
                    251:                                                right = myalloc(treesize,sizeof(*right));
                    252:                                                nullstr = myalloc(treesize,sizeof(*nullstr));
                    253:                                                parent = myalloc(treesize,sizeof(*parent));
                    254:                                                if(name == 0 || left == 0 || right == 0 || parent == 0 || nullstr == 0)
                    255:                                                        error("Too little core for parse tree");
                    256:                                                return(freturn(DELIM));
                    257:                                        case 'p': case 'P':     /* has overridden number of positions */
                    258:                                                while(*p && !digit(*p))p++;
                    259:                                                maxpos = siconv(p);
                    260: # ifdef DEBUG
                    261:                                                if (debug) printf("positions (%%p) now %d\n",maxpos);
                    262: # endif
                    263:                                                if(report == 2)report = 1;
                    264:                                                continue;
                    265:                                        case 'n': case 'N':     /* has overridden number of states */
                    266:                                                while(*p && !digit(*p))p++;
                    267:                                                nstates = siconv(p);
                    268: # ifdef DEBUG
                    269:                                                if(debug)printf( " no. states (%%n) now %d\n",nstates);
                    270: # endif
                    271:                                                if(report == 2)report = 1;
                    272:                                                continue;
                    273:                                        case 'e': case 'E':             /* has overridden number of tree nodes */
                    274:                                                while(*p && !digit(*p))p++;
                    275:                                                treesize = siconv(p);
                    276: # ifdef DEBUG
                    277:                                                if (debug) printf("treesize (%%e) now %d\n",treesize);
                    278: # endif
                    279:                                                if(report == 2)report = 1;
                    280:                                                continue;
                    281:                                        case 'o': case 'O':
                    282:                                                while (*p && !digit(*p))p++;
                    283:                                                outsize = siconv(p);
                    284:                                                if (report ==2) report=1;
                    285:                                                continue;
                    286:                                        case 'a': case 'A':             /* has overridden number of transitions */
                    287:                                                while(*p && !digit(*p))p++;
                    288:                                                if(report == 2)report = 1;
                    289:                                                ntrans = siconv(p);
                    290: # ifdef DEBUG
                    291:                                                if (debug)printf("N. trans (%%a) now %d\n",ntrans);
                    292: # endif
                    293:                                                continue;
                    294:                                        case 'k': case 'K': /* overriden packed char classes */
                    295:                                                while (*p && !digit(*p))p++;
                    296:                                                if (report==2) report=1;
                    297:                                                cfree(pchar, pchlen, sizeof(*pchar));
                    298:                                                pchlen = siconv(p);
                    299: # ifdef DEBUG
                    300:                                                if (debug) printf( "Size classes (%%k) now %d\n",pchlen);
                    301: # endif
                    302:                                                pchar=pcptr=myalloc(pchlen, sizeof(*pchar));
                    303:                                                continue;
                    304:                                        case 't': case 'T':     /* character set specifier */
                    305:                                                ZCH = atoi(p+2);
                    306:                                                if (ZCH < NCH) ZCH = NCH;
                    307:                                                if (ZCH > 2*NCH) error("ch table needs redeclaration");
                    308:                                                chset = TRUE;
                    309:                                                for(i = 0; i<ZCH; i++)
                    310:                                                        ctable[i] = 0;
                    311:                                                while(getl(p) && scomp(p,"%T") != 0 && scomp(p,"%t") != 0){
                    312:                                                        if((n = siconv(p)) <= 0 || n > ZCH){
                    313:                                                                warning("Character value %d out of range",n);
                    314:                                                                continue;
                    315:                                                                }
                    316:                                                        while(!space(*p) && *p) p++;
                    317:                                                        while(space(*p)) p++;
                    318:                                                        t = p;
                    319:                                                        while(*t){
                    320:                                                                c = ctrans(&t);
                    321:                                                                if(ctable[c]){
                    322:                                                                        if (printable(c))
                    323:                                                                                warning("Character '%c' used twice",c);
                    324:                                                                        else
                    325:                                                                                warning("Character %o used twice",c);
                    326:                                                                        }
                    327:                                                                else ctable[c] = n;
                    328:                                                                t++;
                    329:                                                                }
                    330:                                                        p = buf;
                    331:                                                        }
                    332:                                                {
                    333:                                                char chused[2*NCH]; int kr;
                    334:                                                for(i=0; i<ZCH; i++)
                    335:                                                        chused[i]=0;
                    336:                                                for(i=0; i<NCH; i++)
                    337:                                                        chused[ctable[i]]=1;
                    338:                                                for(kr=i=1; i<NCH; i++)
                    339:                                                        if (ctable[i]==0)
                    340:                                                                {
                    341:                                                                while (chused[kr] == 0)
                    342:                                                                        kr++;
                    343:                                                                ctable[i]=kr;
                    344:                                                                chused[kr]=1;
                    345:                                                                }
                    346:                                                }
                    347:                                                lgate();
                    348:                                                continue;
                    349:                                        case 'r': case 'R':
                    350:                                                c = 'r';
                    351:                                        case 'c': case 'C':
                    352:                                                if(lgatflg)
                    353:                                                        error("Too late for language specifier");
                    354:                                                ratfor = (c == 'r');
                    355:                                                continue;
                    356:                                        case '{':
                    357:                                                lgate();
                    358:                                                while(getl(p) && scomp(p,"%}") != 0)
                    359:                                                        fprintf(fout, "%s\n",p);
                    360:                                                if(p[0] == '%') continue;
                    361:                                                error("Premature eof");
                    362:                                        case 's': case 'S':             /* start conditions */
                    363:                                                lgate();
                    364:                                                while(*p && index(*p," \t,") < 0) p++;
                    365:                                                n = TRUE;
                    366:                                                while(n){
                    367:                                                        while(*p && index(*p," \t,") >= 0) p++;
                    368:                                                        t = p;
                    369:                                                        while(*p && index(*p," \t,") < 0)p++;
                    370:                                                        if(!*p) n = FALSE;
                    371:                                                        *p++ = 0;
                    372:                                                        if (*t == 0) continue;
                    373:                                                        i = sptr*2;
                    374:                                                        if(!ratfor)fprintf(fout,"# ");
                    375:                                                        fprintf(fout,"define %s %d\n",t,i);
                    376:                                                        scopy(t,sp);
                    377:                                                        sname[sptr++] = sp;
                    378:                                                        sname[sptr] = 0;        /* required by lookup */
                    379:                                                        if(sptr >= STARTSIZE)
                    380:                                                                error("Too many start conditions");
                    381:                                                        sp += slength(sp) + 1;
                    382:                                                        if(sp >= schar+STARTCHAR)
                    383:                                                                error("Start conditions too long");
                    384:                                                        }
                    385:                                                continue;
                    386:                                        default:
                    387:                                                warning("Invalid request %s",p);
                    388:                                                continue;
                    389:                                                }       /* end of switch after seeing '%' */
                    390:                                case ' ': case '\t':            /* must be code */
                    391:                                        lgate();
                    392:                                        fprintf(fout, "%s\n",p);
                    393:                                        continue;
                    394:                                default:                /* definition */
                    395:                                        while(*p && !space(*p)) p++;
                    396:                                        if(*p == 0)
                    397:                                                continue;
                    398:                                        prev = *p;
                    399:                                        *p = 0;
                    400:                                        bptr = p+1;
                    401:                                        yylval = buf;
                    402:                                        if(digit(buf[0]))
                    403:                                                warning("Substitution strings may not begin with digits");
                    404:                                        return(freturn(STR));
                    405:                                        }
                    406:                                }
                    407:                        /* still sect 1, but prev != '\n' */
                    408:                        else {
                    409:                                p = bptr;
                    410:                                while(*p && space(*p)) p++;
                    411:                                if(*p == 0)
                    412:                                        warning("No translation given - null string assumed");
                    413:                                scopy(p,token);
                    414:                                yylval = token;
                    415:                                prev = '\n';
                    416:                                return(freturn(STR));
                    417:                                }
                    418:                        }
                    419:                /* end of section one processing */
                    420:                }
                    421:        else if(sect == RULESECTION){           /* rules and actions */
                    422:                while(!eof){
                    423:                        switch(c=gch()){
                    424:                        case '\0':
                    425:                                return(freturn(0));
                    426:                        case '\n':
                    427:                                if(prev == '\n') continue;
                    428:                                x = NEWE;
                    429:                                break;
                    430:                        case ' ':
                    431:                        case '\t':
                    432:                                if(sectbegin == TRUE){
                    433:                                        cpyact();
                    434:                                        while((c=gch()) && c != '\n');
                    435:                                        continue;
                    436:                                        }
                    437:                                if(!funcflag)phead2();
                    438:                                funcflag = TRUE;
                    439:                                if(ratfor)fprintf(fout,"%d\n",30000+casecount);
                    440:                                else fprintf(fout,"case %d:\n",casecount);
                    441:                                if(cpyact()){
                    442:                                        if(ratfor)fprintf(fout,"goto 30997\n");
                    443:                                        else fprintf(fout,"break;\n");
                    444:                                        }
                    445:                                while((c=gch()) && c != '\n');
                    446:                                if(peek == ' ' || peek == '\t' || sectbegin == TRUE){
                    447:                                        warning("Executable statements should occur right after %%");
                    448:                                        continue;
                    449:                                        }
                    450:                                x = NEWE;
                    451:                                break;
                    452:                        case '%':
                    453:                                if(prev != '\n') goto character;
                    454:                                if(peek == '{'){        /* included code */
                    455:                                        getl(buf);
                    456:                                        while(!eof && getl(buf) && scomp("%}",buf) != 0)
                    457:                                                fprintf(fout,"%s\n",buf);
                    458:                                        continue;
                    459:                                        }
                    460:                                if(peek == '%'){
                    461:                                        c = gch();
                    462:                                        c = gch();
                    463:                                        x = DELIM;
                    464:                                        break;
                    465:                                        }
                    466:                                goto character;
                    467:                        case '|':
                    468:                                if(peek == ' ' || peek == '\t' || peek == '\n'){
                    469:                                        if(ratfor)fprintf(fout,"%d\n",30000+casecount++);
                    470:                                        else fprintf(fout,"case %d:\n",casecount++);
                    471:                                        continue;
                    472:                                        }
                    473:                                x = '|';
                    474:                                break;
                    475:                        case '$':
                    476:                                if(peek == '\n' || peek == ' ' || peek == '\t' || peek == '|' || peek == '/'){
                    477:                                        x = c;
                    478:                                        break;
                    479:                                        }
                    480:                                goto character;
                    481:                        case '^':
                    482:                                if(prev != '\n' && scon != TRUE) goto character;        /* valid only at line begin */
                    483:                                x = c;
                    484:                                break;
                    485:                        case '?':
                    486:                        case '+':
                    487:                        case '.':
                    488:                        case '*':
                    489:                        case '(':
                    490:                        case ')':
                    491:                        case ',':
                    492:                        case '/':
                    493:                                x = c;
                    494:                                break;
                    495:                        case '}':
                    496:                                iter = FALSE;
                    497:                                x = c;
                    498:                                break;
                    499:                        case '{':       /* either iteration or definition */
                    500:                                if(digit(c=gch())){     /* iteration */
                    501:                                        iter = TRUE;
                    502:                                ieval:
                    503:                                        i = 0;
                    504:                                        while(digit(c)){
                    505:                                                token[i++] = c;
                    506:                                                c = gch();
                    507:                                                }
                    508:                                        token[i] = 0;
                    509:                                        yylval = siconv(token);
                    510:                                        munput('c',c);
                    511:                                        x = ITER;
                    512:                                        break;
                    513:                                        }
                    514:                                else {          /* definition */
                    515:                                        i = 0;
                    516:                                        while(c && c!='}'){
                    517:                                                token[i++] = c;
                    518:                                                c = gch();
                    519:                                                }
                    520:                                        token[i] = 0;
                    521:                                        i = lookup(token,def);
                    522:                                        if(i < 0)
                    523:                                                warning("Definition %s not found",token);
                    524:                                        else
                    525:                                                munput('s',subs[i]);
                    526:                                        continue;
                    527:                                        }
                    528:                        case '<':               /* start condition ? */
                    529:                                if(prev != '\n')                /* not at line begin, not start */
                    530:                                        goto character;
                    531:                                t = slptr;
                    532:                                do {
                    533:                                        i = 0;
                    534:                                        c = gch();
                    535:                                        while(c != ',' && c && c != '>'){
                    536:                                                token[i++] = c;
                    537:                                                c = gch();
                    538:                                                }
                    539:                                        token[i] = 0;
                    540:                                        if(i == 0)
                    541:                                                goto character;
                    542:                                        i = lookup(token,sname);
                    543:                                        if(i < 0) {
                    544:                                                warning("Undefined start condition %s",token);
                    545:                                                continue;
                    546:                                                }
                    547:                                        *slptr++ = i+1;
                    548:                                        } while(c && c != '>');
                    549:                                *slptr++ = 0;
                    550:                                /* check if previous value re-usable */
                    551:                                for (xp=slist; xp<t; )
                    552:                                        {
                    553:                                        if (strcmp(xp, t)==0)
                    554:                                                break;
                    555:                                        while (*xp++);
                    556:                                        }
                    557:                                if (xp<t)
                    558:                                        {
                    559:                                        /* re-use previous pointer to string */
                    560:                                        slptr=t;
                    561:                                        t=xp;
                    562:                                        }
                    563:                                if(slptr > slist+STARTSIZE)             /* note not packed ! */
                    564:                                        error("Too many start conditions used");
                    565:                                yylval = t;
                    566:                                x = SCON;
                    567:                                break;
                    568:                        case '"':
                    569:                                i = 0;
                    570:                                while((c=gch()) && c != '"' && c != '\n'){
                    571:                                        if(c == '\\') c = usescape(c=gch());
                    572:                                        token[i++] = c;
                    573:                                        if(i > TOKENSIZE){
                    574:                                                warning("String too long");
                    575:                                                i = TOKENSIZE-1;
                    576:                                                break;
                    577:                                                }
                    578:                                        }
                    579:                                if(c == '\n') {
                    580:                                        yyline--;
                    581:                                        warning("Non-terminated string");
                    582:                                        yyline++;
                    583:                                        }
                    584:                                token[i] = 0;
                    585:                                if(i == 0)x = NULLS;
                    586:                                else if(i == 1){
                    587:                                        yylval = token[0];
                    588:                                        x = CHAR;
                    589:                                        }
                    590:                                else {
                    591:                                        yylval = token;
                    592:                                        x = STR;
                    593:                                        }
                    594:                                break;
                    595:                        case '[':
                    596:                                for(i=1;i<NCH;i++) symbol[i] = 0;
                    597:                                x = CCL;
                    598:                                if((c = gch()) == '^'){
                    599:                                        x = NCCL;
                    600:                                        c = gch();
                    601:                                        }
                    602:                                while(c != ']' && c){
                    603:                                        if(c == '\\') c = usescape(c=gch());
                    604:                                        symbol[c] = 1;
                    605:                                        j = c;
                    606:                                        if((c=gch()) == '-' && peek != ']'){            /* range specified */
                    607:                                                c = gch();
                    608:                                                if(c == '\\') c = usescape(c=gch());
                    609:                                                k = c;
                    610:                                                if(j > k) {
                    611:                                                        n = j;
                    612:                                                        j = k;
                    613:                                                        k = n;
                    614:                                                        }
                    615:                                                if(!(('A' <= j && k <= 'Z') ||
                    616:                                                     ('a' <= j && k <= 'z') ||
                    617:                                                     ('0' <= j && k <= '9')))
                    618:                                                        warning("Non-portable Character Class");
                    619:                                                for(n=j+1;n<=k;n++)
                    620:                                                        symbol[n] = 1;          /* implementation dependent */
                    621:                                                c = gch();
                    622:                                                }
                    623:                                        }
                    624:                                /* try to pack ccl's */
                    625:                                i = 0;
                    626:                                for(j=0;j<NCH;j++)
                    627:                                        if(symbol[j])token[i++] = j;
                    628:                                token[i] = 0;
                    629:                                p = ccptr;
                    630:                                if(optim){
                    631:                                        p = ccl;
                    632:                                        while(p <ccptr && scomp(token,p) != 0)p++;
                    633:                                        }
                    634:                                if(p < ccptr)   /* found it */
                    635:                                        yylval = p;
                    636:                                else {
                    637:                                        yylval = ccptr;
                    638:                                        scopy(token,ccptr);
                    639:                                        ccptr += slength(token) + 1;
                    640:                                        if(ccptr >= ccl+CCLSIZE)
                    641:                                                error("Too many large character classes");
                    642:                                        }
                    643:                                cclinter(x==CCL);
                    644:                                break;
                    645:                        case '\\':
                    646:                                c = usescape(c=gch());
                    647:                        default:
                    648:                        character:
                    649:                                if(iter){       /* second part of an iteration */
                    650:                                        iter = FALSE;
                    651:                                        if('0' <= c && c <= '9')
                    652:                                                goto ieval;
                    653:                                        }
                    654:                                if(alpha(peek)){
                    655:                                        i = 0;
                    656:                                        yylval = token;
                    657:                                        token[i++] = c;
                    658:                                        while(alpha(peek))
                    659:                                                token[i++] = gch();
                    660:                                        if(peek == '?' || peek == '*' || peek == '+')
                    661:                                                munput('c',token[--i]);
                    662:                                        token[i] = 0;
                    663:                                        if(i == 1){
                    664:                                                yylval = token[0];
                    665:                                                x = CHAR;
                    666:                                                }
                    667:                                        else x = STR;
                    668:                                        }
                    669:                                else {
                    670:                                        yylval = c;
                    671:                                        x = CHAR;
                    672:                                        }
                    673:                                }
                    674:                        scon = FALSE;
                    675:                        if(x == SCON)scon = TRUE;
                    676:                        sectbegin = FALSE;
                    677:                        return(freturn(x));
                    678:                        }
                    679:                }
                    680:        /* section three */
                    681:        ptail();
                    682: # ifdef DEBUG
                    683:        if(debug)
                    684:                fprintf(fout,"\n/*this comes from section three - debug */\n");
                    685: # endif
                    686:        while(getl(buf) && !eof)
                    687:                fprintf(fout,"%s\n",buf);
                    688:        return(freturn(0));
                    689:        }
                    690: /* end of yylex */
                    691: # ifdef DEBUG
                    692: freturn(i)
                    693:   int i; {
                    694:        if(yydebug) {
                    695:                printf("now return ");
                    696:                if(i < NCH) allprint(i);
                    697:                else printf("%d",i);
                    698:                printf("   yylval = ");
                    699:                switch(i){
                    700:                        case STR: case CCL: case NCCL:
                    701:                                strpt(yylval);
                    702:                                break;
                    703:                        case CHAR:
                    704:                                allprint(yylval);
                    705:                                break;
                    706:                        default:
                    707:                                printf("%d",yylval);
                    708:                                break;
                    709:                        }
                    710:                putchar('\n');
                    711:                }
                    712:        return(i);
                    713:        }
                    714: # endif

unix.superglobalmegacorp.com

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