|
|
1.1 ! root 1: ! 2: # line 1 "gram.y" ! 3: #include "defs" ! 4: static char *sccsid = "@(#)gram.y 4.1 (Berkeley) 81/02/28"; ! 5: ! 6: # line 6 "gram.y" ! 7: typedef union ! 8: { ! 9: struct shblock *yshblock; ! 10: struct depblock *ydepblock; ! 11: struct nameblock *ynameblock; ! 12: } YYSTYPE; ! 13: # define NAME 257 ! 14: # define SHELLINE 258 ! 15: # define START 259 ! 16: # define MACRODEF 260 ! 17: # define COLON 261 ! 18: # define DOUBLECOLON 262 ! 19: # define GREATER 263 ! 20: #define yyclearin yychar = -1 ! 21: #define yyerrok yyerrflag = 0 ! 22: extern int yychar; ! 23: extern short yyerrflag; ! 24: #ifndef YYMAXDEPTH ! 25: #define YYMAXDEPTH 150 ! 26: #endif ! 27: YYSTYPE yylval, yyval; ! 28: ! 29: # line 21 "gram.y" ! 30: struct depblock *pp; ! 31: FSTATIC struct shblock *prevshp; ! 32: ! 33: FSTATIC struct nameblock *lefts[NLEFTS]; ! 34: struct nameblock *leftp; ! 35: FSTATIC int nlefts; ! 36: ! 37: struct lineblock *lp, *lpp; ! 38: FSTATIC struct depblock *prevdep; ! 39: FSTATIC int sepc; ! 40: # define YYERRCODE 256 ! 41: ! 42: # line 118 "gram.y" ! 43: ! 44: ! 45: char *zznextc; /* zero if need another line; otherwise points to next char */ ! 46: int yylineno; ! 47: extern FILE * fin; ! 48: ! 49: yylex() ! 50: { ! 51: register char *p; ! 52: register char *q; ! 53: char word[INMAX]; ! 54: ! 55: if(zznextc == 0) ! 56: return( nextlin() ); ! 57: ! 58: while( isspace(*zznextc) ) ! 59: ++zznextc; ! 60: ! 61: if(*zznextc == '\0') ! 62: return( nextlin() ); ! 63: ! 64: if(*zznextc == ':') ! 65: { ! 66: if(*++zznextc == ':') ! 67: { ! 68: ++zznextc; ! 69: return(DOUBLECOLON); ! 70: } ! 71: else return(COLON); ! 72: } ! 73: ! 74: if(*zznextc == '>') ! 75: { ! 76: ++zznextc; ! 77: return(GREATER); ! 78: } ! 79: ! 80: if(*zznextc == ';') ! 81: return( retsh(zznextc) ); ! 82: ! 83: p = zznextc; ! 84: q = word; ! 85: ! 86: while( ! ( funny[*p] & TERMINAL) ) ! 87: *q++ = *p++; ! 88: ! 89: if(p != zznextc) ! 90: { ! 91: *q = '\0'; ! 92: if((yylval.ynameblock=srchname(word))==0) ! 93: yylval.ynameblock = makename(word); ! 94: zznextc = p; ! 95: return(NAME); ! 96: } ! 97: ! 98: else { ! 99: fprintf(stderr,"Bad character %c (octal %o), line %d", ! 100: *zznextc,*zznextc,yylineno); ! 101: fatal( (char *) NULL ); ! 102: } ! 103: return(0); /* never executed */ ! 104: } ! 105: ! 106: ! 107: ! 108: ! 109: ! 110: retsh(q) ! 111: char *q; ! 112: { ! 113: register char *p; ! 114: struct shblock *sp; ! 115: char *copys(); ! 116: ! 117: for(p=q+1 ; *p==' '||*p=='\t' ; ++p) ; ! 118: ! 119: sp = ALLOC(shblock); ! 120: sp->nxtshblock = NULL; ! 121: sp->shbp = (fin == NULL ? p : copys(p) ); ! 122: yylval.yshblock = sp; ! 123: zznextc = 0; ! 124: return(SHELLINE); ! 125: } ! 126: ! 127: nextlin() ! 128: { ! 129: static char yytext[INMAX]; ! 130: static char *yytextl = yytext+INMAX; ! 131: char *text, templin[INMAX]; ! 132: register char c; ! 133: register char *p, *t; ! 134: char lastch, *lastchp; ! 135: extern char **linesptr; ! 136: int incom; ! 137: int kc; ! 138: ! 139: again: ! 140: ! 141: incom = NO; ! 142: zznextc = 0; ! 143: ! 144: if(fin == NULL) ! 145: { ! 146: if( (text = *linesptr++) == 0) ! 147: return(0); ! 148: ++yylineno; ! 149: } ! 150: ! 151: else { ! 152: for(p = text = yytext ; p<yytextl ; *p++ = kc) ! 153: switch(kc = getc(fin)) ! 154: { ! 155: case '\t': ! 156: if(p != yytext) ! 157: break; ! 158: case ';': ! 159: incom = YES; ! 160: break; ! 161: ! 162: case '#': ! 163: if(! incom) ! 164: kc = '\0'; ! 165: break; ! 166: ! 167: case '\n': ! 168: ++yylineno; ! 169: if(p==yytext || p[-1]!='\\') ! 170: { ! 171: *p = '\0'; ! 172: goto endloop; ! 173: } ! 174: p[-1] = ' '; ! 175: while( (kc=getc(fin))=='\t' || kc==' ' || kc=='\n') ! 176: if(kc == '\n') ! 177: ++yylineno; ! 178: ! 179: if(kc != EOF) ! 180: break; ! 181: case EOF: ! 182: *p = '\0'; ! 183: return(0); ! 184: } ! 185: ! 186: fatal("line too long"); ! 187: } ! 188: ! 189: endloop: ! 190: ! 191: if((c = text[0]) == '\t') ! 192: return( retsh(text) ); ! 193: ! 194: if(isalpha(c) || isdigit(c) || c==' ' || c=='.') ! 195: for(p=text+1; *p!='\0'; ) ! 196: if(*p == ':') ! 197: break; ! 198: else if(*p++ == '=') ! 199: { ! 200: eqsign(text); ! 201: return(MACRODEF); ! 202: } ! 203: ! 204: /* substitute for macros on dependency line up to the semicolon if any */ ! 205: ! 206: for(t = yytext ; *t!='\0' && *t!=';' ; ++t) ! 207: ; ! 208: ! 209: lastchp = t; ! 210: lastch = *t; ! 211: *t = '\0'; ! 212: ! 213: subst(yytext, templin); /* Substitute for macros on dependency lines */ ! 214: ! 215: if(lastch) ! 216: { ! 217: for(t = templin ; *t ; ++t) ! 218: ; ! 219: *t = lastch; ! 220: while( *++t = *++lastchp ) ; ! 221: } ! 222: ! 223: p = templin; ! 224: t = yytext; ! 225: while( *t++ = *p++ ) ! 226: ; ! 227: ! 228: for(p = zznextc = text ; *p ; ++p ) ! 229: if(*p!=' ' && *p!='\t') ! 230: return(START); ! 231: goto again; ! 232: } ! 233: short yyexca[] ={ ! 234: -1, 1, ! 235: 0, -1, ! 236: -2, 0, ! 237: }; ! 238: # define YYNPROD 19 ! 239: # define YYLAST 18 ! 240: short yyact[]={ ! 241: ! 242: 9, 11, 18, 5, 12, 13, 3, 4, 16, 17, ! 243: 7, 2, 1, 10, 8, 6, 14, 15 }; ! 244: short yypact[]={ ! 245: ! 246: -1000,-253,-1000,-247,-1000,-1000,-257,-1000,-250,-1000, ! 247: -248,-1000,-1000,-1000,-1000,-256,-1000,-1000,-1000 }; ! 248: short yypgo[]={ ! 249: ! 250: 0, 17, 16, 15, 14, 13, 12, 11, 1 }; ! 251: short yyr1[]={ ! 252: ! 253: 0, 6, 6, 7, 7, 7, 7, 3, 3, 4, ! 254: 4, 5, 5, 8, 8, 2, 2, 1, 1 }; ! 255: short yyr2[]={ ! 256: ! 257: 0, 0, 2, 1, 1, 4, 1, 1, 2, 0, ! 258: 1, 1, 2, 1, 1, 0, 1, 1, 2 }; ! 259: short yychk[]={ ! 260: ! 261: -1000, -6, -7, 259, 260, 256, -3, 257, -4, 257, ! 262: -5, -8, 261, 262, -2, -1, 258, 257, 258 }; ! 263: short yydef[]={ ! 264: ! 265: 1, -2, 2, 3, 4, 6, 9, 7, 15, 8, ! 266: 10, 11, 13, 14, 5, 16, 17, 12, 18 }; ! 267: # ! 268: # define YYFLAG -1000 ! 269: # define YYERROR goto yyerrlab ! 270: # define YYACCEPT return(0) ! 271: # define YYABORT return(1) ! 272: ! 273: /* parser for yacc output */ ! 274: ! 275: #ifdef YYDEBUG ! 276: int yydebug = 0; /* 1 for debugging */ ! 277: #endif ! 278: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ ! 279: int yychar = -1; /* current input token number */ ! 280: int yynerrs = 0; /* number of errors */ ! 281: short yyerrflag = 0; /* error recovery flag */ ! 282: ! 283: yyparse() { ! 284: ! 285: short yys[YYMAXDEPTH]; ! 286: short yyj, yym; ! 287: register YYSTYPE *yypvt; ! 288: register short yystate, *yyps, yyn; ! 289: register YYSTYPE *yypv; ! 290: register short *yyxi; ! 291: ! 292: yystate = 0; ! 293: yychar = -1; ! 294: yynerrs = 0; ! 295: yyerrflag = 0; ! 296: yyps= &yys[-1]; ! 297: yypv= &yyv[-1]; ! 298: ! 299: yystack: /* put a state and value onto the stack */ ! 300: ! 301: #ifdef YYDEBUG ! 302: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar ); ! 303: #endif ! 304: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); } ! 305: *yyps = yystate; ! 306: ++yypv; ! 307: *yypv = yyval; ! 308: ! 309: yynewstate: ! 310: ! 311: yyn = yypact[yystate]; ! 312: ! 313: if( yyn<= YYFLAG ) goto yydefault; /* simple state */ ! 314: ! 315: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0; ! 316: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault; ! 317: ! 318: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */ ! 319: yychar = -1; ! 320: yyval = yylval; ! 321: yystate = yyn; ! 322: if( yyerrflag > 0 ) --yyerrflag; ! 323: goto yystack; ! 324: } ! 325: ! 326: yydefault: ! 327: /* default state action */ ! 328: ! 329: if( (yyn=yydef[yystate]) == -2 ) { ! 330: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0; ! 331: /* look through exception table */ ! 332: ! 333: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */ ! 334: ! 335: while( *(yyxi+=2) >= 0 ){ ! 336: if( *yyxi == yychar ) break; ! 337: } ! 338: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */ ! 339: } ! 340: ! 341: if( yyn == 0 ){ /* error */ ! 342: /* error ... attempt to resume parsing */ ! 343: ! 344: switch( yyerrflag ){ ! 345: ! 346: case 0: /* brand new error */ ! 347: ! 348: yyerror( "syntax error" ); ! 349: yyerrlab: ! 350: ++yynerrs; ! 351: ! 352: case 1: ! 353: case 2: /* incompletely recovered error ... try again */ ! 354: ! 355: yyerrflag = 3; ! 356: ! 357: /* find a state where "error" is a legal shift action */ ! 358: ! 359: while ( yyps >= yys ) { ! 360: yyn = yypact[*yyps] + YYERRCODE; ! 361: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){ ! 362: yystate = yyact[yyn]; /* simulate a shift of "error" */ ! 363: goto yystack; ! 364: } ! 365: yyn = yypact[*yyps]; ! 366: ! 367: /* the current yyps has no shift onn "error", pop stack */ ! 368: ! 369: #ifdef YYDEBUG ! 370: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] ); ! 371: #endif ! 372: --yyps; ! 373: --yypv; ! 374: } ! 375: ! 376: /* there is no state on the stack with an error shift ... abort */ ! 377: ! 378: yyabort: ! 379: return(1); ! 380: ! 381: ! 382: case 3: /* no shift yet; clobber input char */ ! 383: ! 384: #ifdef YYDEBUG ! 385: if( yydebug ) printf( "error recovery discards char %d\n", yychar ); ! 386: #endif ! 387: ! 388: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */ ! 389: yychar = -1; ! 390: goto yynewstate; /* try again in the same state */ ! 391: ! 392: } ! 393: ! 394: } ! 395: ! 396: /* reduction by production yyn */ ! 397: ! 398: #ifdef YYDEBUG ! 399: if( yydebug ) printf("reduce %d\n",yyn); ! 400: #endif ! 401: yyps -= yyr2[yyn]; ! 402: yypvt = yypv; ! 403: yypv -= yyr2[yyn]; ! 404: yyval = yypv[1]; ! 405: yym=yyn; ! 406: /* consult goto table to find next state */ ! 407: yyn = yyr1[yyn]; ! 408: yyj = yypgo[yyn] + *yyps + 1; ! 409: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]]; ! 410: switch(yym){ ! 411: ! 412: case 5: ! 413: # line 40 "gram.y" ! 414: { ! 415: while( --nlefts >= 0) ! 416: { ! 417: leftp = lefts[nlefts]; ! 418: if(leftp->septype == 0) ! 419: leftp->septype = sepc; ! 420: else if(leftp->septype != sepc) ! 421: fprintf(stderr, "Inconsistent rules lines for `%s'\n", ! 422: leftp->namep); ! 423: else if(sepc==ALLDEPS && *(leftp->namep)!='.' && yypvt[-0].yshblock!=0) ! 424: { ! 425: for(lp=leftp->linep; lp->nxtlineblock!=0; lp=lp->nxtlineblock) ! 426: if(lp->shp) ! 427: fprintf(stderr, "Multiple rules lines for `%s'\n", ! 428: leftp->namep); ! 429: } ! 430: ! 431: lp = ALLOC(lineblock); ! 432: lp->nxtlineblock = NULL; ! 433: lp->depp = yypvt[-1].ydepblock; ! 434: lp->shp = yypvt[-0].yshblock; ! 435: ! 436: if(! unequal(leftp->namep, ".SUFFIXES") && yypvt[-1].ydepblock==0) ! 437: leftp->linep = 0; ! 438: else if(leftp->linep == 0) ! 439: leftp->linep = lp; ! 440: else { ! 441: for(lpp = leftp->linep; lpp->nxtlineblock; ! 442: lpp = lpp->nxtlineblock) ; ! 443: if(sepc==ALLDEPS && leftp->namep[0]=='.') ! 444: lpp->shp = 0; ! 445: lpp->nxtlineblock = lp; ! 446: } ! 447: } ! 448: } break; ! 449: case 7: ! 450: # line 78 "gram.y" ! 451: { lefts[0] = yypvt[-0].ynameblock; nlefts = 1; } break; ! 452: case 8: ! 453: # line 79 "gram.y" ! 454: { lefts[nlefts++] = yypvt[-0].ynameblock; ! 455: if(nlefts>=NLEFTS) fatal("Too many lefts"); } break; ! 456: case 9: ! 457: # line 84 "gram.y" ! 458: { ! 459: char junk[10]; ! 460: sprintf(junk, "%d", yylineno); ! 461: fatal1("Must be a separator on rules line %s", junk); ! 462: } break; ! 463: case 11: ! 464: # line 92 "gram.y" ! 465: { prevdep = 0; yyval.ydepblock = 0; } break; ! 466: case 12: ! 467: # line 93 "gram.y" ! 468: { ! 469: pp = ALLOC(depblock); ! 470: pp->nxtdepblock = NULL; ! 471: pp->depname = yypvt[-0].ynameblock; ! 472: if(prevdep == 0) yyval.ydepblock = pp; ! 473: else prevdep->nxtdepblock = pp; ! 474: prevdep = pp; ! 475: } break; ! 476: case 13: ! 477: # line 103 "gram.y" ! 478: { sepc = ALLDEPS; } break; ! 479: case 14: ! 480: # line 104 "gram.y" ! 481: { sepc = SOMEDEPS; } break; ! 482: case 15: ! 483: # line 107 "gram.y" ! 484: {yyval.yshblock = 0; } break; ! 485: case 16: ! 486: # line 108 "gram.y" ! 487: { yyval.yshblock = yypvt[-0].yshblock; } break; ! 488: case 17: ! 489: # line 111 "gram.y" ! 490: { yyval.yshblock = yypvt[-0].yshblock; prevshp = yypvt[-0].yshblock; } break; ! 491: case 18: ! 492: # line 112 "gram.y" ! 493: { yyval.yshblock = yypvt[-1].yshblock; ! 494: prevshp->nxtshblock = yypvt[-0].yshblock; ! 495: prevshp = yypvt[-0].yshblock; ! 496: } break; ! 497: } ! 498: goto yystack; /* stack new state and value */ ! 499: ! 500: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.