Berkeley YACC  1993-03-03
Berkeley's version of Yet Another Compiler Compiler
 All Data Structures Files Functions Variables Typedefs Macros Groups
closure.c
Go to the documentation of this file.
1 #include "defs.h"
2 
3 short *itemset;
4 short *itemsetend;
5 
13 unsigned *ruleset;
14 
27 static unsigned *first_derives;
28 
40 static unsigned *EFF;
41 
42 
53 {
54  register unsigned *row;
55  register int symbol;
56  register short *sp;
57  register int rowsize;
58  register int i;
59  register int rule;
60 
61  rowsize = WORDSIZE(nvars);
62  EFF = NEW2(nvars * rowsize, unsigned);
63 
64  row = EFF;
65  for (i = start_symbol; i < nsyms; i++)
66  {
67  sp = derives[i];
68  for (rule = *sp; rule > 0; rule = *++sp)
69  {
70  symbol = ritem[rrhs[rule]];
71  if (ISVAR(symbol))
72  {
73  symbol -= start_symbol;
74  SETBIT(row, symbol);
75  }
76  }
77  row += rowsize;
78  }
79 
81 
82 #ifdef DEBUG
83  print_EFF();
84 #endif
85 }
86 
87 
101 {
102  register unsigned *rrow;
103  register unsigned *vrow;
104  register int j;
105  register unsigned k;
106  register unsigned cword;
107  register short *rp;
108 
109  int rule;
110  int i;
111  int rulesetsize;
112  int varsetsize;
113 
114  rulesetsize = WORDSIZE(nrules);
115  varsetsize = WORDSIZE(nvars);
116  first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
117 
118  set_EFF();
119 
120  rrow = first_derives + ntokens * rulesetsize;
121  for (i = start_symbol; i < nsyms; i++)
122  {
123  vrow = EFF + ((i - ntokens) * varsetsize);
124  k = BITS_PER_WORD;
125  for (j = start_symbol; j < nsyms; k++, j++)
126  {
127  if (k >= BITS_PER_WORD)
128  {
129  cword = *vrow++;
130  k = 0;
131  }
132 
133  if (cword & (1 << k))
134  {
135  rp = derives[j];
136  while ((rule = *rp++) >= 0)
137  {
138  SETBIT(rrow, rule);
139  }
140  }
141  }
142 
143  vrow += varsetsize;
144  rrow += rulesetsize;
145  }
146 
147 #ifdef DEBUG
148  print_first_derives();
149 #endif
150 
151  FREE(EFF);
152 }
153 
154 
155 closure(nucleus, n)
156 short *nucleus;
157 int n;
158 {
159  register int ruleno;
160  register unsigned word;
161  register unsigned i;
162  register short *csp;
163  register unsigned *dsp;
164  register unsigned *rsp;
165  register int rulesetsize;
166 
167  short *csend;
168  unsigned *rsend;
169  int symbol;
170  int itemno;
171 
172  rulesetsize = WORDSIZE(nrules);
173  rsp = ruleset;
174  rsend = ruleset + rulesetsize;
175  for (rsp = ruleset; rsp < rsend; rsp++)
176  *rsp = 0;
177 
178  csend = nucleus + n;
179  for (csp = nucleus; csp < csend; ++csp)
180  {
181  symbol = ritem[*csp];
182  if (ISVAR(symbol))
183  {
184  dsp = first_derives + symbol * rulesetsize;
185  rsp = ruleset;
186  while (rsp < rsend)
187  *rsp++ |= *dsp++;
188  }
189  }
190 
191  ruleno = 0;
193  csp = nucleus;
194  for (rsp = ruleset; rsp < rsend; ++rsp)
195  {
196  word = *rsp;
197  if (word)
198  {
199  for (i = 0; i < BITS_PER_WORD; ++i)
200  {
201  if (word & (1 << i))
202  {
203  itemno = rrhs[ruleno+i];
204  while (csp < csend && *csp < itemno)
205  *itemsetend++ = *csp++;
206  *itemsetend++ = itemno;
207  while (csp < csend && *csp == itemno)
208  ++csp;
209  }
210  }
211  }
212  ruleno += BITS_PER_WORD;
213  }
214 
215  while (csp < csend)
216  *itemsetend++ = *csp++;
217 
218 #ifdef DEBUG
219  print_closure(n);
220 #endif
221 }
222 
223 
224 
226 {
227  FREE(itemset);
228  FREE(ruleset);
230 }
231 
232 
233 #ifdef DEBUG
234 
235 print_closure(n)
236 int n;
237 {
238  register short *isp;
239 
240  printf("\n\nn = %d\n\n", n);
241  for (isp = itemset; isp < itemsetend; isp++)
242  printf(" %d\n", *isp);
243 }
244 
245 
246 print_EFF()
247 {
248  register int i, j;
249  register unsigned *rowp;
250  register unsigned word;
251  register unsigned k;
252 
253  printf("\n\nEpsilon Free Firsts\n");
254 
255  for (i = start_symbol; i < nsyms; i++)
256  {
257  printf("\n%s", symbol_name[i]);
258  rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
259  word = *rowp++;
260 
261  k = BITS_PER_WORD;
262  for (j = 0; j < nvars; k++, j++)
263  {
264  if (k >= BITS_PER_WORD)
265  {
266  word = *rowp++;
267  k = 0;
268  }
269 
270  if (word & (1 << k))
271  printf(" %s", symbol_name[start_symbol + j]);
272  }
273  }
274 }
275 
276 
277 print_first_derives()
278 {
279  register int i;
280  register int j;
281  register unsigned *rp;
282  register unsigned cword;
283  register unsigned k;
284 
285  printf("\n\n\nFirst Derives\n");
286 
287  for (i = start_symbol; i < nsyms; i++)
288  {
289  printf("\n%s derives\n", symbol_name[i]);
290  rp = first_derives + i * WORDSIZE(nrules);
291  k = BITS_PER_WORD;
292  for (j = 0; j <= nrules; k++, j++)
293  {
294  if (k >= BITS_PER_WORD)
295  {
296  cword = *rp++;
297  k = 0;
298  }
299 
300  if (cword & (1 << k))
301  printf(" %d\n", j);
302  }
303  }
304 
305  fflush(stdout);
306 }
307 
308 #endif
finalize_closure()
Definition: closure.c:225
#define NEW2(n, t)
Definition: defs.h:105
unsigned * ruleset
Bitset of closure items for the current state.
Definition: closure.c:13
short * itemset
Definition: closure.c:3
closure(short *nucleus, int n)
Definition: closure.c:155
int ntokens
The number of tokens (terminals) in the grammar.
Definition: main.c:64
short * itemsetend
Definition: closure.c:4
#define ISVAR(s)
Definition: defs.h:96
static unsigned * first_derives
Matrix of closure productions.
Definition: closure.c:27
set_EFF()
Populates EFF, the matrix of Epsilon-Free Firsts.
Definition: closure.c:52
#define BITS_PER_WORD
Definition: defs.h:25
#define WORDSIZE(n)
Definition: defs.h:26
int nrules
The number of rules in the grammar.
Definition: main.c:45
set_first_derives()
Populates first_derives, the matrix of closure productions.
Definition: closure.c:100
int nvars
The number of variables (non-terminals) in the grammar.
Definition: main.c:74
reflexive_transitive_closure(unsigned *R, int n)
Definition: warshall.c:79
int nsyms
The number of symbols (terminals + non-terminals) in the grammar.
Definition: main.c:55
short * rrhs
List of right-hand sides of all rules.
Definition: main.c:126
#define FREE(x)
Definition: defs.h:102
short * ritem
Representation of all productions (and items)
Definition: main.c:112
short ** derives
List of rules that derive each non-terminal.
Definition: main.c:140
#define SETBIT(r, n)
Definition: defs.h:28
int start_symbol
Index of the starting symbol of the grammar.
Definition: main.c:82
char ** symbol_name
Array of symbol names.
Definition: main.c:90
static unsigned * EFF
Matrix of Epsilon-Free Firsts.
Definition: closure.c:40