This is Unofficial EPICS BASE Doxygen Site
closure.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE is distributed subject to a Software License Agreement found
7 * in file LICENSE that is included with this distribution.
8 \*************************************************************************/
9 
10 #include "defs.h"
11 
12 short *itemset;
13 short *itemsetend;
14 unsigned *ruleset;
15 
16 static unsigned *first_derives;
17 static unsigned *EFF;
18 
19 #ifdef DEBUG
20 static void print_closure(int n);
21 static void print_EFF(void);
22 static void print_first_derives(void);
23 #endif
24 
25 
26 static void
27 set_EFF(void)
28 {
29  unsigned *row;
30  int symbol;
31  short *sp;
32  int rowsize;
33  int i;
34  int rule;
35 
36  rowsize = WORDSIZE(nvars);
37  EFF = NEW2(nvars * rowsize, unsigned);
38 
39  row = EFF;
40  for (i = start_symbol; i < nsyms; i++)
41  {
42  sp = derives[i];
43  for (rule = *sp; rule > 0; rule = *++sp)
44  {
45  symbol = ritem[rrhs[rule]];
46  if (ISVAR(symbol))
47  {
48  symbol -= start_symbol;
49  SETBIT(row, symbol);
50  }
51  }
52  row += rowsize;
53  }
54 
56 
57 #ifdef DEBUG
58  print_EFF();
59 #endif
60 }
61 
62 
63 void
65 {
66  unsigned *rrow;
67  unsigned *vrow;
68  int j;
69  unsigned k;
70  unsigned cword = 0;
71  short *rp;
72 
73  int rule;
74  int i;
75  int rulesetsize;
76  int varsetsize;
77 
78  rulesetsize = WORDSIZE(nrules);
79  varsetsize = WORDSIZE(nvars);
80  first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
81 
82  set_EFF();
83 
84  rrow = first_derives + ntokens * rulesetsize;
85  for (i = start_symbol; i < nsyms; i++)
86  {
87  vrow = EFF + ((i - ntokens) * varsetsize);
88  k = BITS_PER_WORD;
89  for (j = start_symbol; j < nsyms; k++, j++)
90  {
91  if (k >= BITS_PER_WORD)
92  {
93  cword = *vrow++;
94  k = 0;
95  }
96 
97  if (cword & (1 << k))
98  {
99  rp = derives[j];
100  while ((rule = *rp++) >= 0)
101  {
102  SETBIT(rrow, rule);
103  }
104  }
105  }
106 
107  vrow += varsetsize;
108  rrow += rulesetsize;
109  }
110 
111 #ifdef DEBUG
112  print_first_derives();
113 #endif
114 
115  FREE(EFF);
116 }
117 
118 
119 void
120 closure(short int *nucleus, int n)
121 {
122  int ruleno;
123  unsigned word;
124  unsigned i;
125  short *csp;
126  unsigned *dsp;
127  unsigned *rsp;
128  int rulesetsize;
129 
130  short *csend;
131  unsigned *rsend;
132  int symbol;
133  int itemno;
134 
135  rulesetsize = WORDSIZE(nrules);
136  rsp = ruleset;
137  rsend = ruleset + rulesetsize;
138  for (rsp = ruleset; rsp < rsend; rsp++)
139  *rsp = 0;
140 
141  csend = nucleus + n;
142  for (csp = nucleus; csp < csend; ++csp)
143  {
144  symbol = ritem[*csp];
145  if (ISVAR(symbol))
146  {
147  dsp = first_derives + symbol * rulesetsize;
148  rsp = ruleset;
149  while (rsp < rsend)
150  *rsp++ |= *dsp++;
151  }
152  }
153 
154  ruleno = 0;
156  csp = nucleus;
157  for (rsp = ruleset; rsp < rsend; ++rsp)
158  {
159  word = *rsp;
160  if (word)
161  {
162  for (i = 0; i < BITS_PER_WORD; ++i)
163  {
164  if (word & (1 << i))
165  {
166  itemno = rrhs[ruleno+i];
167  while (csp < csend && *csp < itemno)
168  *itemsetend++ = *csp++;
169  *itemsetend++ = itemno;
170  while (csp < csend && *csp == itemno)
171  ++csp;
172  }
173  }
174  }
175  ruleno += BITS_PER_WORD;
176  }
177 
178  while (csp < csend)
179  *itemsetend++ = *csp++;
180 
181 #ifdef DEBUG
182  print_closure(n);
183 #endif
184 }
185 
186 
187 
188 void
190 {
191  FREE(itemset);
192  FREE(ruleset);
193  FREE(first_derives + ntokens * WORDSIZE(nrules));
194 }
195 
196 
197 #ifdef DEBUG
198 
199 static void
200 print_closure(int n)
201 {
202  short *isp;
203 
204  printf("\n\nn = %d\n\n", n);
205  for (isp = itemset; isp < itemsetend; isp++)
206  printf(" %d\n", *isp);
207 }
208 
209 
210 static void
211 print_EFF(void)
212 {
213  int i, j;
214  unsigned *rowp;
215  unsigned word;
216  unsigned k;
217 
218  printf("\n\nEpsilon Free Firsts\n");
219 
220  for (i = start_symbol; i < nsyms; i++)
221  {
222  printf("\n%s", symbol_name[i]);
223  rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
224  word = *rowp++;
225 
226  k = BITS_PER_WORD;
227  for (j = 0; j < nvars; k++, j++)
228  {
229  if (k >= BITS_PER_WORD)
230  {
231  word = *rowp++;
232  k = 0;
233  }
234 
235  if (word & (1 << k))
236  printf(" %s", symbol_name[start_symbol + j]);
237  }
238  }
239 }
240 
241 
242 static void
243 print_first_derives(void)
244 {
245  int i;
246  int j;
247  unsigned *rp;
248  unsigned cword;
249  unsigned k;
250 
251  printf("\n\n\nFirst Derives\n");
252 
253  for (i = start_symbol; i < nsyms; i++)
254  {
255  printf("\n%s derives\n", symbol_name[i]);
256  rp = first_derives + i * WORDSIZE(nrules);
257  k = BITS_PER_WORD;
258  for (j = 0; j <= nrules; k++, j++)
259  {
260  if (k >= BITS_PER_WORD)
261  {
262  cword = *rp++;
263  k = 0;
264  }
265 
266  if (cword & (1 << k))
267  printf(" %d\n", j);
268  }
269  }
270 
271  fflush(stdout);
272 }
273 
274 #endif
int i
Definition: scan.c:967
#define NEW2(n, t)
Definition: defs.h:113
unsigned * ruleset
Definition: closure.c:14
short * itemset
Definition: closure.c:12
#define printf
Definition: epicsStdio.h:41
void set_first_derives(void)
Definition: closure.c:64
short * itemsetend
Definition: closure.c:13
int nrules
Definition: antelope.c:56
#define ISVAR(s)
Definition: defs.h:104
int nsyms
Definition: antelope.c:57
#define BITS_PER_WORD
Definition: defs.h:33
void reflexive_transitive_closure(unsigned int *R, int n)
Definition: warshall.c:63
int nvars
Definition: antelope.c:59
void finalize_closure(void)
Definition: closure.c:189
#define WORDSIZE(n)
Definition: defs.h:34
short ** derives
Definition: antelope.c:72
void closure(short int *nucleus, int n)
Definition: closure.c:120
short * ritem
Definition: antelope.c:67
#define stdout
Definition: epicsStdio.h:30
#define FREE(x)
Definition: defs.h:110
int start_symbol
Definition: antelope.c:61
short * rrhs
Definition: antelope.c:69
#define SETBIT(r, n)
Definition: defs.h:36
int ntokens
Definition: antelope.c:58
char ** symbol_name
Definition: antelope.c:62