|
|
1.1 root 1: /* Match rules with nonterminals for bison,
2: Copyright (C) 1984, 1989 Free Software Foundation, Inc.
3:
4: This file is part of Bison, the GNU Compiler Compiler.
5:
6: Bison is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: Bison is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with Bison; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: /* set_derives finds, for each variable (nonterminal), which rules can derive it.
22: It sets up the value of derives so that
23: derives[i - ntokens] points to a vector of rule numbers,
24: terminated with -1. */
25:
26: #include <stdio.h>
27: #include "system.h"
28: #include "new.h"
29: #include "types.h"
30: #include "gram.h"
31:
32:
33: short **derives;
34:
35: void
36: set_derives()
37: {
38: register int i;
39: register int lhs;
40: register shorts *p;
41: register short *q;
42: register shorts **dset;
43: register shorts *delts;
44:
45: dset = NEW2(nvars, shorts *) - ntokens;
46: delts = NEW2(nrules + 1, shorts);
47:
48: p = delts;
49: for (i = nrules; i > 0; i--)
50: {
51: lhs = rlhs[i];
52: if (lhs >= 0)
53: {
54: p->next = dset[lhs];
55: p->value = i;
56: dset[lhs] = p;
57: p++;
58: }
59: }
60:
61: derives = NEW2(nvars, short *) - ntokens;
62: q = NEW2(nvars + nrules, short);
63:
64: for (i = ntokens; i < nsyms; i++)
65: {
66: derives[i] = q;
67: p = dset[i];
68: while (p)
69: {
70: *q++ = p->value;
71: p = p->next;
72: }
73: *q++ = -1;
74: }
75:
76: #ifdef DEBUG
77: print_derives();
78: #endif
79:
80: FREE(dset + ntokens);
81: FREE(delts);
82: }
83:
84: void
85: free_derives()
86: {
87: FREE(derives[ntokens]);
88: FREE(derives + ntokens);
89: }
90:
91:
92:
93: #ifdef DEBUG
94:
95: print_derives()
96: {
97: register int i;
98: register short *sp;
99:
100: extern char **tags;
101:
102: printf("\n\n\nDERIVES\n\n");
103:
104: for (i = ntokens; i < nsyms; i++)
105: {
106: printf("%s derives", tags[i]);
107: for (sp = derives[i]; *sp > 0; sp++)
108: {
109: printf(" %d", *sp);
110: }
111: putchar('\n');
112: }
113:
114: putchar('\n');
115: }
116:
117: #endif
118:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.