]> git.saurik.com Git - bison.git/commitdiff
Because useless nonterminals are now kept alive (instead of being
authorAkim Demaille <akim@epita.fr>
Wed, 5 Dec 2001 09:27:23 +0000 (09:27 +0000)
committerAkim Demaille <akim@epita.fr>
Wed, 5 Dec 2001 09:27:23 +0000 (09:27 +0000)
`destroyed'), we now sometimes examine them, and store information
related to them.  Hence we need to know their number, and adjust
memory allocations.
* src/reduce.c, src/reduce.h (nuseless_nonterminals): No longer
static.
* src/LR0.c (allocate_itemsets): The memory allocated to
`symbol_count' was used for two different purpose: once to count
the number of occurrences of each symbol, and later reassigned to
`shift_symbol', containing the symbol that can be shifted from a
given state.
Deobfuscate, i.e., allocate, use and free `symbol_count' here
only, and...
(new_itemsets): Allocate `shift_symbol' here.
(allocate_itemsets): symbol_count includes useless nonterminals.
Make room for them.
(free_storage): Use `free', not `XFREE', for pointers that cannot
be null.

ChangeLog
src/LR0.c
src/nullable.c
src/reduce.c
src/reduce.h

index 6cd76086f395625485a9232839de442dac48ff25..d08aba9f38fc815afba0f63d4f357ae3b2bf40dc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2001-12-05  Akim Demaille  <akim@epita.fr>
+
+       Because useless nonterminals are now kept alive (instead of being
+       `destroyed'), we now sometimes examine them, and store information
+       related to them.  Hence we need to know their number, and adjust
+       memory allocations.
+
+       * src/reduce.c, src/reduce.h (nuseless_nonterminals): No longer
+       static.
+       * src/LR0.c (allocate_itemsets): The memory allocated to
+       `symbol_count' was used for two different purpose: once to count
+       the number of occurrences of each symbol, and later reassigned to
+       `shift_symbol', containing the symbol that can be shifted from a
+       given state.
+       Deobfuscate, i.e., allocate, use and free `symbol_count' here
+       only, and...
+       (new_itemsets): Allocate `shift_symbol' here.
+       (allocate_itemsets): symbol_count includes useless nonterminals.
+       Make room for them.
+       (free_storage): Use `free', not `XFREE', for pointers that cannot
+       be null.
+
+       
 2001-12-05  Akim Demaille  <akim@epita.fr>
 
        * src/nullable.c (set_nullable): Deobfuscate the handling of
 2001-12-05  Akim Demaille  <akim@epita.fr>
 
        * src/nullable.c (set_nullable): Deobfuscate the handling of
index ef5624d434a63f8296d5c2ebf813d637cdf2e734..48ba5a6d6e411b3881bf6366ba2dba14e62f7455 100644 (file)
--- a/src/LR0.c
+++ b/src/LR0.c
@@ -30,7 +30,7 @@
 #include "complain.h"
 #include "closure.h"
 #include "LR0.h"
 #include "complain.h"
 #include "closure.h"
 #include "LR0.h"
-
+#include "reduce.h"
 
 int nstates;
 int final_state;
 
 int nstates;
 int final_state;
@@ -63,11 +63,13 @@ static void
 allocate_itemsets (void)
 {
   int i;
 allocate_itemsets (void)
 {
   int i;
-  int count;
-  short *symbol_count = NULL;
 
 
-  count = 0;
-  symbol_count = XCALLOC (short, nsyms);
+  /* Count the number of occurrences of all the symbols in RITEMS.
+     Note that useless productions (hence useless nonterminals) are
+     browsed too, hence we need to allocate room for _all_ the
+     symbols.  */
+  int count = 0;
+  short *symbol_count = XCALLOC (short, nsyms + nuseless_nonterminals);
 
   for (i = 0; ritem[i]; ++i)
     if (ritem[i] > 0)
 
   for (i = 0; ritem[i]; ++i)
     if (ritem[i] > 0)
@@ -93,7 +95,7 @@ allocate_itemsets (void)
       count += symbol_count[i];
     }
 
       count += symbol_count[i];
     }
 
-  shift_symbol = symbol_count;
+  free (symbol_count);
   kernel_size = XCALLOC (int, nsyms);
 }
 
   kernel_size = XCALLOC (int, nsyms);
 }
 
@@ -112,13 +114,13 @@ allocate_storage (void)
 static void
 free_storage (void)
 {
 static void
 free_storage (void)
 {
-  XFREE (shift_symbol);
-  XFREE (redset);
-  XFREE (shiftset);
-  XFREE (kernel_base);
-  XFREE (kernel_size);
+  free (shift_symbol);
+  free (redset);
+  free (shiftset);
+  free (kernel_base);
+  free (kernel_size);
   XFREE (kernel_items);
   XFREE (kernel_items);
-  XFREE (state_table);
+  free (state_table);
 }
 
 
 }
 
 
@@ -148,6 +150,7 @@ new_itemsets (void)
   for (i = 0; i < nsyms; i++)
     kernel_size[i] = 0;
 
   for (i = 0; i < nsyms; i++)
     kernel_size[i] = 0;
 
+  shift_symbol = XCALLOC (short, nsyms);
   shiftcount = 0;
 
   for (i = 0; i < itemsetsize; ++i)
   shiftcount = 0;
 
   for (i = 0; i < itemsetsize; ++i)
index 74164937f7296d020152b99dc04315ff900a9068..2797180c4496e51341627394bbb84bb352c36831 100644 (file)
@@ -28,6 +28,7 @@
 #include "reader.h"
 #include "types.h"
 #include "gram.h"
 #include "reader.h"
 #include "types.h"
 #include "gram.h"
+#include "reduce.h"
 #include "nullable.h"
 
 char *nullable = NULL;
 #include "nullable.h"
 
 char *nullable = NULL;
@@ -64,11 +65,14 @@ set_nullable (void)
   s1 = s2 = squeue;
 
   rcount = XCALLOC (short, nrules + 1);
   s1 = s2 = squeue;
 
   rcount = XCALLOC (short, nrules + 1);
-  rsets = XCALLOC (shorts *, nvars) - ntokens;
+
+  /* RITEM contains all the rules, including useless productions.
+     Hence we must allocate room for useless nonterminals too.  */
+  rsets = XCALLOC (shorts *, nvars + nuseless_nonterminals) - ntokens;
   /* This is said to be more elements than we actually use.
      Supposedly nitems - nrules is enough.
      But why take the risk?  */
   /* This is said to be more elements than we actually use.
      Supposedly nitems - nrules is enough.
      But why take the risk?  */
-  relts = XCALLOC (shorts, nitems + nvars + 1);
+  relts = XCALLOC (shorts, nitems + nvars + nuseless_nonterminals + 1);
   p = relts;
 
   for (r = ritem; *r; ++r)
   p = relts;
 
   for (r = ritem; *r; ++r)
index 048f5a632236524fd78fd15f95c6b2b84bb77f04..87a2a1a977148c2e15eac43e99cd5d04f86f6960 100644 (file)
@@ -54,7 +54,7 @@ static BSet V1;
 static int nuseful_productions;
 static int nuseless_productions;
 static int nuseful_nonterminals;
 static int nuseful_productions;
 static int nuseless_productions;
 static int nuseful_nonterminals;
-static int nuseless_nonterminals;
+int nuseless_nonterminals;
 \f
 static bool
 bits_equal (BSet L, BSet R, int n)
 \f
 static bool
 bits_equal (BSet L, BSet R, int n)
index 92c118e7587c5c29a090bb420931756c0000cb49..e43f29ce06f71098365ccfa312b743edf9293cf6 100644 (file)
@@ -24,4 +24,6 @@
 void reduce_grammar PARAMS ((void));
 void reduce_output PARAMS ((FILE *out));
 void reduce_free PARAMS ((void));
 void reduce_grammar PARAMS ((void));
 void reduce_output PARAMS ((FILE *out));
 void reduce_free PARAMS ((void));
+
+extern int nuseless_nonterminals;
 #endif /* !REDUCE_H_ */
 #endif /* !REDUCE_H_ */