From: Akim Demaille Date: Sat, 29 Dec 2001 14:18:32 +0000 (+0000) Subject: * src/gram.h, src/gram.c (symbols): New, similar to state_table X-Git-Tag: before-m4-back-end~65 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/0e78e603f696b4b820231b56fdb21c2a173e6bd3 * src/gram.h, src/gram.c (symbols): New, similar to state_table and rule_table. * src/reader.c (packsymbols): Fill this table. Drop sprec. * src/conflicts.c (resolve_sr_conflict): Adjust. * src/reduce.c (reduce_grammar): Adjust: just sort symbols, a single table. Use symbols[i]->tag instead of tags[i]. --- diff --git a/ChangeLog b/ChangeLog index 38198129..6d3ba670 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2001-12-29 Akim Demaille + + * src/gram.h, src/gram.c (symbols): New, similar to state_table + and rule_table. + * src/reader.c (packsymbols): Fill this table. + Drop sprec. + * src/conflicts.c (resolve_sr_conflict): Adjust. + * src/reduce.c (reduce_grammar): Adjust: just sort symbols, a + single table. + Use symbols[i]->tag instead of tags[i]. + + 2001-12-29 Akim Demaille * tests/calc.at (_AT_DATA_CALC_Y): Also use %union. diff --git a/src/LR0.c b/src/LR0.c index b80cede7..47ce6dd2 100644 --- a/src/LR0.c +++ b/src/LR0.c @@ -23,6 +23,7 @@ The entry point is generate_states. */ #include "system.h" +#include "symtab.h" #include "getargs.h" #include "reader.h" #include "gram.h" diff --git a/src/conflicts.c b/src/conflicts.c index 2f9b4c24..a17157a6 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -21,6 +21,7 @@ #include "system.h" #include "complain.h" #include "getargs.h" +#include "symtab.h" #include "files.h" #include "gram.h" #include "state.h" @@ -99,17 +100,17 @@ resolve_sr_conflict (state_t *state, int lookahead) for (i = 0; i < ntokens; i++) if (BITISSET (LA (lookahead), i) && BITISSET (lookaheadset, i) - && sprec[i]) + && symbols[i]->prec) { /* Shift-reduce conflict occurs for token number i and it has a precedence. The precedence of shifting is that of token i. */ - if (sprec[i] < redprec) + if (symbols[i]->prec < redprec) { log_resolution (state, lookahead, i, _("reduce")); flush_shift (state, i); } - else if (sprec[i] > redprec) + else if (symbols[i]->prec > redprec) { log_resolution (state, lookahead, i, _("shift")); flush_reduce (lookahead, i); diff --git a/src/gram.c b/src/gram.c index 4ec973c1..ffab36d3 100644 --- a/src/gram.c +++ b/src/gram.c @@ -21,6 +21,7 @@ #include "system.h" #include "gram.h" +#include "symtab.h" #include "reader.h" /* comments for these variables are in gram.h */ @@ -37,6 +38,8 @@ int nritems; rule_t *rule_table = NULL; short *rprec = NULL; short *rprecsym = NULL; + +struct bucket **symbols = NULL; short *sprec = NULL; short *rassoc = NULL; short *sassoc = NULL; diff --git a/src/gram.h b/src/gram.h index 336c38ed..b8d1c93b 100644 --- a/src/gram.h +++ b/src/gram.h @@ -133,6 +133,9 @@ typedef struct rule_s extern struct rule_s *rule_table; +/* Table of the symbols, indexed by the symbol number. */ +extern struct bucket **symbols; + /* token translation table: indexed by a token number as returned by the user's yylex routine, it yields the internal token number used by the parser and throughout bison. */ diff --git a/src/reader.c b/src/reader.c index bebbc153..c1cbb097 100644 --- a/src/reader.c +++ b/src/reader.c @@ -1556,11 +1556,10 @@ token_translations_init (void) } -/*------------------------------------------------------------------. -| Assign symbol numbers, and write definition of token names into | -| FDEFINES. Set up vectors TAGS and SPREC of names and precedences | -| of symbols. | -`------------------------------------------------------------------*/ +/*----------------------------------------------------------------. +| Assign symbol numbers, and write definition of token names into | +| FDEFINES. Set up vectors SYMBOL_TABLE, TAGS of symbols. | +`----------------------------------------------------------------*/ static void packsymbols (void) @@ -1571,8 +1570,8 @@ packsymbols (void) tags = XCALLOC (char *, nsyms + 1); user_toknums = XCALLOC (short, nsyms + 1); + symbols = XCALLOC (bucket *, nsyms); - sprec = XCALLOC (short, nsyms); sassoc = XCALLOC (short, nsyms); max_user_token_number = 256; @@ -1644,9 +1643,9 @@ packsymbols (void) max_user_token_number = bp->user_token_number; } + symbols[bp->value] = bp; tags[bp->value] = bp->tag; user_toknums[bp->value] = bp->user_token_number; - sprec[bp->value] = bp->prec; sassoc[bp->value] = bp->assoc; } diff --git a/src/reduce.c b/src/reduce.c index 430e5b08..83909619 100644 --- a/src/reduce.c +++ b/src/reduce.c @@ -28,6 +28,7 @@ #include "system.h" #include "getargs.h" #include "files.h" +#include "symtab.h" #include "gram.h" #include "complain.h" #include "reduce.h" @@ -353,26 +354,13 @@ nonterminals_reduce (void) /* Shuffle elements of tables indexed by symbol number. */ { - short *sassoc_sorted = XMALLOC (short, nvars) - ntokens; - short *sprec_sorted = XMALLOC (short, nvars) - ntokens; - char **tags_sorted = XMALLOC (char *, nvars) - ntokens; + bucket **symbols_sorted = XMALLOC (bucket *, nvars) - ntokens; for (i = ntokens; i < nsyms; i++) - { - n = nontermmap[i]; - sassoc_sorted[n] = sassoc[i]; - sprec_sorted[n] = sprec[i]; - tags_sorted[n] = tags[i]; - } + symbols_sorted[nontermmap[i]] = symbols[i]; for (i = ntokens; i < nsyms; i++) - { - sassoc[i] = sassoc_sorted[i]; - sprec[i] = sprec_sorted[i]; - tags[i] = tags_sorted[i]; - } - free (sassoc_sorted + ntokens); - free (sprec_sorted + ntokens); - free (tags_sorted + ntokens); + symbols[i] = symbols_sorted[i]; + free (symbols_sorted + ntokens); } /* Replace all symbol numbers in valid data structures. */ @@ -410,7 +398,7 @@ reduce_output (FILE *out) int i; fprintf (out, "%s\n\n", _("Useless nonterminals:")); for (i = 0; i < nuseless_nonterminals; ++i) - fprintf (out, " %s\n", tags[nsyms + i]); + fprintf (out, " %s\n", symbols[nsyms + i]->tag); fputs ("\n\n", out); } @@ -423,7 +411,7 @@ reduce_output (FILE *out) if (!b) fprintf (out, "%s\n\n", _("Terminals which are not used:")); b = TRUE; - fprintf (out, " %s\n", tags[i]); + fprintf (out, " %s\n", symbols[i]->tag); } if (b) fputs ("\n\n", out); @@ -438,9 +426,9 @@ reduce_output (FILE *out) { rule r; fprintf (out, "#%-4d ", i - 1); - fprintf (out, "%s:", tags[rule_table[i].lhs]); + fprintf (out, "%s:", symbols[rule_table[i].lhs]->tag); for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++) - fprintf (out, " %s", tags[*r]); + fprintf (out, " %s", symbols[*r]->tag); fputs (";\n", out); } fputs ("\n\n", out); @@ -460,7 +448,9 @@ dump_grammar (FILE *out) fprintf (out, "Variables\n---------\n\n"); fprintf (out, "Value Sprec Sassoc Tag\n"); for (i = ntokens; i < nsyms; i++) - fprintf (out, "%5d %5d %5d %s\n", i, sprec[i], sassoc[i], tags[i]); + fprintf (out, "%5d %5d %5d %s\n", + i, + symbols[i]->prec, symbols[i]->assoc, symbols[i]->tag); fprintf (out, "\n\n"); fprintf (out, "Rules\n-----\n\n"); fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"); @@ -484,9 +474,9 @@ dump_grammar (FILE *out) fprintf (out, "Rules interpreted\n-----------------\n\n"); for (i = 1; i <= nrules; i++) { - fprintf (out, "%-5d %s :", i, tags[rule_table[i].lhs]); + fprintf (out, "%-5d %s :", i, symbols[rule_table[i].lhs]->tag); for (r = &ritem[rule_table[i].rhs]; *r >= 0; r++) - fprintf (out, " %s", tags[*r]); + fprintf (out, " %s", symbols[*r]->tag); fputc ('\n', out); } fprintf (out, "\n\n"); @@ -551,7 +541,7 @@ reduce_grammar (void) if (!BITISSET (N, start_symbol - ntokens)) fatal (_("Start symbol %s does not derive any sentence"), - tags[start_symbol]); + symbols[start_symbol]->tag); reduce_grammar_tables (); if (nuseless_nonterminals > 0)