1 |
/* Match rules with nonterminals for bison, |
/* Match rules with nonterminals for bison, |
2 |
Copyright 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc. |
Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc. |
3 |
|
|
4 |
This file is part of Bison, the GNU Compiler Compiler. |
This file is part of Bison, the GNU Compiler Compiler. |
5 |
|
|
30 |
typedef struct rule_list_s |
typedef struct rule_list_s |
31 |
{ |
{ |
32 |
struct rule_list_s *next; |
struct rule_list_s *next; |
33 |
rule_number_t value; |
rule_t *value; |
34 |
} rule_list_t; |
} rule_list_t; |
35 |
|
|
36 |
rule_number_t **derives = NULL; |
rule_t ***derives = NULL; |
37 |
|
|
38 |
static void |
static void |
39 |
print_derives (void) |
print_derives (void) |
44 |
|
|
45 |
for (i = ntokens; i < nsyms; i++) |
for (i = ntokens; i < nsyms; i++) |
46 |
{ |
{ |
47 |
rule_number_t *rp; |
rule_t **rp; |
48 |
fprintf (stderr, "\t%s derives\n", symbols[i]->tag); |
fprintf (stderr, "\t%s derives\n", symbols[i]->tag); |
49 |
for (rp = derives[i]; *rp >= 0; rp++) |
for (rp = derives[i]; *rp; ++rp) |
50 |
{ |
{ |
51 |
fprintf (stderr, "\t\t%3d ", *rp); |
fprintf (stderr, "\t\t%3d ", (*rp)->user_number); |
52 |
rule_rhs_print (&rules[*rp], stderr); |
rule_rhs_print (*rp, stderr); |
53 |
} |
} |
54 |
} |
} |
55 |
|
|
58 |
|
|
59 |
|
|
60 |
void |
void |
61 |
set_derives (void) |
derives_compute (void) |
62 |
{ |
{ |
63 |
symbol_number_t i; |
symbol_number_t i; |
64 |
int r; |
int r; |
65 |
rule_number_t *q; |
rule_t **q; |
66 |
|
|
67 |
/* DSET[NTERM] -- A linked list of the numbers of the rules whose |
/* DSET[NTERM] -- A linked list of the numbers of the rules whose |
68 |
LHS is NTERM. */ |
LHS is NTERM. */ |
79 |
rule_list_t *p = &delts[r]; |
rule_list_t *p = &delts[r]; |
80 |
/* A new LHS is found. */ |
/* A new LHS is found. */ |
81 |
p->next = dset[lhs]; |
p->next = dset[lhs]; |
82 |
p->value = r; |
p->value = &rules[r]; |
83 |
dset[lhs] = p; |
dset[lhs] = p; |
84 |
} |
} |
85 |
|
|
86 |
/* 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 |
87 |
it a single array. */ |
it a single array. */ |
88 |
|
|
89 |
derives = XCALLOC (rule_number_t *, nvars) - ntokens; |
derives = XCALLOC (rule_t **, nvars) - ntokens; |
90 |
q = XCALLOC (rule_number_t, nvars + int_of_rule_number (nrules)); |
q = XCALLOC (rule_t *, nvars + int_of_rule_number (nrules)); |
91 |
|
|
92 |
for (i = ntokens; i < nsyms; i++) |
for (i = ntokens; i < nsyms; i++) |
93 |
{ |
{ |
98 |
*q++ = p->value; |
*q++ = p->value; |
99 |
p = p->next; |
p = p->next; |
100 |
} |
} |
101 |
*q++ = -1; |
*q++ = NULL; |
102 |
} |
} |
103 |
|
|
104 |
if (trace_flag & trace_sets) |
if (trace_flag & trace_sets) |
110 |
|
|
111 |
|
|
112 |
void |
void |
113 |
free_derives (void) |
derives_free (void) |
114 |
{ |
{ |
115 |
XFREE (derives[ntokens]); |
XFREE (derives[ntokens]); |
116 |
XFREE (derives + ntokens); |
XFREE (derives + ntokens); |