main gram.y
  1%{
  2#include "defs"
  3#define YYSTYPE void *
  4%}
  5%term NAME SHELLINE START MACRODEF COLON DOUBLECOLON GREATER
  6
  7
  8%%
  9
 10%{
 11struct depblock *pp;
 12FSTATIC struct shblock *prevshp;
 13
 14FSTATIC struct nameblock *lefts[NLEFTS];
 15struct nameblock *leftp;
 16FSTATIC int nlefts;
 17
 18struct lineblock *lp, *lpp;
 19FSTATIC struct depblock *prevdep;
 20FSTATIC int sepc;
 21%}
 22
 23
 24file:
 25	| file comline
 26	;
 27
 28comline:  START
 29	| MACRODEF
 30	| START namelist deplist shellist = {
 31	    while( --nlefts >= 0)
 32		{
 33		leftp = lefts[nlefts];
 34		if(leftp->septype == 0)
 35			leftp->septype = sepc;
 36		else if(leftp->septype != sepc)
 37			fprintf(stderr, "Inconsistent rules lines for `%s'\n",
 38				leftp->namep);
 39		else if(sepc==ALLDEPS && *(leftp->namep)!='.' && $4!=0)
 40			{
 41			for(lp=leftp->linep; lp->nextp!=0; lp=lp->nextp)
 42			    if(lp->shp)
 43				fprintf(stderr, "Multiple rules lines for `%s'\n",
 44				    leftp->namep);
 45			}
 46
 47		lp = intalloc(sizeof(*lp));
 48		lp->nextp = 0;
 49		lp->depp = $3;
 50		lp->shp = $4;
 51
 52		if(equals(leftp->namep, ".SUFFIXES") && $3==0)
 53			leftp->linep = 0;
 54		else if(leftp->linep == 0)
 55			leftp->linep = lp;
 56		else	{
 57			for(lpp = leftp->linep; lpp->nextp!=0;
 58				lpp = lpp->nextp) ;
 59				if(sepc == ALLDEPS)
 60					lpp->shp = 0;
 61			lpp->nextp = lp;
 62			}
 63		}
 64	}
 65	| error
 66	;
 67
 68namelist: NAME	= { lefts[0] = $1; nlefts = 1; }
 69	| namelist NAME	= { lefts[nlefts++] = $2;
 70	    	if(nlefts>NLEFTS) fatal("Too many lefts"); }
 71	;
 72
 73deplist:	= { fatal("Must be a separator on rules line"); }
 74	| dlist
 75	;
 76
 77dlist:  sepchar	= { prevdep = 0;  $$ = 0; }
 78	| dlist NAME	= {
 79			  pp = intalloc(sizeof(*pp));
 80			  pp->nextp = 0;
 81			  pp->depname = $2;
 82			  if(prevdep == 0) $$ = pp;
 83			  else  prevdep->nextp = pp;
 84			  prevdep = pp;
 85			  }
 86	;
 87
 88sepchar:  COLON 	= { sepc = ALLDEPS; }
 89	| DOUBLECOLON	= { sepc = SOMEDEPS; }
 90	;
 91
 92shellist:	= {$$ = 0; }
 93	| shlist = { $$ = $1; }
 94	;
 95
 96shlist:	SHELLINE   = { $$ = $1;  prevshp = $1; }
 97	| shlist SHELLINE = { $$ = $1;
 98			prevshp->nextp = $2;
 99			prevshp = $2;
100			}
101	;
102
103%%
104
105
106
107# include "lex.c"