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 <akim@epita.fr>
+
+ * 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 <akim@epita.fr>
* tests/calc.at (_AT_DATA_CALC_Y): Also use %union.
2001-12-29 Akim Demaille <akim@epita.fr>
* tests/calc.at (_AT_DATA_CALC_Y): Also use %union.
The entry point is generate_states. */
#include "system.h"
The entry point is generate_states. */
#include "system.h"
#include "getargs.h"
#include "reader.h"
#include "gram.h"
#include "getargs.h"
#include "reader.h"
#include "gram.h"
#include "system.h"
#include "complain.h"
#include "getargs.h"
#include "system.h"
#include "complain.h"
#include "getargs.h"
#include "files.h"
#include "gram.h"
#include "state.h"
#include "files.h"
#include "gram.h"
#include "state.h"
for (i = 0; i < ntokens; i++)
if (BITISSET (LA (lookahead), i)
&& BITISSET (lookaheadset, i)
for (i = 0; i < ntokens; i++)
if (BITISSET (LA (lookahead), i)
&& BITISSET (lookaheadset, i)
{
/* Shift-reduce conflict occurs for token number i
and it has a precedence.
The precedence of shifting is that of token i. */
{
/* 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);
}
{
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);
{
log_resolution (state, lookahead, i, _("shift"));
flush_reduce (lookahead, i);
#include "system.h"
#include "gram.h"
#include "system.h"
#include "gram.h"
#include "reader.h"
/* comments for these variables are in gram.h */
#include "reader.h"
/* comments for these variables are in gram.h */
rule_t *rule_table = NULL;
short *rprec = NULL;
short *rprecsym = NULL;
rule_t *rule_table = NULL;
short *rprec = NULL;
short *rprecsym = NULL;
+
+struct bucket **symbols = NULL;
short *sprec = NULL;
short *rassoc = NULL;
short *sassoc = NULL;
short *sprec = NULL;
short *rassoc = NULL;
short *sassoc = NULL;
extern struct rule_s *rule_table;
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. */
/* 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. */
-/*------------------------------------------------------------------.
-| 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)
static void
packsymbols (void)
tags = XCALLOC (char *, nsyms + 1);
user_toknums = XCALLOC (short, nsyms + 1);
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;
sassoc = XCALLOC (short, nsyms);
max_user_token_number = 256;
max_user_token_number = bp->user_token_number;
}
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;
tags[bp->value] = bp->tag;
user_toknums[bp->value] = bp->user_token_number;
- sprec[bp->value] = bp->prec;
sassoc[bp->value] = bp->assoc;
}
sassoc[bp->value] = bp->assoc;
}
#include "system.h"
#include "getargs.h"
#include "files.h"
#include "system.h"
#include "getargs.h"
#include "files.h"
#include "gram.h"
#include "complain.h"
#include "reduce.h"
#include "gram.h"
#include "complain.h"
#include "reduce.h"
/* Shuffle elements of tables indexed by symbol number. */
{
/* 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++)
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++)
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. */
}
/* Replace all symbol numbers in valid data structures. */
int i;
fprintf (out, "%s\n\n", _("Useless nonterminals:"));
for (i = 0; i < nuseless_nonterminals; ++i)
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);
if (!b)
fprintf (out, "%s\n\n", _("Terminals which are not used:"));
b = TRUE;
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);
}
if (b)
fputs ("\n\n", out);
{
rule r;
fprintf (out, "#%-4d ", i - 1);
{
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++)
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);
fputs (";\n", out);
}
fputs ("\n\n", out);
fprintf (out, "Variables\n---------\n\n");
fprintf (out, "Value Sprec Sassoc Tag\n");
for (i = ntokens; i < nsyms; i++)
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");
fprintf (out, "\n\n");
fprintf (out, "Rules\n-----\n\n");
fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
fprintf (out, "Rules interpreted\n-----------------\n\n");
for (i = 1; i <= nrules; i++)
{
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++)
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");
fputc ('\n', out);
}
fprintf (out, "\n\n");
if (!BITISSET (N, start_symbol - ntokens))
fatal (_("Start symbol %s does not derive any sentence"),
if (!BITISSET (N, start_symbol - ntokens))
fatal (_("Start symbol %s does not derive any sentence"),
+ symbols[start_symbol]->tag);
reduce_grammar_tables ();
if (nuseless_nonterminals > 0)
reduce_grammar_tables ();
if (nuseless_nonterminals > 0)