projects
/
bison.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* GNUmakefile: Update git-version-gen invocation so make dist
[bison.git]
/
src
/
closure.c
diff --git
a/src/closure.c
b/src/closure.c
index 0169ee0f48578f1c7a3f84fa0fb9b921fe11cbd9..ff3109caf0c5736d25da0c55ed140e81b1ab7b57 100644
(file)
--- a/
src/closure.c
+++ b/
src/closure.c
@@
-1,38
+1,41
@@
-/* Subroutines for bison
- Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
+/* Closures for Bison
+
+ Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2007 Free
+ Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
This file is part of Bison, the GNU Compiler Compiler.
- Bison is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation
; either version 2, or (at your option)
- any later version.
+ This program is free software: you can redistribute it and/or modify
+
it
under the terms of the GNU General Public License as published by
+ the Free Software Foundation
, either version 3 of the License, or
+
(at your option)
any later version.
- Bison is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU
- General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+
but
WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ G
NU G
eneral Public License for more details.
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
- along with Bison; see the file COPYING. If not, write to the Free
- Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+#include <config.h>
#include "system.h"
#include "system.h"
-#include "quotearg.h"
-#include "bitset.h"
-#include "bitsetv.h"
-#include "bitsetv-print.h"
+
+#include <bitset.h>
+#include <bitsetv-print.h>
+#include <bitsetv.h>
+#include <quotearg.h>
+
+#include "closure.h"
+#include "derives.h"
#include "getargs.h"
#include "getargs.h"
-#include "symtab.h"
#include "gram.h"
#include "reader.h"
#include "gram.h"
#include "reader.h"
-#include "closure.h"
-#include "derives.h"
+#include "symtab.h"
/* NITEMSET is the size of the array ITEMSET. */
/* NITEMSET is the size of the array ITEMSET. */
-item_number
_t
*itemset;
-
int nr
itemset;
+item_number *itemset;
+
size_t n
itemset;
static bitset ruleset;
static bitset ruleset;
@@
-50,17
+53,17
@@
static bitsetv firsts = NULL;
`-----------------*/
static void
`-----------------*/
static void
-print_closure (c
onst char *title, item_number_t
*array, size_t size)
+print_closure (c
har const *title, item_number
*array, size_t size)
{
size_t i;
{
size_t i;
- fprintf (stderr,
_("Closure: %s\n")
, title);
+ fprintf (stderr,
"Closure: %s\n"
, title);
for (i = 0; i < size; ++i)
{
for (i = 0; i < size; ++i)
{
- item_number
_t
*rp;
+ item_number *rp;
fprintf (stderr, " %2d: .", array[i]);
for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
fprintf (stderr, " %s", symbols[*rp]->tag);
fprintf (stderr, " %2d: .", array[i]);
for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
fprintf (stderr, " %s", symbols[*rp]->tag);
- fprintf (stderr,
_(" (rule %d)\n")
, -*rp - 1);
+ fprintf (stderr,
" (rule %d)\n"
, -*rp - 1);
}
fputs ("\n\n", stderr);
}
}
fputs ("\n\n", stderr);
}
@@
-69,7
+72,7
@@
print_closure (const char *title, item_number_t *array, size_t size)
static void
print_firsts (void)
{
static void
print_firsts (void)
{
- symbol_number
_t
i, j;
+ symbol_number i, j;
fprintf (stderr, "FIRSTS\n");
for (i = ntokens; i < nsyms; i++)
fprintf (stderr, "FIRSTS\n");
for (i = ntokens; i < nsyms; i++)
@@
-90,7
+93,7
@@
static void
print_fderives (void)
{
int i;
print_fderives (void)
{
int i;
- rule_number
_t
r;
+ rule_number r;
fprintf (stderr, "FDERIVES\n");
for (i = ntokens; i < nsyms; i++)
fprintf (stderr, "FDERIVES\n");
for (i = ntokens; i < nsyms; i++)
@@
-120,23
+123,23
@@
print_fderives (void)
static void
set_firsts (void)
{
static void
set_firsts (void)
{
- symbol_number
_t
i, j;
+ symbol_number i, j;
firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
for (i = ntokens; i < nsyms; i++)
firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
for (i = ntokens; i < nsyms; i++)
- for (j = 0; derives[i][j]; ++j)
+ for (j = 0; derives[i
- ntokens
][j]; ++j)
{
{
- i
nt symbol = derives[i
][j]->rhs[0];
- if (ISVAR (sym
bol
))
- bitset_set (FIRSTS (i), sym
bol
- ntokens);
+ i
tem_number sym = derives[i - ntokens
][j]->rhs[0];
+ if (ISVAR (sym))
+ bitset_set (FIRSTS (i), sym - ntokens);
}
if (trace_flag & trace_sets)
}
if (trace_flag & trace_sets)
- bitsetv_matrix_dump (stderr,
_("RTC: Firsts Input")
, firsts);
+ bitsetv_matrix_dump (stderr,
"RTC: Firsts Input"
, firsts);
bitsetv_reflexive_transitive_closure (firsts);
if (trace_flag & trace_sets)
bitsetv_reflexive_transitive_closure (firsts);
if (trace_flag & trace_sets)
- bitsetv_matrix_dump (stderr,
_("RTC: Firsts Output")
, firsts);
+ bitsetv_matrix_dump (stderr,
"RTC: Firsts Output"
, firsts);
if (trace_flag & trace_sets)
print_firsts ();
if (trace_flag & trace_sets)
print_firsts ();
@@
-155,8
+158,8
@@
set_firsts (void)
static void
set_fderives (void)
{
static void
set_fderives (void)
{
- symbol_number
_t
i, j;
- rule_number
_t
k;
+ symbol_number i, j;
+ rule_number k;
fderives = bitsetv_create (nvars, nrules, BITSET_FIXED);
fderives = bitsetv_create (nvars, nrules, BITSET_FIXED);
@@
-165,8
+168,8
@@
set_fderives (void)
for (i = ntokens; i < nsyms; ++i)
for (j = ntokens; j < nsyms; ++j)
if (bitset_test (FIRSTS (i), j - ntokens))
for (i = ntokens; i < nsyms; ++i)
for (j = ntokens; j < nsyms; ++j)
if (bitset_test (FIRSTS (i), j - ntokens))
- for (k = 0; derives[j][k]; ++k)
- bitset_set (FDERIVES (i), derives[j][k]->number);
+ for (k = 0; derives[j
- ntokens
][k]; ++k)
+ bitset_set (FDERIVES (i), derives[j
- ntokens
][k]->number);
if (trace_flag & trace_sets)
print_fderives ();
if (trace_flag & trace_sets)
print_fderives ();
@@
-177,9
+180,9
@@
set_fderives (void)
\f
void
\f
void
-new_closure (int n)
+new_closure (
unsigned
int n)
{
{
- itemset =
XCALLOC (item_number_t, n
);
+ itemset =
xnmalloc (n, sizeof *itemset
);
ruleset = bitset_create (nrules, BITSET_FIXED);
ruleset = bitset_create (nrules, BITSET_FIXED);
@@
-189,18
+192,18
@@
new_closure (int n)
void
void
-closure (item_number
_t *core, in
t n)
+closure (item_number
*core, size_
t n)
{
/* Index over CORE. */
{
/* Index over CORE. */
-
in
t c;
+
size_
t c;
/* A bit index over RULESET. */
/* A bit index over RULESET. */
- rule_number
_t
ruleno;
+ rule_number ruleno;
bitset_iterator iter;
if (trace_flag & trace_sets)
bitset_iterator iter;
if (trace_flag & trace_sets)
- print_closure (
_("input")
, core, n);
+ print_closure (
"input"
, core, n);
bitset_zero (ruleset);
bitset_zero (ruleset);
@@
-208,37
+211,39
@@
closure (item_number_t *core, int n)
if (ISVAR (ritem[core[c]]))
bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
if (ISVAR (ritem[core[c]]))
bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
- nritemset = 0;
+ /* core is sorted on item index in ritem, which is sorted on rule number.
+ Compute itemset with the same sort. */
+ nitemset = 0;
c = 0;
BITSET_FOR_EACH (iter, ruleset, ruleno, 0)
{
c = 0;
BITSET_FOR_EACH (iter, ruleset, ruleno, 0)
{
- item_number
_t
itemno = rules[ruleno].rhs - ritem;
+ item_number itemno = rules[ruleno].rhs - ritem;
while (c < n && core[c] < itemno)
{
while (c < n && core[c] < itemno)
{
- itemset[n
r
itemset] = core[c];
- n
r
itemset++;
+ itemset[nitemset] = core[c];
+ nitemset++;
c++;
}
c++;
}
- itemset[n
r
itemset] = itemno;
- n
r
itemset++;
+ itemset[nitemset] = itemno;
+ nitemset++;
};
while (c < n)
{
};
while (c < n)
{
- itemset[n
r
itemset] = core[c];
- n
r
itemset++;
+ itemset[nitemset] = core[c];
+ nitemset++;
c++;
}
if (trace_flag & trace_sets)
c++;
}
if (trace_flag & trace_sets)
- print_closure (
_("output"), itemset, nr
itemset);
+ print_closure (
"output", itemset, n
itemset);
}
void
free_closure (void)
{
}
void
free_closure (void)
{
-
XFREE
(itemset);
+
free
(itemset);
bitset_free (ruleset);
bitsetv_free (fderives);
}
bitset_free (ruleset);
bitsetv_free (fderives);
}