From 630e182b7ba2257805c49424c96b9dc03a113668 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 5 Dec 2001 09:27:23 +0000 Subject: [PATCH] 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. --- ChangeLog | 23 +++++++++++++++++++++++ src/LR0.c | 27 +++++++++++++++------------ src/nullable.c | 8 ++++++-- src/reduce.c | 2 +- src/reduce.h | 2 ++ 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6cd76086..d08aba9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2001-12-05 Akim Demaille + + 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 * src/nullable.c (set_nullable): Deobfuscate the handling of diff --git a/src/LR0.c b/src/LR0.c index ef5624d4..48ba5a6d 100644 --- a/src/LR0.c +++ b/src/LR0.c @@ -30,7 +30,7 @@ #include "complain.h" #include "closure.h" #include "LR0.h" - +#include "reduce.h" int nstates; int final_state; @@ -63,11 +63,13 @@ static void 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) @@ -93,7 +95,7 @@ allocate_itemsets (void) count += symbol_count[i]; } - shift_symbol = symbol_count; + free (symbol_count); kernel_size = XCALLOC (int, nsyms); } @@ -112,13 +114,13 @@ allocate_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 (state_table); + free (state_table); } @@ -148,6 +150,7 @@ new_itemsets (void) for (i = 0; i < nsyms; i++) kernel_size[i] = 0; + shift_symbol = XCALLOC (short, nsyms); shiftcount = 0; for (i = 0; i < itemsetsize; ++i) diff --git a/src/nullable.c b/src/nullable.c index 74164937..2797180c 100644 --- a/src/nullable.c +++ b/src/nullable.c @@ -28,6 +28,7 @@ #include "reader.h" #include "types.h" #include "gram.h" +#include "reduce.h" #include "nullable.h" char *nullable = NULL; @@ -64,11 +65,14 @@ set_nullable (void) 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? */ - relts = XCALLOC (shorts, nitems + nvars + 1); + relts = XCALLOC (shorts, nitems + nvars + nuseless_nonterminals + 1); p = relts; for (r = ritem; *r; ++r) diff --git a/src/reduce.c b/src/reduce.c index 048f5a63..87a2a1a9 100644 --- a/src/reduce.c +++ b/src/reduce.c @@ -54,7 +54,7 @@ static BSet V1; static int nuseful_productions; static int nuseless_productions; static int nuseful_nonterminals; -static int nuseless_nonterminals; +int nuseless_nonterminals; static bool bits_equal (BSet L, BSet R, int n) diff --git a/src/reduce.h b/src/reduce.h index 92c118e7..e43f29ce 100644 --- a/src/reduce.h +++ b/src/reduce.h @@ -24,4 +24,6 @@ void reduce_grammar PARAMS ((void)); void reduce_output PARAMS ((FILE *out)); void reduce_free PARAMS ((void)); + +extern int nuseless_nonterminals; #endif /* !REDUCE_H_ */ -- 2.47.2