1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Closures for Bison
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005 Free
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Software Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison is free software; you can redistribute it and/or modify it
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   under the terms of the GNU General Public License as published by
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison is distributed in the hope that it will be useful, but
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   WITHOUT ANY WARRANTY; without even the implied warranty of
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with Bison; see the file COPYING.  If not, write to the Free
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   02110-1301, USA.  */
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitset.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitsetv-print.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitsetv.h>
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h>
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "closure.h"
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "derives.h"
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h"
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h"
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h"
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* NITEMSET is the size of the array ITEMSET.  */
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number *itemset;
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t nritemset;
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset ruleset;
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* internal data.  See comments before set_fderives and set_firsts.  */
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitsetv fderives = NULL;
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitsetv firsts = NULL;
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var.  */
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define FDERIVES(Var)   fderives[(Var) - ntokens]
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define   FIRSTS(Var)   firsts[(Var) - ntokens]
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------.
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Debugging code.  |
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------*/
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_closure (char const *title, item_number *array, size_t size)
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t i;
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "Closure: %s\n", title);
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < size; ++i)
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      item_number *rp;
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "  %2d: .", array[i]);
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fprintf (stderr, " %s", symbols[*rp]->tag);
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "  (rule %d)\n", -*rp - 1);
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("\n\n", stderr);
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_firsts (void)
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i, j;
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "FIRSTS\n");
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_iterator iter;
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "\t%s firsts\n", symbols[i]->tag);
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      BITSET_FOR_EACH (iter, FIRSTS (i), j, 0)
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (stderr, "\t\t%s\n",
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		   symbols[j + ntokens]->tag);
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "\n\n");
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_fderives (void)
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number r;
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "FDERIVES\n");
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_iterator iter;
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      BITSET_FOR_EACH (iter, FDERIVES (i), r, 0)
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (stderr, "\t\t%3d ", r);
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  rule_rhs_print (&rules[r], stderr);
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr, "\n\n");
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set FIRSTS to be an NVARS array of NVARS bitsets indicating which |
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| items can represent the beginning of the input corresponding to   |
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| which other items.                                                |
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                   |
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For example, if some rule expands symbol 5 into the sequence of   |
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| symbols 8 3 20, the symbol 8 can be the beginning of the data for |
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| symbol 5, so the bit [8 - ntokens] in first[5 - ntokens] (= FIRST |
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| (5)) is set.                                                      |
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset_firsts (void)
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i, j;
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (j = 0; derives[i - ntokens][j]; ++j)
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	item_number sym = derives[i - ntokens][j]->rhs[0];
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (ISVAR (sym))
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  bitset_set (FIRSTS (i), sym - ntokens);
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitsetv_matrix_dump (stderr, "RTC: Firsts Input", firsts);
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitsetv_reflexive_transitive_closure (firsts);
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitsetv_matrix_dump (stderr, "RTC: Firsts Output", firsts);
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_firsts ();
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------.
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Set FDERIVES to an NVARS by NRULES matrix of bits indicating which |
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| rules can help derive the beginning of the data for each           |
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| nonterminal.                                                       |
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project|                                                                    |
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For example, if symbol 5 can be derived as the sequence of symbols |
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| 8 3 20, and one of the rules for deriving symbol 8 is rule 4, then |
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| the [5 - NTOKENS, 4] bit in FDERIVES is set.                       |
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectset_fderives (void)
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i, j;
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number k;
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fderives = bitsetv_create (nvars, nrules, BITSET_FIXED);
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  set_firsts ();
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; ++i)
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (j = ntokens; j < nsyms; ++j)
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (bitset_test (FIRSTS (i), j - ntokens))
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (k = 0; derives[j - ntokens][k]; ++k)
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  bitset_set (FDERIVES (i), derives[j - ntokens][k]->number);
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_fderives ();
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitsetv_free (firsts);
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnew_closure (unsigned int n)
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  itemset = xnmalloc (n, sizeof *itemset);
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ruleset = bitset_create (nrules, BITSET_FIXED);
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  set_fderives ();
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectclosure (item_number *core, size_t n)
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Index over CORE. */
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t c;
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* A bit index over RULESET. */
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule_number ruleno;
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_iterator iter;
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_closure ("input", core, n);
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_zero (ruleset);
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (c = 0; c < n; ++c)
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (ISVAR (ritem[core[c]]))
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  nritemset = 0;
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  c = 0;
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  BITSET_FOR_EACH (iter, ruleset, ruleno, 0)
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      item_number itemno = rules[ruleno].rhs - ritem;
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (c < n && core[c] < itemno)
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  itemset[nritemset] = core[c];
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  nritemset++;
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  c++;
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      itemset[nritemset] = itemno;
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      nritemset++;
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    };
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (c < n)
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      itemset[nritemset] = core[c];
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      nritemset++;
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      c++;
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (trace_flag & trace_sets)
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_closure ("output", itemset, nritemset);
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfree_closure (void)
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  free (itemset);
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_free (ruleset);
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitsetv_free (fderives);
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
250