bucket.
Adjust all dependencies.
* src/reduce.c (nonterminals_reduce): Don't forget to renumber the
`number' of the buckets too.
* src/gram.h: Include `symtab.h'.
(associativity): Move to...
* src/symtab.h: here.
No longer include `gram.h'.
+2002-04-07 Akim Demaille <akim@epita.fr>
+
+ * src/gram.h (rule_t): `lhs' is now a pointer to the symbol's
+ bucket.
+ Adjust all dependencies.
+ * src/reduce.c (nonterminals_reduce): Don't forget to renumber the
+ `number' of the buckets too.
+ * src/gram.h: Include `symtab.h'.
+ (associativity): Move to...
+ * src/symtab.h: here.
+ No longer include `gram.h'.
+
+
2002-04-07 Akim Demaille <akim@epita.fr>
* src/gram.h, src/gram.c (rules_rhs_length): New.
p = delts;
for (i = nrules; i > 0; i--)
- if (rules[i].useful)
- {
- int lhs = rules[i].lhs;
- p->next = dset[lhs];
- p->value = i;
- dset[lhs] = p;
- p++;
- }
+ {
+ int lhs = rules[i].lhs->number;
+ p->next = dset[lhs];
+ p->value = i;
+ dset[lhs] = p;
+ p++;
+ }
derives = XCALLOC (short *, nvars) - ntokens;
q = XCALLOC (short, nvars + nrules);
Associativities are recorded similarly in SYMBOLS[I]->assoc. */
+#include "symtab.h"
#define ISTOKEN(s) ((s) < ntokens)
#define ISVAR(s) ((s) >= ntokens)
extern int start_symbol;
-/* Associativity values for tokens and rules. */
-typedef enum
-{
- right_assoc,
- left_assoc,
- non_assoc
-} associativity;
-
-
typedef struct rule_s
{
/* The number of the rule in the source. It is usually the index in
RULES too, except if there are useless rules. */
short number;
- short lhs;
+ bucket *lhs;
short *rhs;
short prec;
short precsym;
{
/* This rule has an empty RHS. */
assert (rules[ruleno].rhs[0] == -ruleno);
- if (rules[ruleno].useful && !nullable[rules[ruleno].lhs])
+ if (rules[ruleno].useful && !nullable[rules[ruleno].lhs->number])
{
- nullable[rules[ruleno].lhs] = 1;
- *s2++ = rules[ruleno].lhs;
+ nullable[rules[ruleno].lhs->number] = 1;
+ *s2++ = rules[ruleno].lhs->number;
}
}
}
{
ruleno = p->value;
if (--rcount[ruleno] == 0)
- if (rules[ruleno].useful && !nullable[rules[ruleno].lhs])
+ if (rules[ruleno].useful && !nullable[rules[ruleno].lhs->number])
{
- nullable[rules[ruleno].lhs] = 1;
- *s2++ = rules[ruleno].lhs;
+ nullable[rules[ruleno].lhs->number] = 1;
+ *s2++ = rules[ruleno].lhs->number;
}
}
/* Concentrate all options use in bison,
- Copyright 2001 Free Software Foundation, Inc.
+ Copyright 2001, 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
#include "files.h"
#include "getargs.h"
#include "symtab.h"
+#include "gram.h"
#include "lex.h"
#include "output.h"
#include "options.h"
{
short *values = XCALLOC (short, nrules + 1);
for (i = 1; i < nrules + 1; ++i)
- values[i] = rules[i].lhs;
+ values[i] = rules[i].lhs->number;
output_table_data (&format_obstack, values,
0, 1, nrules + 1);
muscle_insert ("r1", obstack_finish (&format_obstack));
sp++;
rule = -(*sp);
- fprintf (out, " %s -> ", escape (symbols[rules[rule].lhs]->tag));
+ fprintf (out, " %s -> ", escape (rules[rule].lhs->tag));
for (sp = rules[rule].rhs; sp < sp1; sp++)
fprintf (out, "%s ", escape (symbols[*sp]->tag));
if (state->consistent)
{
int rule = redp->rules[0];
- int symbol = rules[rule].lhs;
+ int symbol = rules[rule].lhs->number;
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"),
rule - 1, escape (symbols[symbol]->tag));
return;
if (bitset_test (lookaheadset, i))
fprintf (out, _(" %-4s\t[reduce using rule %d (%s)]\n"),
escape (symbols[i]->tag), default_rule - 1,
- escape2 (symbols[rules[default_rule].lhs]->tag));
+ escape2 (rules[default_rule].lhs->tag));
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"),
- default_rule - 1, escape (symbols[rules[default_rule].lhs]->tag));
+ default_rule - 1, escape (rules[default_rule].lhs->tag));
}
else if (state->nlookaheads >= 1)
{
_(" %-4s\treduce using rule %d (%s)\n"),
escape (symbols[i]->tag),
LAruleno[state->lookaheadsp + j] - 1,
- escape2 (symbols[rules[LAruleno[state->lookaheadsp + j]].lhs]->tag));
+ escape2 (rules[LAruleno[state->lookaheadsp + j]].lhs->tag));
else
defaulted = 1;
_(" %-4s\treduce using rule %d (%s)\n"),
escape (symbols[i]->tag),
LAruleno[default_LA] - 1,
- escape2 (symbols[rules[LAruleno[default_LA]].lhs]->tag));
+ escape2 (rules[LAruleno[default_LA]].lhs->tag));
defaulted = 0;
fprintf (out,
_(" %-4s\t[reduce using rule %d (%s)]\n"),
escape (symbols[i]->tag),
LAruleno[state->lookaheadsp + j] - 1,
- escape2 (symbols[rules[LAruleno[state->lookaheadsp + j]].lhs]->tag));
+ escape2 (rules[LAruleno[state->lookaheadsp + j]].lhs->tag));
}
}
}
if (default_LA >= 0)
fprintf (out, _(" $default\treduce using rule %d (%s)\n"),
default_rule - 1,
- escape (symbols[rules[default_rule].lhs]->tag));
+ escape (rules[default_rule].lhs->tag));
}
}
for (i = 1; i < nrules + 1; i++)
{
fprintf (out, _(" %3d %3d %s ->"),
- i - 1, rules[i].line, escape (symbols[rules[i].lhs]->tag));
+ i - 1, rules[i].line, escape (rules[i].lhs->tag));
rule = rules[i].rhs;
if (*rule >= 0)
while (*rule >= 0)
for (j = 1; j < nrules + 1; j++)
{
- if (rules[j].lhs == i)
+ if (rules[j].lhs->number == i)
left_count++;
for (rule = rules[j].rhs; *rule >= 0; rule++)
if (*rule == i)
for (j = 1; j < nrules + 1; j++)
{
END_TEST (65);
- if (rules[j].lhs == i)
+ if (rules[j].lhs->number == i)
sprintf (buffer + strlen (buffer), " %d", j - 1);
}
}
if (i)
obstack_1grow (node_obstack, '\n');
obstack_fgrow1 (node_obstack, " %s -> ",
- escape (symbols[rules[rule].lhs]->tag));
+ escape (rules[rule].lhs->tag));
for (sp = rules[rule].rhs; sp < sp1; sp++)
obstack_fgrow1 (node_obstack, "%s ", escape (symbols[*sp]->tag));
{
bucket *ruleprec = p->ruleprec;
rules[ruleno].number = ruleno;
- rules[ruleno].lhs = p->sym->number;
+ rules[ruleno].lhs = p->sym;
rules[ruleno].rhs = ritem + itemno;
rules[ruleno].line = p->line;
rules[ruleno].useful = TRUE;
if (!bitset_test (P, i)
&& useful_production (i, N))
{
- bitset_set (Np, rules[i].lhs - ntokens);
+ bitset_set (Np, rules[i].lhs->number - ntokens);
bitset_set (P, i);
}
if (bitset_equal_p (N, Np))
{
if (!bitset_test (Pp, i)
&& bitset_test (P, i)
- && bitset_test (V, rules[i].lhs))
+ && bitset_test (V, rules[i].lhs->number))
{
for (r = rules[i].rhs; *r >= 0; r++)
if (ISTOKEN (t = *r) || bitset_test (N, t - ntokens))
{
bucket **symbols_sorted = XMALLOC (bucket *, nvars) - ntokens;
+ for (i = ntokens; i < nsyms; i++)
+ symbols[i]->number = nontermmap[i];
for (i = ntokens; i < nsyms; i++)
symbols_sorted[nontermmap[i]] = symbols[i];
for (i = ntokens; i < nsyms; i++)
for (i = 1; i < nrules + 1; i++)
{
- rules[i].lhs = nontermmap[rules[i].lhs];
if (ISVAR (rules[i].precsym))
/* Can this happen? */
rules[i].precsym = nontermmap[rules[i].precsym];
{
rule r;
fprintf (out, "#%-4d ", rules[i].number - 1);
- fprintf (out, "%s:", symbols[rules[i].lhs]->tag);
+ fprintf (out, "%s:", rules[i].lhs->tag);
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, " %s", symbols[*r]->tag);
fputs (";\n", out);
i - 1,
rules[i].prec, rules[i].assoc, rules[i].useful,
rules[i].rhs - ritem, rules[i].rhs - ritem + rhs_count - 1,
- rules[i].lhs);
+ rules[i].lhs->number);
/* Dumped the RHS. */
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, "%3d", *r);
fprintf (out, "Rules interpreted\n-----------------\n\n");
for (i = 1; i < nrules + nuseless_productions + 1; i++)
{
- fprintf (out, "%-5d %s :", i, symbols[rules[i].lhs]->tag);
+ fprintf (out, "%-5d %s :", i, rules[i].lhs->tag);
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, " %s", symbols[*r]->tag);
fputc ('\n', out);
/* Definitions for symtab.c and callers, part of bison,
- Copyright 1984, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.
+ Copyright 1984, 1989, 1992, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
#ifndef SYMTAB_H_
# define SYMTAB_H_
-# include "gram.h"
#define TABSIZE 1009
-/* symbol classes */
+/* Associativity values for tokens and rules. */
+typedef enum
+{
+ right_assoc,
+ left_assoc,
+ non_assoc
+} associativity;
+
+/* Symbol classes. */
typedef enum
{
unknown_sym,