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"