(struct rule_list): Renamed from struct rule_list_s.

(rule_list): Renamed from rule_list_t.
This commit is contained in:
Paul Eggert
2002-12-11 06:38:17 +00:00
parent 2b5ff972bf
commit a0b76449c7
2 changed files with 52 additions and 47 deletions

View File

@@ -1,5 +1,7 @@
/* Match rules with nonterminals for bison, /* Match rules with nonterminals for bison,
Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1984, 1989, 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.
@@ -20,20 +22,22 @@
#include "system.h" #include "system.h"
#include "getargs.h" #include "getargs.h"
#include "symtab.h"
#include "reader.h"
#include "gram.h"
#include "derives.h" #include "derives.h"
#include "gram.h"
#include "reader.h"
#include "symtab.h"
/* Linked list of rule numbers. */ /* Linked list of rule numbers. */
typedef struct rule_list_s typedef struct rule_list
{ {
struct rule_list_s *next; struct rule_list *next;
rule_t *value; rule *value;
} rule_list_t; } rule_list;
rule_t ***derives = NULL; rule ***derives = NULL;
static void static void
print_derives (void) print_derives (void)
@@ -44,7 +48,7 @@ print_derives (void)
for (i = ntokens; i < nsyms; i++) for (i = ntokens; i < nsyms; i++)
{ {
rule_t **rp; rule **rp;
fprintf (stderr, "\t%s derives\n", symbols[i]->tag); fprintf (stderr, "\t%s derives\n", symbols[i]->tag);
for (rp = derives[i]; *rp; ++rp) for (rp = derives[i]; *rp; ++rp)
{ {
@@ -60,23 +64,23 @@ print_derives (void)
void void
derives_compute (void) derives_compute (void)
{ {
symbol_number_t i; symbol_number i;
int r; int r;
rule_t **q; rule **q;
/* DSET[NTERM] -- A linked list of the numbers of the rules whose /* DSET[NTERM] -- A linked list of the numbers of the rules whose
LHS is NTERM. */ LHS is NTERM. */
rule_list_t **dset = XCALLOC (rule_list_t *, nvars) - ntokens; rule_list **dset = XCALLOC (rule_list *, nvars) - ntokens;
/* DELTS[RULE] -- There are NRULES rule number to attach to nterms. /* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
Instead of performing NRULES allocations for each, have an array Instead of performing NRULES allocations for each, have an array
indexed by rule numbers. */ indexed by rule numbers. */
rule_list_t *delts = XCALLOC (rule_list_t, nrules); rule_list *delts = XCALLOC (rule_list, nrules);
for (r = nrules - 1; r >= 0; --r) for (r = nrules - 1; r >= 0; --r)
{ {
symbol_number_t lhs = rules[r].lhs->number; symbol_number lhs = rules[r].lhs->number;
rule_list_t *p = &delts[r]; rule_list *p = &delts[r];
/* A new LHS is found. */ /* A new LHS is found. */
p->next = dset[lhs]; p->next = dset[lhs];
p->value = &rules[r]; p->value = &rules[r];
@@ -86,12 +90,12 @@ derives_compute (void)
/* DSET contains what we need under the form of a linked list. Make /* DSET contains what we need under the form of a linked list. Make
it a single array. */ it a single array. */
derives = XCALLOC (rule_t **, nvars) - ntokens; derives = XCALLOC (rule **, nvars) - ntokens;
q = XCALLOC (rule_t *, nvars + int_of_rule_number (nrules)); q = XCALLOC (rule *, nvars + int_of_rule_number (nrules));
for (i = ntokens; i < nsyms; i++) for (i = ntokens; i < nsyms; i++)
{ {
rule_list_t *p = dset[i]; rule_list *p = dset[i];
derives[i] = q; derives[i] = q;
while (p) while (p)
{ {

View File

@@ -24,18 +24,19 @@
do so. */ do so. */
#include "system.h" #include "system.h"
#include "getargs.h" #include "getargs.h"
#include "symtab.h"
#include "gram.h" #include "gram.h"
#include "reduce.h"
#include "nullable.h" #include "nullable.h"
#include "reduce.h"
#include "symtab.h"
/* Linked list of rules. */ /* Linked list of rules. */
typedef struct rule_list_s typedef struct rule_list
{ {
struct rule_list_s *next; struct rule_list *next;
rule_t *value; rule *value;
} rule_list_t; } rule_list;
bool *nullable = NULL; bool *nullable = NULL;
@@ -52,19 +53,19 @@ nullable_print (FILE *out)
void void
nullable_compute (void) nullable_compute (void)
{ {
rule_number_t ruleno; rule_number ruleno;
symbol_number_t *s1; symbol_number *s1;
symbol_number_t *s2; symbol_number *s2;
rule_list_t *p; rule_list *p;
symbol_number_t *squeue = XCALLOC (symbol_number_t, nvars); symbol_number *squeue = XCALLOC (symbol_number, nvars);
short *rcount = XCALLOC (short, nrules); short *rcount = XCALLOC (short, nrules);
/* RITEM contains all the rules, including useless productions. /* RITEM contains all the rules, including useless productions.
Hence we must allocate room for useless nonterminals too. */ Hence we must allocate room for useless nonterminals too. */
rule_list_t **rsets = XCALLOC (rule_list_t *, nvars) - ntokens; rule_list **rsets = XCALLOC (rule_list *, nvars) - ntokens;
/* This is said to be more elements than we actually use. /* This is said to be more elements than we actually use.
Supposedly NRITEMS - NRULES is enough. But why take the risk? */ Supposedly NRITEMS - NRULES is enough. But why take the risk? */
rule_list_t *relts = XCALLOC (rule_list_t, nritems + nvars + 1); rule_list *relts = XCALLOC (rule_list, nritems + nvars + 1);
nullable = XCALLOC (bool, nvars) - ntokens; nullable = XCALLOC (bool, nvars) - ntokens;
@@ -74,24 +75,24 @@ nullable_compute (void)
for (ruleno = 0; ruleno < nrules; ++ruleno) for (ruleno = 0; ruleno < nrules; ++ruleno)
if (rules[ruleno].useful) if (rules[ruleno].useful)
{ {
rule_t *rule = &rules[ruleno]; rule *rules_ruleno = &rules[ruleno];
if (rule->rhs[0] >= 0) if (rules_ruleno->rhs[0] >= 0)
{ {
/* This rule has a non empty RHS. */ /* This rule has a non empty RHS. */
item_number_t *r = NULL; item_number *r = NULL;
int any_tokens = 0; int any_tokens = 0;
for (r = rule->rhs; *r >= 0; ++r) for (r = rules_ruleno->rhs; *r >= 0; ++r)
if (ISTOKEN (*r)) if (ISTOKEN (*r))
any_tokens = 1; any_tokens = 1;
/* This rule has only nonterminals: schedule it for the second /* This rule has only nonterminals: schedule it for the second
pass. */ pass. */
if (!any_tokens) if (!any_tokens)
for (r = rule->rhs; *r >= 0; ++r) for (r = rules_ruleno->rhs; *r >= 0; ++r)
{ {
rcount[ruleno]++; rcount[ruleno]++;
p->next = rsets[*r]; p->next = rsets[*r];
p->value = rule; p->value = rules_ruleno;
rsets[*r] = p; rsets[*r] = p;
p++; p++;
} }
@@ -99,12 +100,12 @@ nullable_compute (void)
else else
{ {
/* This rule has an empty RHS. */ /* This rule has an empty RHS. */
if (item_number_as_rule_number (rule->rhs[0]) != ruleno) if (item_number_as_rule_number (rules_ruleno->rhs[0]) != ruleno)
abort (); abort ();
if (rule->useful && !nullable[rule->lhs->number]) if (rules_ruleno->useful && !nullable[rules_ruleno->lhs->number])
{ {
nullable[rule->lhs->number] = 1; nullable[rules_ruleno->lhs->number] = 1;
*s2++ = rule->lhs->number; *s2++ = rules_ruleno->lhs->number;
} }
} }
} }
@@ -112,12 +113,12 @@ nullable_compute (void)
while (s1 < s2) while (s1 < s2)
for (p = rsets[*s1++]; p; p = p->next) for (p = rsets[*s1++]; p; p = p->next)
{ {
rule_t *rule = p->value; rule *r = p->value;
if (--rcount[rule->number] == 0) if (--rcount[r->number] == 0)
if (rule->useful && !nullable[rule->lhs->number]) if (r->useful && !nullable[r->lhs->number])
{ {
nullable[rule->lhs->number] = 1; nullable[r->lhs->number] = 1;
*s2++ = rule->lhs->number; *s2++ = r->lhs->number;
} }
} }