21 |
|
|
22 |
#include "system.h" |
#include "system.h" |
23 |
#include "quotearg.h" |
#include "quotearg.h" |
|
#include "gram.h" |
|
24 |
#include "symtab.h" |
#include "symtab.h" |
25 |
|
#include "gram.h" |
26 |
|
#include "reduce.h" |
27 |
#include "reader.h" |
#include "reader.h" |
28 |
|
|
29 |
/* comments for these variables are in gram.h */ |
/* comments for these variables are in gram.h */ |
103 |
|
|
104 |
return max; |
return max; |
105 |
} |
} |
106 |
|
|
107 |
|
|
108 |
|
/*-------------------. |
109 |
|
| Dump the grammar. | |
110 |
|
`-------------------*/ |
111 |
|
|
112 |
|
void |
113 |
|
grammar_dump (FILE *out, const char *title) |
114 |
|
{ |
115 |
|
int i; |
116 |
|
item_number_t *r; |
117 |
|
|
118 |
|
fprintf (out, "%s\n\n", title); |
119 |
|
fprintf (out, |
120 |
|
"ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n", |
121 |
|
ntokens, nvars, nsyms, nrules, nritems); |
122 |
|
fprintf (out, "Variables\n---------\n\n"); |
123 |
|
fprintf (out, "Value Sprec Sassoc Tag\n"); |
124 |
|
for (i = ntokens; i < nsyms; i++) |
125 |
|
fprintf (out, "%5d %5d %5d %s\n", |
126 |
|
i, |
127 |
|
symbols[i]->prec, symbols[i]->assoc, |
128 |
|
quotearg_style (escape_quoting_style, symbols[i]->tag)); |
129 |
|
fprintf (out, "\n\n"); |
130 |
|
fprintf (out, "Rules\n-----\n\n"); |
131 |
|
fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"); |
132 |
|
for (i = 1; i < nrules + nuseless_productions + 1; i++) |
133 |
|
{ |
134 |
|
int rhs_count = 0; |
135 |
|
/* Find the last RHS index in ritems. */ |
136 |
|
for (r = rules[i].rhs; *r >= 0; ++r) |
137 |
|
++rhs_count; |
138 |
|
fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->", |
139 |
|
i - 1, |
140 |
|
rules[i].prec ? rules[i].prec->prec : 0, |
141 |
|
rules[i].prec ? rules[i].prec->assoc : 0, |
142 |
|
rules[i].useful, |
143 |
|
rules[i].rhs - ritem, |
144 |
|
rules[i].rhs - ritem + rhs_count - 1, |
145 |
|
rules[i].lhs->number); |
146 |
|
/* Dumped the RHS. */ |
147 |
|
for (r = rules[i].rhs; *r >= 0; r++) |
148 |
|
fprintf (out, " %3d", *r); |
149 |
|
fprintf (out, " [%d]\n", -(*r) - 1); |
150 |
|
} |
151 |
|
fprintf (out, "\n\n"); |
152 |
|
fprintf (out, "Rules interpreted\n-----------------\n\n"); |
153 |
|
for (i = 1; i < nrules + nuseless_productions + 1; i++) |
154 |
|
{ |
155 |
|
fprintf (out, "%-5d %s :", |
156 |
|
i, quotearg_style (escape_quoting_style, rules[i].lhs->tag)); |
157 |
|
for (r = rules[i].rhs; *r >= 0; r++) |
158 |
|
fprintf (out, " %s", |
159 |
|
quotearg_style (escape_quoting_style, symbols[*r]->tag)); |
160 |
|
fputc ('\n', out); |
161 |
|
} |
162 |
|
fprintf (out, "\n\n"); |
163 |
|
} |