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.
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--)
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);
derives = XCALLOC (short *, nvars) - ntokens;
q = XCALLOC (short, nvars + nrules);
Associativities are recorded similarly in SYMBOLS[I]->assoc. */
Associativities are recorded similarly in SYMBOLS[I]->assoc. */
#define ISTOKEN(s) ((s) < ntokens)
#define ISVAR(s) ((s) >= ntokens)
#define ISTOKEN(s) ((s) < ntokens)
#define ISVAR(s) ((s) >= ntokens)
-/* 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;
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 *rhs;
short prec;
short precsym;
short *rhs;
short prec;
short precsym;
{
/* This rule has an empty RHS. */
assert (rules[ruleno].rhs[0] == -ruleno);
{
/* 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)
{
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,
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
#include "files.h"
#include "getargs.h"
#include "symtab.h"
#include "files.h"
#include "getargs.h"
#include "symtab.h"
#include "lex.h"
#include "output.h"
#include "options.h"
#include "lex.h"
#include "output.h"
#include "options.h"
{
short *values = XCALLOC (short, nrules + 1);
for (i = 1; i < nrules + 1; ++i)
{
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));
output_table_data (&format_obstack, values,
0, 1, nrules + 1);
muscle_insert ("r1", obstack_finish (&format_obstack));
- 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));
for (sp = rules[rule].rhs; sp < sp1; sp++)
fprintf (out, "%s ", escape (symbols[*sp]->tag));
if (state->consistent)
{
int rule = redp->rules[0];
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;
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,
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"),
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)
{
}
else if (state->nlookaheads >= 1)
{
_(" %-4s\treduce using rule %d (%s)\n"),
escape (symbols[i]->tag),
LAruleno[state->lookaheadsp + j] - 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));
_(" %-4s\treduce using rule %d (%s)\n"),
escape (symbols[i]->tag),
LAruleno[default_LA] - 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,
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,
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 ->"),
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)
rule = rules[i].rhs;
if (*rule >= 0)
while (*rule >= 0)
for (j = 1; j < nrules + 1; j++)
{
for (j = 1; j < nrules + 1; j++)
{
+ if (rules[j].lhs->number == i)
left_count++;
for (rule = rules[j].rhs; *rule >= 0; rule++)
if (*rule == i)
left_count++;
for (rule = rules[j].rhs; *rule >= 0; rule++)
if (*rule == i)
for (j = 1; j < nrules + 1; j++)
{
END_TEST (65);
for (j = 1; j < nrules + 1; j++)
{
END_TEST (65);
+ if (rules[j].lhs->number == i)
sprintf (buffer + strlen (buffer), " %d", j - 1);
}
}
sprintf (buffer + strlen (buffer), " %d", j - 1);
}
}
if (i)
obstack_1grow (node_obstack, '\n');
obstack_fgrow1 (node_obstack, " %s -> ",
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));
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;
{
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;
rules[ruleno].rhs = ritem + itemno;
rules[ruleno].line = p->line;
rules[ruleno].useful = TRUE;
if (!bitset_test (P, i)
&& useful_production (i, N))
{
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))
bitset_set (P, i);
}
if (bitset_equal_p (N, Np))
{
if (!bitset_test (Pp, i)
&& bitset_test (P, i)
{
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))
{
for (r = rules[i].rhs; *r >= 0; r++)
if (ISTOKEN (t = *r) || bitset_test (N, t - ntokens))
{
bucket **symbols_sorted = XMALLOC (bucket *, nvars) - 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 = ntokens; i < nsyms; i++)
symbols_sorted[nontermmap[i]] = symbols[i];
for (i = ntokens; i < nsyms; i++)
for (i = 1; i < nrules + 1; 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];
if (ISVAR (rules[i].precsym))
/* Can this happen? */
rules[i].precsym = nontermmap[rules[i].precsym];
{
rule r;
fprintf (out, "#%-4d ", rules[i].number - 1);
{
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);
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,
i - 1,
rules[i].prec, rules[i].assoc, rules[i].useful,
rules[i].rhs - ritem, rules[i].rhs - ritem + rhs_count - 1,
/* Dumped the RHS. */
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, "%3d", *r);
/* 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, "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);
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,
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
#ifndef SYMTAB_H_
# define SYMTAB_H_
#ifndef SYMTAB_H_
# define SYMTAB_H_
+/* Associativity values for tokens and rules. */
+typedef enum
+{
+ right_assoc,
+ left_assoc,
+ non_assoc
+} associativity;
+
typedef enum
{
unknown_sym,
typedef enum
{
unknown_sym,