[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 6/8] style: simplify the handling of symbol and semantic_type tab
From: |
Akim Demaille |
Subject: |
[PATCH 6/8] style: simplify the handling of symbol and semantic_type tables |
Date: |
Wed, 2 Oct 2019 08:22:17 +0200 |
Both are stored in an hash, and back in the days, we used to iterate
over these tables using hash_do_for_each. However, the order of
traversal was not deterministic, which was a nuisance for
deterministic output (and therefore also a problem for tests). So at
some point (83b60c97ee1f98bb1f15ffa38acdc4cc765515f5) we generated a
sorted list of these symbols, and symbols_do actually iterated on that
list. But we kept the constraints of using hash_do_for_each, which
requires a lot of ceremonial code, and makes it hard/unnatural to
preserve data between iterations (see the next commit).
Alas, this is C, not C++.
Let's remove this abstraction, and directly iterate on the sorted
tables.
* src/symtab.c (symbols_do): Remove.
Adjust callers to use a simple for-loop instead.
(table_sort): New.
(symbols_check_defined): Use it.
(symbol_check_defined_processor, symbol_pack_processor)
(semantic_type_check_defined_processor, symbol_translation_processor):
Remove.
Simplify the corresponding functions (that no longer need to return a
bool).
---
src/symtab.c | 120 +++++++++++++++++++--------------------------------
1 file changed, 44 insertions(+), 76 deletions(-)
diff --git a/src/symtab.c b/src/symtab.c
index 66a99059..f14706e9 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -29,13 +29,13 @@
#include "complain.h"
#include "gram.h"
-/*-------------------------------------------------------------------.
-| Symbols sorted by tag. Allocated by the first invocation of |
-| symbols_do, after which no more symbols should be created. |
-`-------------------------------------------------------------------*/
+/*----------------------------------------------------------------.
+| Symbols sorted by tag. Allocated by table_sort, after which no |
+| more symbols should be created. |
+`----------------------------------------------------------------*/
static symbol **symbols_sorted = NULL;
-static symbol **semantic_types_sorted = NULL;
+static semantic_type **semantic_types_sorted = NULL;
/*------------------------.
| Distinguished symbols. |
@@ -149,8 +149,8 @@ symbol_free (void *ptr)
declaration first.
*/
-static
-void symbols_sort (symbol **first, symbol **second)
+static void
+symbols_sort (symbol **first, symbol **second)
{
if (0 < location_cmp ((*first)->location, (*second)->location))
{
@@ -162,8 +162,8 @@ void symbols_sort (symbol **first, symbol **second)
/* Likewise, for locations. */
-static
-void locations_sort (location *first, location *second)
+static void
+locations_sort (location *first, location *second)
{
if (0 < location_cmp (*first, *second))
{
@@ -514,7 +514,7 @@ symbol_user_token_number_set (symbol *sym, int
user_token_number, location loc)
| nonterminal. |
`----------------------------------------------------------*/
-static inline bool
+static void
symbol_check_defined (symbol *sym)
{
sym_content *s = sym->content;
@@ -541,11 +541,9 @@ symbol_check_defined (symbol *sym)
if (sem_type)
sem_type->status = declared;
}
-
- return true;
}
-static inline bool
+static void
semantic_type_check_defined (semantic_type *sem_type)
{
/* <*> and <> do not have to be "declared". */
@@ -564,24 +562,8 @@ semantic_type_check_defined (semantic_type *sem_type)
complain (&sem_type->location, Wother,
_("type <%s> is used, but is not associated to any symbol"),
sem_type->tag);
-
- return true;
-}
-
-static bool
-symbol_check_defined_processor (void *sym, void *null ATTRIBUTE_UNUSED)
-{
- return symbol_check_defined (sym);
}
-static bool
-semantic_type_check_defined_processor (void *sem_type,
- void *null ATTRIBUTE_UNUSED)
-{
- return semantic_type_check_defined (sem_type);
-}
-
-
/*-------------------------------------------------------------------.
| Merge the properties (precedence, associativity, etc.) of SYM, and |
| its string-named alias STR; check consistency. |
@@ -648,7 +630,7 @@ symbol_make_alias (symbol *sym, symbol *str, location loc)
| into FDEFINES. Put in SYMBOLS. |
`-------------------------------------------------------------------*/
-static inline bool
+static void
symbol_pack (symbol *this)
{
aver (this->content->number != NUMBER_UNDEFINED);
@@ -656,13 +638,6 @@ symbol_pack (symbol *this)
this->content->number += ntokens;
symbols[this->content->number] = this->content->symbol;
- return true;
-}
-
-static bool
-symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED)
-{
- return symbol_pack (this);
}
static void
@@ -683,7 +658,7 @@ complain_user_token_number_redeclared (int num, symbol
*first, symbol *second)
| Put THIS in TOKEN_TRANSLATIONS if it is a token. |
`--------------------------------------------------*/
-static inline bool
+static void
symbol_translation (symbol *this)
{
/* Nonterminal? */
@@ -700,14 +675,6 @@ symbol_translation (symbol *this)
token_translations[this->content->user_token_number]
= this->content->number;
}
-
- return true;
-}
-
-static bool
-symbol_translation_processor (void *this, void *null ATTRIBUTE_UNUSED)
-{
- return symbol_translation (this);
}
@@ -906,36 +873,25 @@ symbols_free (void)
}
-/*---------------------------------------------------------------.
-| Look for undefined symbols, report an error, and consider them |
-| terminals. |
-`---------------------------------------------------------------*/
-
static int
-symbols_cmp (symbol const *a, symbol const *b)
+symbol_cmp (void const *a, void const *b)
{
- return strcmp (a->tag, b->tag);
+ return strcmp ((*(symbol * const *)a)->tag,
+ (*(symbol * const *)b)->tag);
}
-static int
-symbols_cmp_qsort (void const *a, void const *b)
-{
- return symbols_cmp (*(symbol * const *)a, *(symbol * const *)b);
-}
+/* Store in *SORTED an array of pointers to the symbols contained in
+ TABLE, sorted (alphabetically) by tag. */
static void
-symbols_do (Hash_processor processor, void *processor_data,
- struct hash_table *table, symbol ***sorted)
+table_sort (struct hash_table *table, symbol ***sorted)
{
+ aver (!*sorted);
size_t count = hash_get_n_entries (table);
- if (!*sorted)
- {
- *sorted = xnmalloc (count, sizeof **sorted);
- hash_get_entries (table, (void**)*sorted, count);
- qsort (*sorted, count, sizeof **sorted, symbols_cmp_qsort);
- }
- for (size_t i = 0; i < count; ++i)
- processor ((*sorted)[i], processor_data);
+ *sorted = xnmalloc (count + 1, sizeof **sorted);
+ hash_get_entries (table, (void**)*sorted, count);
+ qsort (*sorted, count, sizeof **sorted, symbol_cmp);
+ (*sorted)[count] = NULL;
}
/*--------------------------------------------------------------.
@@ -946,10 +902,21 @@ symbols_do (Hash_processor processor, void
*processor_data,
void
symbols_check_defined (void)
{
- symbols_do (symbol_check_defined_processor, NULL,
- symbol_table, &symbols_sorted);
- symbols_do (semantic_type_check_defined_processor, NULL,
- semantic_type_table, &semantic_types_sorted);
+ table_sort (symbol_table, &symbols_sorted);
+ /* semantic_type, like symbol, starts with a 'tag' field. And here
+ we only deal with arrays/hashes of pointers, sizeof is not an
+ issue.
+
+ So instead of implementing table_sort (and symbol_cmp) once for
+ each type, let's lie a bit to the typing system, and treat
+ 'semantic_type' as if it were 'symbol'. Anyway this is only
+ about arrays of pointers. */
+ table_sort (semantic_type_table, (symbol ***) &semantic_types_sorted);
+
+ for (int i = 0; symbols_sorted[i]; ++i)
+ symbol_check_defined (symbols_sorted[i]);
+ for (int i = 0; semantic_types_sorted[i]; ++i)
+ semantic_type_check_defined (semantic_types_sorted[i]);
}
/*------------------------------------------------------------------.
@@ -1000,10 +967,10 @@ symbols_token_translations_init (void)
/* Initialize all entries for literal tokens to the internal token
number for $undefined, which represents all invalid inputs. */
- for (int i = 0; i < max_user_token_number + 1; i++)
+ for (int i = 0; i < max_user_token_number + 1; ++i)
token_translations[i] = undeftoken->content->number;
- symbols_do (symbol_translation_processor, NULL,
- symbol_table, &symbols_sorted);
+ for (int i = 0; symbols_sorted[i]; ++i)
+ symbol_translation(symbols_sorted[i]);
}
@@ -1016,7 +983,8 @@ void
symbols_pack (void)
{
symbols = xcalloc (nsyms, sizeof *symbols);
- symbols_do (symbol_pack_processor, NULL, symbol_table, &symbols_sorted);
+ for (int i = 0; symbols_sorted[i]; ++i)
+ symbol_pack(symbols_sorted[i]);
/* Aliases leave empty slots in symbols, so remove them. */
{
--
2.23.0
- [PATCH 0/8] RFC: diagnostics: add suggestions, Akim Demaille, 2019/10/02
- [PATCH 1/8] TODO: update, Akim Demaille, 2019/10/02
- [PATCH 2/8] tests: use tput to get the number of columns, Akim Demaille, 2019/10/02
- [PATCH 3/8] diagnostics: isolate caret_set_file, Akim Demaille, 2019/10/02
- [PATCH 4/8] diagnostics: isolate caret_set_column, Akim Demaille, 2019/10/02
- [PATCH 5/8] diagnostics: display suggested update after the caret-info, Akim Demaille, 2019/10/02
- [PATCH 7/8] style: isolate complain_symbol_undeclared, Akim Demaille, 2019/10/02
- [PATCH 6/8] style: simplify the handling of symbol and semantic_type tables,
Akim Demaille <=
- [PATCH 8/8] diagnostics: suggest fixes for undeclared symbols, Akim Demaille, 2019/10/02