mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-20 09:43:03 +00:00
* 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].
This commit is contained in:
12
ChangeLog
12
ChangeLog
@@ -1,3 +1,15 @@
|
|||||||
|
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>
|
2001-12-29 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
* tests/calc.at (_AT_DATA_CALC_Y): Also use %union.
|
* tests/calc.at (_AT_DATA_CALC_Y): Also use %union.
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
The entry point is generate_states. */
|
The entry point is generate_states. */
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
@@ -99,17 +100,17 @@ resolve_sr_conflict (state_t *state, int lookahead)
|
|||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
if (BITISSET (LA (lookahead), i)
|
if (BITISSET (LA (lookahead), i)
|
||||||
&& BITISSET (lookaheadset, i)
|
&& BITISSET (lookaheadset, i)
|
||||||
&& sprec[i])
|
&& symbols[i]->prec)
|
||||||
{
|
{
|
||||||
/* Shift-reduce conflict occurs for token number i
|
/* Shift-reduce conflict occurs for token number i
|
||||||
and it has a precedence.
|
and it has a precedence.
|
||||||
The precedence of shifting is that of token i. */
|
The precedence of shifting is that of token i. */
|
||||||
if (sprec[i] < redprec)
|
if (symbols[i]->prec < redprec)
|
||||||
{
|
{
|
||||||
log_resolution (state, lookahead, i, _("reduce"));
|
log_resolution (state, lookahead, i, _("reduce"));
|
||||||
flush_shift (state, i);
|
flush_shift (state, i);
|
||||||
}
|
}
|
||||||
else if (sprec[i] > redprec)
|
else if (symbols[i]->prec > redprec)
|
||||||
{
|
{
|
||||||
log_resolution (state, lookahead, i, _("shift"));
|
log_resolution (state, lookahead, i, _("shift"));
|
||||||
flush_reduce (lookahead, i);
|
flush_reduce (lookahead, i);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
|
|
||||||
/* comments for these variables are in gram.h */
|
/* comments for these variables are in gram.h */
|
||||||
@@ -37,6 +38,8 @@ int nritems;
|
|||||||
rule_t *rule_table = NULL;
|
rule_t *rule_table = NULL;
|
||||||
short *rprec = NULL;
|
short *rprec = NULL;
|
||||||
short *rprecsym = NULL;
|
short *rprecsym = NULL;
|
||||||
|
|
||||||
|
struct bucket **symbols = NULL;
|
||||||
short *sprec = NULL;
|
short *sprec = NULL;
|
||||||
short *rassoc = NULL;
|
short *rassoc = NULL;
|
||||||
short *sassoc = NULL;
|
short *sassoc = NULL;
|
||||||
|
|||||||
@@ -133,6 +133,9 @@ typedef struct rule_s
|
|||||||
|
|
||||||
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
|
/* token translation table: indexed by a token number as returned by
|
||||||
the user's yylex routine, it yields the internal token number used
|
the user's yylex routine, it yields the internal token number used
|
||||||
by the parser and throughout bison. */
|
by the parser and throughout bison. */
|
||||||
|
|||||||
13
src/reader.c
13
src/reader.c
@@ -1556,11 +1556,10 @@ token_translations_init (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------.
|
/*----------------------------------------------------------------.
|
||||||
| Assign symbol numbers, and write definition of token names into |
|
| Assign symbol numbers, and write definition of token names into |
|
||||||
| FDEFINES. Set up vectors TAGS and SPREC of names and precedences |
|
| FDEFINES. Set up vectors SYMBOL_TABLE, TAGS of symbols. |
|
||||||
| of symbols. |
|
`----------------------------------------------------------------*/
|
||||||
`------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
packsymbols (void)
|
packsymbols (void)
|
||||||
@@ -1571,8 +1570,8 @@ packsymbols (void)
|
|||||||
|
|
||||||
tags = XCALLOC (char *, nsyms + 1);
|
tags = XCALLOC (char *, nsyms + 1);
|
||||||
user_toknums = XCALLOC (short, nsyms + 1);
|
user_toknums = XCALLOC (short, nsyms + 1);
|
||||||
|
symbols = XCALLOC (bucket *, nsyms);
|
||||||
|
|
||||||
sprec = XCALLOC (short, nsyms);
|
|
||||||
sassoc = XCALLOC (short, nsyms);
|
sassoc = XCALLOC (short, nsyms);
|
||||||
|
|
||||||
max_user_token_number = 256;
|
max_user_token_number = 256;
|
||||||
@@ -1644,9 +1643,9 @@ packsymbols (void)
|
|||||||
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;
|
tags[bp->value] = bp->tag;
|
||||||
user_toknums[bp->value] = bp->user_token_number;
|
user_toknums[bp->value] = bp->user_token_number;
|
||||||
sprec[bp->value] = bp->prec;
|
|
||||||
sassoc[bp->value] = bp->assoc;
|
sassoc[bp->value] = bp->assoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
40
src/reduce.c
40
src/reduce.c
@@ -28,6 +28,7 @@
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
#include "symtab.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
#include "reduce.h"
|
#include "reduce.h"
|
||||||
@@ -353,26 +354,13 @@ nonterminals_reduce (void)
|
|||||||
|
|
||||||
/* Shuffle elements of tables indexed by symbol number. */
|
/* Shuffle elements of tables indexed by symbol number. */
|
||||||
{
|
{
|
||||||
short *sassoc_sorted = XMALLOC (short, nvars) - ntokens;
|
bucket **symbols_sorted = XMALLOC (bucket *, nvars) - ntokens;
|
||||||
short *sprec_sorted = XMALLOC (short, nvars) - ntokens;
|
|
||||||
char **tags_sorted = XMALLOC (char *, nvars) - ntokens;
|
|
||||||
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
{
|
symbols_sorted[nontermmap[i]] = symbols[i];
|
||||||
n = nontermmap[i];
|
|
||||||
sassoc_sorted[n] = sassoc[i];
|
|
||||||
sprec_sorted[n] = sprec[i];
|
|
||||||
tags_sorted[n] = tags[i];
|
|
||||||
}
|
|
||||||
for (i = ntokens; i < nsyms; i++)
|
for (i = ntokens; i < nsyms; i++)
|
||||||
{
|
symbols[i] = symbols_sorted[i];
|
||||||
sassoc[i] = sassoc_sorted[i];
|
free (symbols_sorted + ntokens);
|
||||||
sprec[i] = sprec_sorted[i];
|
|
||||||
tags[i] = tags_sorted[i];
|
|
||||||
}
|
|
||||||
free (sassoc_sorted + ntokens);
|
|
||||||
free (sprec_sorted + ntokens);
|
|
||||||
free (tags_sorted + ntokens);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace all symbol numbers in valid data structures. */
|
/* Replace all symbol numbers in valid data structures. */
|
||||||
@@ -410,7 +398,7 @@ reduce_output (FILE *out)
|
|||||||
int i;
|
int i;
|
||||||
fprintf (out, "%s\n\n", _("Useless nonterminals:"));
|
fprintf (out, "%s\n\n", _("Useless nonterminals:"));
|
||||||
for (i = 0; i < nuseless_nonterminals; ++i)
|
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);
|
fputs ("\n\n", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,7 +411,7 @@ reduce_output (FILE *out)
|
|||||||
if (!b)
|
if (!b)
|
||||||
fprintf (out, "%s\n\n", _("Terminals which are not used:"));
|
fprintf (out, "%s\n\n", _("Terminals which are not used:"));
|
||||||
b = TRUE;
|
b = TRUE;
|
||||||
fprintf (out, " %s\n", tags[i]);
|
fprintf (out, " %s\n", symbols[i]->tag);
|
||||||
}
|
}
|
||||||
if (b)
|
if (b)
|
||||||
fputs ("\n\n", out);
|
fputs ("\n\n", out);
|
||||||
@@ -438,9 +426,9 @@ reduce_output (FILE *out)
|
|||||||
{
|
{
|
||||||
rule r;
|
rule r;
|
||||||
fprintf (out, "#%-4d ", i - 1);
|
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", out);
|
||||||
}
|
}
|
||||||
fputs ("\n\n", out);
|
fputs ("\n\n", out);
|
||||||
@@ -460,7 +448,9 @@ dump_grammar (FILE *out)
|
|||||||
fprintf (out, "Variables\n---------\n\n");
|
fprintf (out, "Variables\n---------\n\n");
|
||||||
fprintf (out, "Value Sprec Sassoc Tag\n");
|
fprintf (out, "Value Sprec Sassoc Tag\n");
|
||||||
for (i = ntokens; i < nsyms; i++)
|
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, "\n\n");
|
||||||
fprintf (out, "Rules\n-----\n\n");
|
fprintf (out, "Rules\n-----\n\n");
|
||||||
fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\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");
|
fprintf (out, "Rules interpreted\n-----------------\n\n");
|
||||||
for (i = 1; i <= nrules; i++)
|
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);
|
fputc ('\n', out);
|
||||||
}
|
}
|
||||||
fprintf (out, "\n\n");
|
fprintf (out, "\n\n");
|
||||||
@@ -551,7 +541,7 @@ reduce_grammar (void)
|
|||||||
|
|
||||||
if (!BITISSET (N, start_symbol - ntokens))
|
if (!BITISSET (N, start_symbol - ntokens))
|
||||||
fatal (_("Start symbol %s does not derive any sentence"),
|
fatal (_("Start symbol %s does not derive any sentence"),
|
||||||
tags[start_symbol]);
|
symbols[start_symbol]->tag);
|
||||||
|
|
||||||
reduce_grammar_tables ();
|
reduce_grammar_tables ();
|
||||||
if (nuseless_nonterminals > 0)
|
if (nuseless_nonterminals > 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user