PageRenderTime 55ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/contrib/byacc/closure.c

https://bitbucket.org/freebsd/freebsd-head/
C | 251 lines | 211 code | 39 blank | 1 comment | 31 complexity | 0068390aabee17d45f5cb07275ae1e2a MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause, LGPL-2.0, LGPL-2.1, BSD-2-Clause, 0BSD, JSON, AGPL-1.0, GPL-2.0
  1. /* $Id: closure.c,v 1.9 2010/06/09 08:21:47 tom Exp $ */
  2. #include "defs.h"
  3. Value_t *itemset;
  4. Value_t *itemsetend;
  5. unsigned *ruleset;
  6. static unsigned *first_derives;
  7. static unsigned *EFF;
  8. static void
  9. set_EFF(void)
  10. {
  11. unsigned *row;
  12. int symbol;
  13. short *sp;
  14. int rowsize;
  15. int i;
  16. int rule;
  17. rowsize = WORDSIZE(nvars);
  18. EFF = NEW2(nvars * rowsize, unsigned);
  19. row = EFF;
  20. for (i = start_symbol; i < nsyms; i++)
  21. {
  22. sp = derives[i];
  23. for (rule = *sp; rule > 0; rule = *++sp)
  24. {
  25. symbol = ritem[rrhs[rule]];
  26. if (ISVAR(symbol))
  27. {
  28. symbol -= start_symbol;
  29. SETBIT(row, symbol);
  30. }
  31. }
  32. row += rowsize;
  33. }
  34. reflexive_transitive_closure(EFF, nvars);
  35. #ifdef DEBUG
  36. print_EFF();
  37. #endif
  38. }
  39. void
  40. set_first_derives(void)
  41. {
  42. unsigned *rrow;
  43. unsigned *vrow;
  44. int j;
  45. unsigned k;
  46. unsigned cword = 0;
  47. short *rp;
  48. int rule;
  49. int i;
  50. int rulesetsize;
  51. int varsetsize;
  52. rulesetsize = WORDSIZE(nrules);
  53. varsetsize = WORDSIZE(nvars);
  54. first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
  55. set_EFF();
  56. rrow = first_derives + ntokens * rulesetsize;
  57. for (i = start_symbol; i < nsyms; i++)
  58. {
  59. vrow = EFF + ((i - ntokens) * varsetsize);
  60. k = BITS_PER_WORD;
  61. for (j = start_symbol; j < nsyms; k++, j++)
  62. {
  63. if (k >= BITS_PER_WORD)
  64. {
  65. cword = *vrow++;
  66. k = 0;
  67. }
  68. if (cword & (unsigned)(1 << k))
  69. {
  70. rp = derives[j];
  71. while ((rule = *rp++) >= 0)
  72. {
  73. SETBIT(rrow, rule);
  74. }
  75. }
  76. }
  77. rrow += rulesetsize;
  78. }
  79. #ifdef DEBUG
  80. print_first_derives();
  81. #endif
  82. FREE(EFF);
  83. }
  84. void
  85. closure(short *nucleus, int n)
  86. {
  87. unsigned ruleno;
  88. unsigned word;
  89. unsigned i;
  90. Value_t *csp;
  91. unsigned *dsp;
  92. unsigned *rsp;
  93. int rulesetsize;
  94. Value_t *csend;
  95. unsigned *rsend;
  96. int symbol;
  97. Value_t itemno;
  98. rulesetsize = WORDSIZE(nrules);
  99. rsend = ruleset + rulesetsize;
  100. for (rsp = ruleset; rsp < rsend; rsp++)
  101. *rsp = 0;
  102. csend = nucleus + n;
  103. for (csp = nucleus; csp < csend; ++csp)
  104. {
  105. symbol = ritem[*csp];
  106. if (ISVAR(symbol))
  107. {
  108. dsp = first_derives + symbol * rulesetsize;
  109. rsp = ruleset;
  110. while (rsp < rsend)
  111. *rsp++ |= *dsp++;
  112. }
  113. }
  114. ruleno = 0;
  115. itemsetend = itemset;
  116. csp = nucleus;
  117. for (rsp = ruleset; rsp < rsend; ++rsp)
  118. {
  119. word = *rsp;
  120. if (word)
  121. {
  122. for (i = 0; i < BITS_PER_WORD; ++i)
  123. {
  124. if (word & (unsigned)(1 << i))
  125. {
  126. itemno = rrhs[ruleno + i];
  127. while (csp < csend && *csp < itemno)
  128. *itemsetend++ = *csp++;
  129. *itemsetend++ = itemno;
  130. while (csp < csend && *csp == itemno)
  131. ++csp;
  132. }
  133. }
  134. }
  135. ruleno += BITS_PER_WORD;
  136. }
  137. while (csp < csend)
  138. *itemsetend++ = *csp++;
  139. #ifdef DEBUG
  140. print_closure(n);
  141. #endif
  142. }
  143. void
  144. finalize_closure(void)
  145. {
  146. FREE(itemset);
  147. FREE(ruleset);
  148. FREE(first_derives + ntokens * WORDSIZE(nrules));
  149. }
  150. #ifdef DEBUG
  151. void
  152. print_closure(int n)
  153. {
  154. short *isp;
  155. printf("\n\nn = %d\n\n", n);
  156. for (isp = itemset; isp < itemsetend; isp++)
  157. printf(" %d\n", *isp);
  158. }
  159. void
  160. print_EFF(void)
  161. {
  162. int i, j;
  163. unsigned *rowp;
  164. unsigned word;
  165. unsigned k;
  166. printf("\n\nEpsilon Free Firsts\n");
  167. for (i = start_symbol; i < nsyms; i++)
  168. {
  169. printf("\n%s", symbol_name[i]);
  170. rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
  171. word = *rowp++;
  172. k = BITS_PER_WORD;
  173. for (j = 0; j < nvars; k++, j++)
  174. {
  175. if (k >= BITS_PER_WORD)
  176. {
  177. word = *rowp++;
  178. k = 0;
  179. }
  180. if (word & (1 << k))
  181. printf(" %s", symbol_name[start_symbol + j]);
  182. }
  183. }
  184. }
  185. void
  186. print_first_derives(void)
  187. {
  188. int i;
  189. int j;
  190. unsigned *rp;
  191. unsigned cword = 0;
  192. unsigned k;
  193. printf("\n\n\nFirst Derives\n");
  194. for (i = start_symbol; i < nsyms; i++)
  195. {
  196. printf("\n%s derives\n", symbol_name[i]);
  197. rp = first_derives + i * WORDSIZE(nrules);
  198. k = BITS_PER_WORD;
  199. for (j = 0; j <= nrules; k++, j++)
  200. {
  201. if (k >= BITS_PER_WORD)
  202. {
  203. cword = *rp++;
  204. k = 0;
  205. }
  206. if (cword & (1 << k))
  207. printf(" %d\n", j);
  208. }
  209. }
  210. fflush(stdout);
  211. }
  212. #endif