This is Unofficial EPICS BASE Doxygen Site
closure.c File Reference
#include "defs.h"
+ Include dependency graph for closure.c:

Go to the source code of this file.

Functions

void set_first_derives (void)
 
void closure (short int *nucleus, int n)
 
void finalize_closure (void)
 

Variables

short * itemset
 
short * itemsetend
 
unsigned * ruleset
 

Function Documentation

void closure ( short int *  nucleus,
int  n 
)

Definition at line 120 of file closure.c.

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 }
int i
Definition: scan.c:967
unsigned * ruleset
Definition: closure.c:14
short * itemset
Definition: closure.c:12
short * itemsetend
Definition: closure.c:13
int nrules
Definition: antelope.c:56
#define ISVAR(s)
Definition: defs.h:104
#define BITS_PER_WORD
Definition: defs.h:33
#define WORDSIZE(n)
Definition: defs.h:34
short * ritem
Definition: antelope.c:67
short * rrhs
Definition: antelope.c:69
void finalize_closure ( void  )

Definition at line 189 of file closure.c.

190 {
191  FREE(itemset);
192  FREE(ruleset);
193  FREE(first_derives + ntokens * WORDSIZE(nrules));
194 }
unsigned * ruleset
Definition: closure.c:14
short * itemset
Definition: closure.c:12
int nrules
Definition: antelope.c:56
#define WORDSIZE(n)
Definition: defs.h:34
#define FREE(x)
Definition: defs.h:110
int ntokens
Definition: antelope.c:58
void set_first_derives ( void  )

Definition at line 64 of file closure.c.

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 }
int i
Definition: scan.c:967
#define NEW2(n, t)
Definition: defs.h:113
int nrules
Definition: antelope.c:56
int nsyms
Definition: antelope.c:57
#define BITS_PER_WORD
Definition: defs.h:33
int nvars
Definition: antelope.c:59
#define WORDSIZE(n)
Definition: defs.h:34
short ** derives
Definition: antelope.c:72
#define FREE(x)
Definition: defs.h:110
int start_symbol
Definition: antelope.c:61
#define SETBIT(r, n)
Definition: defs.h:36
int ntokens
Definition: antelope.c:58

Variable Documentation

short* itemset

Definition at line 12 of file closure.c.

short* itemsetend

Definition at line 13 of file closure.c.

unsigned* ruleset

Definition at line 14 of file closure.c.