@@ -24,19 +24,19 @@ void set_EFF(void)
2424
2525 row = EFF ;
2626 for (i = start_symbol ; i < nsyms ; i ++ )
27+ {
28+ sp = derives [i ];
29+ for (rule = * sp ; rule > 0 ; rule = * ++ sp )
2730 {
28- sp = derives [i ];
29- for (rule = * sp ; rule > 0 ; rule = * ++ sp )
30- {
31- symbol = ritem [rrhs [rule ]];
32- if (ISVAR (symbol ))
33- {
34- symbol -= start_symbol ;
35- SETBIT (row , symbol );
36- }
37- }
38- row += rowsize ;
31+ symbol = ritem [rrhs [rule ]];
32+ if (ISVAR (symbol ))
33+ {
34+ symbol -= start_symbol ;
35+ SETBIT (row , symbol );
36+ }
3937 }
38+ row += rowsize ;
39+ }
4040
4141 reflexive_transitive_closure (EFF , nvars );
4242
@@ -68,31 +68,31 @@ void set_first_derives(void)
6868
6969 rrow = first_derives + ntokens * rulesetsize ;
7070 for (i = start_symbol ; i < nsyms ; i ++ )
71+ {
72+ vrow = EFF + ((i - ntokens ) * varsetsize );
73+ k = BITS_PER_WORD ;
74+ for (j = start_symbol ; j < nsyms ; k ++ , j ++ )
7175 {
72- vrow = EFF + ((i - ntokens ) * varsetsize );
73- k = BITS_PER_WORD ;
74- for (j = start_symbol ; j < nsyms ; k ++ , j ++ )
76+ if (k >= BITS_PER_WORD )
77+ {
78+ cword = * vrow ++ ;
79+ k = 0 ;
80+ }
81+
82+ if (cword & (1 << k ))
83+ {
84+ rp = derives [j ];
85+ while ((rule = * rp ++ ) >= 0 )
7586 {
76- if (k >= BITS_PER_WORD )
77- {
78- cword = * vrow ++ ;
79- k = 0 ;
80- }
81-
82- if (cword & (1 << k ))
83- {
84- rp = derives [j ];
85- while ((rule = * rp ++ ) >= 0 )
86- {
87- SETBIT (rrow , rule );
88- }
89- }
87+ SETBIT (rrow , rule );
9088 }
91-
92- vrow += varsetsize ;
93- rrow += rulesetsize ;
89+ }
9490 }
9591
92+ vrow += varsetsize ;
93+ rrow += rulesetsize ;
94+ }
95+
9696#ifdef DEBUG
9797 print_first_derives ();
9898#endif
@@ -124,40 +124,40 @@ void closure(short *nucleus, int n)
124124
125125 csend = nucleus + n ;
126126 for (csp = nucleus ; csp < csend ; ++ csp )
127+ {
128+ symbol = ritem [* csp ];
129+ if (ISVAR (symbol ))
127130 {
128- symbol = ritem [* csp ];
129- if (ISVAR (symbol ))
130- {
131- dsp = first_derives + symbol * rulesetsize ;
132- rsp = ruleset ;
133- while (rsp < rsend )
134- * rsp ++ |= * dsp ++ ;
135- }
131+ dsp = first_derives + symbol * rulesetsize ;
132+ rsp = ruleset ;
133+ while (rsp < rsend )
134+ * rsp ++ |= * dsp ++ ;
136135 }
136+ }
137137
138138 ruleno = 0 ;
139139 itemsetend = itemset ;
140140 csp = nucleus ;
141141 for (rsp = ruleset ; rsp < rsend ; ++ rsp )
142+ {
143+ word = * rsp ;
144+ if (word )
142145 {
143- word = * rsp ;
144- if (word )
146+ for (i = 0 ; i < BITS_PER_WORD ; ++ i )
147+ {
148+ if (word & (1 << i ))
145149 {
146- for (i = 0 ; i < BITS_PER_WORD ; ++ i )
147- {
148- if (word & (1 << i ))
149- {
150- itemno = rrhs [ruleno + i ];
151- while (csp < csend && * csp < itemno )
152- * itemsetend ++ = * csp ++ ;
153- * itemsetend ++ = itemno ;
154- while (csp < csend && * csp == itemno )
155- ++ csp ;
156- }
157- }
150+ itemno = rrhs [ruleno + i ];
151+ while (csp < csend && * csp < itemno )
152+ * itemsetend ++ = * csp ++ ;
153+ * itemsetend ++ = itemno ;
154+ while (csp < csend && * csp == itemno )
155+ ++ csp ;
158156 }
159- ruleno += BITS_PER_WORD ;
157+ }
160158 }
159+ ruleno += BITS_PER_WORD ;
160+ }
161161
162162 while (csp < csend )
163163 * itemsetend ++ = * csp ++ ;
@@ -198,24 +198,24 @@ void print_EFF(void)
198198 printf ("\n\nEpsilon Free Firsts\n" );
199199
200200 for (i = start_symbol ; i < nsyms ; i ++ )
201- {
202- printf ("\n%s" , symbol_name [i ]);
203- rowp = EFF + ((i - start_symbol ) * WORDSIZE (nvars ));
204- word = * rowp ++ ;
201+ {
202+ printf ("\n%s" , symbol_name [i ]);
203+ rowp = EFF + ((i - start_symbol ) * WORDSIZE (nvars ));
204+ word = * rowp ++ ;
205205
206- k = BITS_PER_WORD ;
207- for (j = 0 ; j < nvars ; k ++ , j ++ )
208- {
209- if (k >= BITS_PER_WORD )
210- {
211- word = * rowp ++ ;
212- k = 0 ;
213- }
214-
215- if (word & (1 << k ))
216- printf (" %s" , symbol_name [start_symbol + j ]);
217- }
206+ k = BITS_PER_WORD ;
207+ for (j = 0 ; j < nvars ; k ++ , j ++ )
208+ {
209+ if (k >= BITS_PER_WORD )
210+ {
211+ word = * rowp ++ ;
212+ k = 0 ;
213+ }
214+
215+ if (word & (1 << k ))
216+ printf (" %s" , symbol_name [start_symbol + j ]);
218217 }
218+ }
219219}
220220
221221
@@ -230,22 +230,22 @@ void print_first_derives(void)
230230 printf ("\n\n\nFirst Derives\n" );
231231
232232 for (i = start_symbol ; i < nsyms ; i ++ )
233+ {
234+ printf ("\n%s derives\n" , symbol_name [i ]);
235+ rp = first_derives + i * WORDSIZE (nrules );
236+ k = BITS_PER_WORD ;
237+ for (j = 0 ; j <= nrules ; k ++ , j ++ )
233238 {
234- printf ("\n%s derives\n" , symbol_name [i ]);
235- rp = first_derives + i * WORDSIZE (nrules );
236- k = BITS_PER_WORD ;
237- for (j = 0 ; j <= nrules ; k ++ , j ++ )
238- {
239- if (k >= BITS_PER_WORD )
240- {
241- cword = * rp ++ ;
242- k = 0 ;
243- }
244-
245- if (cword & (1 << k ))
246- printf (" %d\n" , j );
247- }
239+ if (k >= BITS_PER_WORD )
240+ {
241+ cword = * rp ++ ;
242+ k = 0 ;
243+ }
244+
245+ if (cword & (1 << k ))
246+ printf (" %d\n" , j );
248247 }
248+ }
249249
250250 fflush (stdout );
251251}
0 commit comments