Annotation of 42BSD/bin/make/gram.y, revision 1.1.1.1

1.1       root        1: %{#include "defs"
                      2: static char *sccsid = "@(#)gram.y      4.1 (Berkeley) 81/02/28";
                      3: %}
                      4: 
                      5: %term NAME SHELLINE START MACRODEF COLON DOUBLECOLON GREATER
                      6: %union
                      7:        {
                      8:        struct shblock *yshblock;
                      9:        struct depblock *ydepblock;
                     10:        struct nameblock *ynameblock;
                     11:        }
                     12: 
                     13: %type <yshblock> SHELLINE, shlist, shellist
                     14: %type <ynameblock> NAME, namelist
                     15: %type <ydepblock> deplist, dlist
                     16: 
                     17: 
                     18: %%
                     19: 
                     20: %{
                     21: struct depblock *pp;
                     22: FSTATIC struct shblock *prevshp;
                     23: 
                     24: FSTATIC struct nameblock *lefts[NLEFTS];
                     25: struct nameblock *leftp;
                     26: FSTATIC int nlefts;
                     27: 
                     28: struct lineblock *lp, *lpp;
                     29: FSTATIC struct depblock *prevdep;
                     30: FSTATIC int sepc;
                     31: %}
                     32: 
                     33: 
                     34: file:
                     35:        | file comline
                     36:        ;
                     37: 
                     38: comline:  START
                     39:        | MACRODEF
                     40:        | START namelist deplist shellist = {
                     41:            while( --nlefts >= 0)
                     42:                {
                     43:                leftp = lefts[nlefts];
                     44:                if(leftp->septype == 0)
                     45:                        leftp->septype = sepc;
                     46:                else if(leftp->septype != sepc)
                     47:                        fprintf(stderr, "Inconsistent rules lines for `%s'\n",
                     48:                                leftp->namep);
                     49:                else if(sepc==ALLDEPS && *(leftp->namep)!='.' && $4!=0)
                     50:                        {
                     51:                        for(lp=leftp->linep; lp->nxtlineblock!=0; lp=lp->nxtlineblock)
                     52:                            if(lp->shp)
                     53:                                fprintf(stderr, "Multiple rules lines for `%s'\n",
                     54:                                    leftp->namep);
                     55:                        }
                     56: 
                     57:                lp = ALLOC(lineblock);
                     58:                lp->nxtlineblock = NULL;
                     59:                lp->depp = $3;
                     60:                lp->shp = $4;
                     61: 
                     62:                if(! unequal(leftp->namep, ".SUFFIXES") && $3==0)
                     63:                        leftp->linep = 0;
                     64:                else if(leftp->linep == 0)
                     65:                        leftp->linep = lp;
                     66:                else    {
                     67:                        for(lpp = leftp->linep; lpp->nxtlineblock;
                     68:                                lpp = lpp->nxtlineblock) ;
                     69:                                if(sepc==ALLDEPS && leftp->namep[0]=='.')
                     70:                                        lpp->shp = 0;
                     71:                        lpp->nxtlineblock = lp;
                     72:                        }
                     73:                }
                     74:        }
                     75:        | error
                     76:        ;
                     77: 
                     78: namelist: NAME = { lefts[0] = $1; nlefts = 1; }
                     79:        | namelist NAME = { lefts[nlefts++] = $2;
                     80:                if(nlefts>=NLEFTS) fatal("Too many lefts"); }
                     81:        ;
                     82: 
                     83: deplist:
                     84:                {
                     85:                char junk[10];
                     86:                sprintf(junk, "%d", yylineno);
                     87:                fatal1("Must be a separator on rules line %s", junk);
                     88:                }
                     89:        | dlist
                     90:        ;
                     91: 
                     92: dlist:  sepchar        = { prevdep = 0;  $$ = 0; }
                     93:        | dlist NAME    = {
                     94:                          pp = ALLOC(depblock);
                     95:                          pp->nxtdepblock = NULL;
                     96:                          pp->depname = $2;
                     97:                          if(prevdep == 0) $$ = pp;
                     98:                          else  prevdep->nxtdepblock = pp;
                     99:                          prevdep = pp;
                    100:                          }
                    101:        ;
                    102: 
                    103: sepchar:  COLON        = { sepc = ALLDEPS; }
                    104:        | DOUBLECOLON   = { sepc = SOMEDEPS; }
                    105:        ;
                    106: 
                    107: shellist:      = {$$ = 0; }
                    108:        | shlist = { $$ = $1; }
                    109:        ;
                    110: 
                    111: shlist:        SHELLINE   = { $$ = $1;  prevshp = $1; }
                    112:        | shlist SHELLINE = { $$ = $1;
                    113:                        prevshp->nxtshblock = $2;
                    114:                        prevshp = $2;
                    115:                        }
                    116:        ;
                    117: 
                    118: %%
                    119: 
                    120: char *zznextc; /* zero if need another line; otherwise points to next char */
                    121: int yylineno;
                    122: extern FILE * fin;
                    123: 
                    124: yylex()
                    125: {
                    126: register char *p;
                    127: register char *q;
                    128: char word[INMAX];
                    129: 
                    130: if(zznextc == 0)
                    131:        return( nextlin() );
                    132: 
                    133: while( isspace(*zznextc) )
                    134:        ++zznextc;
                    135: 
                    136: if(*zznextc == '\0')
                    137:        return( nextlin() );
                    138: 
                    139: if(*zznextc == ':')
                    140:        {
                    141:        if(*++zznextc == ':')
                    142:                {
                    143:                ++zznextc;
                    144:                return(DOUBLECOLON);
                    145:                }
                    146:        else    return(COLON);
                    147:        }
                    148: 
                    149: if(*zznextc == '>')
                    150:        {
                    151:        ++zznextc;
                    152:        return(GREATER);
                    153:        }
                    154: 
                    155: if(*zznextc == ';')
                    156:        return( retsh(zznextc) );
                    157: 
                    158: p = zznextc;
                    159: q = word;
                    160: 
                    161: while( ! ( funny[*p] & TERMINAL) )
                    162:        *q++ = *p++;
                    163: 
                    164: if(p != zznextc)
                    165:        {
                    166:        *q = '\0';
                    167:        if((yylval.ynameblock=srchname(word))==0)
                    168:                yylval.ynameblock = makename(word);
                    169:        zznextc = p;
                    170:        return(NAME);
                    171:        }
                    172: 
                    173: else   {
                    174:        fprintf(stderr,"Bad character %c (octal %o), line %d",
                    175:                *zznextc,*zznextc,yylineno);
                    176:        fatal( (char *) NULL );
                    177:        }
                    178: return(0);     /* never executed */
                    179: }
                    180: 
                    181: 
                    182: 
                    183: 
                    184: 
                    185: retsh(q)
                    186: char *q;
                    187: {
                    188: register char *p;
                    189: struct shblock *sp;
                    190: char *copys();
                    191: 
                    192: for(p=q+1 ; *p==' '||*p=='\t' ; ++p)  ;
                    193: 
                    194: sp = ALLOC(shblock);
                    195: sp->nxtshblock = NULL;
                    196: sp->shbp = (fin == NULL ? p : copys(p) );
                    197: yylval.yshblock = sp;
                    198: zznextc = 0;
                    199: return(SHELLINE);
                    200: }
                    201: 
                    202: nextlin()
                    203: {
                    204: static char yytext[INMAX];
                    205: static char *yytextl   = yytext+INMAX;
                    206: char *text, templin[INMAX];
                    207: register char c;
                    208: register char *p, *t;
                    209: char lastch, *lastchp;
                    210: extern char **linesptr;
                    211: int incom;
                    212: int kc;
                    213: 
                    214: again:
                    215: 
                    216:        incom = NO;
                    217:        zznextc = 0;
                    218: 
                    219: if(fin == NULL)
                    220:        {
                    221:        if( (text = *linesptr++) == 0)
                    222:                return(0);
                    223:        ++yylineno;
                    224:        }
                    225: 
                    226: else   {
                    227:        for(p = text = yytext ; p<yytextl ; *p++ = kc)
                    228:                switch(kc = getc(fin))
                    229:                        {
                    230:                        case '\t':
                    231:                                if(p != yytext)
                    232:                                        break;
                    233:                        case ';':
                    234:                                incom = YES;
                    235:                                break;
                    236: 
                    237:                        case '#':
                    238:                                if(! incom)
                    239:                                        kc = '\0';
                    240:                                break;
                    241: 
                    242:                        case '\n':
                    243:                                ++yylineno;
                    244:                                if(p==yytext || p[-1]!='\\')
                    245:                                        {
                    246:                                        *p = '\0';
                    247:                                        goto endloop;
                    248:                                        }
                    249:                                p[-1] = ' ';
                    250:                                while( (kc=getc(fin))=='\t' || kc==' ' || kc=='\n')
                    251:                                        if(kc == '\n')
                    252:                                                ++yylineno;
                    253:        
                    254:                                if(kc != EOF)
                    255:                                        break;
                    256:                        case EOF:
                    257:                                *p = '\0';
                    258:                                return(0);
                    259:                        }
                    260: 
                    261:        fatal("line too long");
                    262:        }
                    263: 
                    264: endloop:
                    265: 
                    266:        if((c = text[0]) == '\t')
                    267:                return( retsh(text) );
                    268:        
                    269:        if(isalpha(c) || isdigit(c) || c==' ' || c=='.')
                    270:                for(p=text+1; *p!='\0'; )
                    271:                        if(*p == ':')
                    272:                                break;
                    273:                        else if(*p++ == '=')
                    274:                                {
                    275:                                eqsign(text);
                    276:                                return(MACRODEF);
                    277:                                }
                    278: 
                    279: /* substitute for macros on dependency line up to the semicolon if any */
                    280: 
                    281: for(t = yytext ; *t!='\0' && *t!=';' ; ++t)
                    282:        ;
                    283: 
                    284: lastchp = t;
                    285: lastch = *t;
                    286: *t = '\0';
                    287: 
                    288: subst(yytext, templin);                /* Substitute for macros on dependency lines */
                    289: 
                    290: if(lastch)
                    291:        {
                    292:        for(t = templin ; *t ; ++t)
                    293:                ;
                    294:        *t = lastch;
                    295:        while( *++t = *++lastchp ) ;
                    296:        }
                    297: 
                    298: p = templin;
                    299: t = yytext;
                    300: while( *t++ = *p++ )
                    301:        ;
                    302: 
                    303: for(p = zznextc = text ; *p ; ++p )
                    304:        if(*p!=' ' && *p!='\t')
                    305:                return(START);
                    306: goto again;
                    307: }

unix.superglobalmegacorp.com

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