47 |
} |
} |
48 |
#endif |
#endif |
49 |
|
|
|
static inline const char * |
|
|
escape (const char *s) |
|
|
{ |
|
|
return quotearg_n_style (1, escape_quoting_style, s); |
|
|
} |
|
|
|
|
|
/* Be cautious not to use twice the same slot in a single expression. */ |
|
|
static inline const char * |
|
|
escape2 (const char *s) |
|
|
{ |
|
|
return quotearg_n_style (2, escape_quoting_style, s); |
|
|
} |
|
|
|
|
50 |
|
|
51 |
/*--------------------------------. |
/*--------------------------------. |
52 |
| Report information on a state. | |
| Report information on a state. | |
81 |
sp++; |
sp++; |
82 |
|
|
83 |
rule = -(*sp); |
rule = -(*sp); |
84 |
fprintf (out, " %s -> ", escape (rules[rule].lhs->tag)); |
fprintf (out, " %s -> ", symbol_tag_get (rules[rule].lhs)); |
85 |
|
|
86 |
for (sp = rules[rule].rhs; sp < sp1; sp++) |
for (sp = rules[rule].rhs; sp < sp1; sp++) |
87 |
fprintf (out, "%s ", escape (symbols[*sp]->tag)); |
fprintf (out, "%s ", symbol_tag_get (symbols[*sp])); |
88 |
|
|
89 |
fputc ('.', out); |
fputc ('.', out); |
90 |
|
|
91 |
for (/* Nothing */; *sp >= 0; ++sp) |
for (/* Nothing */; *sp >= 0; ++sp) |
92 |
fprintf (out, " %s", escape (symbols[*sp]->tag)); |
fprintf (out, " %s", symbol_tag_get (symbols[*sp])); |
93 |
|
|
94 |
/* Display the lookaheads? */ |
/* Display the lookaheads? */ |
95 |
if (report_flag & report_lookaheads) |
if (report_flag & report_lookaheads) |
110 |
if (bitset_test (LA[state->lookaheadsp + j], k) |
if (bitset_test (LA[state->lookaheadsp + j], k) |
111 |
&& LArule[state->lookaheadsp + j]->number == rule) |
&& LArule[state->lookaheadsp + j]->number == rule) |
112 |
fprintf (out, "%s%s", |
fprintf (out, "%s%s", |
113 |
quotearg_style (escape_quoting_style, |
symbol_tag_get (symbols[k]), |
|
symbols[k]->tag), |
|
114 |
--nlookaheads ? ", " : ""); |
--nlookaheads ? ", " : ""); |
115 |
fprintf (out, "]"); |
fprintf (out, "]"); |
116 |
} |
} |
138 |
symbol_number_t symbol = states[state1]->accessing_symbol; |
symbol_number_t symbol = states[state1]->accessing_symbol; |
139 |
fprintf (out, |
fprintf (out, |
140 |
_(" %-4s\tshift, and go to state %d\n"), |
_(" %-4s\tshift, and go to state %d\n"), |
141 |
escape (symbols[symbol]->tag), state1); |
symbol_tag_get (symbols[symbol]), state1); |
142 |
} |
} |
143 |
|
|
144 |
if (i > 0) |
if (i > 0) |
155 |
for (i = 0; i < errp->nerrs; ++i) |
for (i = 0; i < errp->nerrs; ++i) |
156 |
if (errp->errs[i]) |
if (errp->errs[i]) |
157 |
fprintf (out, _(" %-4s\terror (nonassociative)\n"), |
fprintf (out, _(" %-4s\terror (nonassociative)\n"), |
158 |
escape (symbols[errp->errs[i]]->tag)); |
symbol_tag_get (symbols[errp->errs[i]])); |
159 |
|
|
160 |
if (i > 0) |
if (i > 0) |
161 |
fputc ('\n', out); |
fputc ('\n', out); |
179 |
int state1 = shiftp->shifts[i]; |
int state1 = shiftp->shifts[i]; |
180 |
symbol_number_t symbol = states[state1]->accessing_symbol; |
symbol_number_t symbol = states[state1]->accessing_symbol; |
181 |
fprintf (out, _(" %-4s\tgo to state %d\n"), |
fprintf (out, _(" %-4s\tgo to state %d\n"), |
182 |
escape (symbols[symbol]->tag), state1); |
symbol_tag_get (symbols[symbol]), state1); |
183 |
} |
} |
184 |
|
|
185 |
fputc ('\n', out); |
fputc ('\n', out); |
203 |
int rule = redp->rules[0]; |
int rule = redp->rules[0]; |
204 |
symbol_number_t symbol = rules[rule].lhs->number; |
symbol_number_t symbol = rules[rule].lhs->number; |
205 |
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"), |
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"), |
206 |
rule - 1, escape (symbols[symbol]->tag)); |
rule - 1, symbol_tag_get (symbols[symbol])); |
207 |
return; |
return; |
208 |
} |
} |
209 |
|
|
232 |
for (i = 0; i < ntokens; i++) |
for (i = 0; i < ntokens; i++) |
233 |
if (bitset_test (lookaheadset, i)) |
if (bitset_test (lookaheadset, i)) |
234 |
fprintf (out, _(" %-4s\t[reduce using rule %d (%s)]\n"), |
fprintf (out, _(" %-4s\t[reduce using rule %d (%s)]\n"), |
235 |
escape (symbols[i]->tag), |
symbol_tag_get (symbols[i]), |
236 |
default_rule->number - 1, |
default_rule->number - 1, |
237 |
escape2 (default_rule->lhs->tag)); |
symbol_tag_get_n (default_rule->lhs, 1)); |
238 |
|
|
239 |
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"), |
fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"), |
240 |
default_rule->number - 1, |
default_rule->number - 1, |
241 |
escape (default_rule->lhs->tag)); |
symbol_tag_get (default_rule->lhs)); |
242 |
} |
} |
243 |
else if (state->nlookaheads >= 1) |
else if (state->nlookaheads >= 1) |
244 |
{ |
{ |
288 |
if (state->lookaheadsp + j != default_LA) |
if (state->lookaheadsp + j != default_LA) |
289 |
fprintf (out, |
fprintf (out, |
290 |
_(" %-4s\treduce using rule %d (%s)\n"), |
_(" %-4s\treduce using rule %d (%s)\n"), |
291 |
escape (symbols[i]->tag), |
symbol_tag_get (symbols[i]), |
292 |
LArule[state->lookaheadsp + j]->number - 1, |
LArule[state->lookaheadsp + j]->number - 1, |
293 |
escape2 (LArule[state->lookaheadsp + j]->lhs->tag)); |
symbol_tag_get_n (LArule[state->lookaheadsp + j]->lhs, 1)); |
294 |
else |
else |
295 |
defaulted = 1; |
defaulted = 1; |
296 |
|
|
301 |
if (defaulted) |
if (defaulted) |
302 |
fprintf (out, |
fprintf (out, |
303 |
_(" %-4s\treduce using rule %d (%s)\n"), |
_(" %-4s\treduce using rule %d (%s)\n"), |
304 |
escape (symbols[i]->tag), |
symbol_tag_get (symbols[i]), |
305 |
LArule[default_LA]->number - 1, |
LArule[default_LA]->number - 1, |
306 |
escape2 (LArule[default_LA]->lhs->tag)); |
symbol_tag_get_n (LArule[default_LA]->lhs, 1)); |
307 |
defaulted = 0; |
defaulted = 0; |
308 |
fprintf (out, |
fprintf (out, |
309 |
_(" %-4s\t[reduce using rule %d (%s)]\n"), |
_(" %-4s\t[reduce using rule %d (%s)]\n"), |
310 |
escape (symbols[i]->tag), |
symbol_tag_get (symbols[i]), |
311 |
LArule[state->lookaheadsp + j]->number - 1, |
LArule[state->lookaheadsp + j]->number - 1, |
312 |
escape2 (LArule[state->lookaheadsp + j]->lhs->tag)); |
symbol_tag_get_n (LArule[state->lookaheadsp + j]->lhs, 1)); |
313 |
} |
} |
314 |
} |
} |
315 |
} |
} |
317 |
if (default_LA >= 0) |
if (default_LA >= 0) |
318 |
fprintf (out, _(" $default\treduce using rule %d (%s)\n"), |
fprintf (out, _(" $default\treduce using rule %d (%s)\n"), |
319 |
default_rule->number - 1, |
default_rule->number - 1, |
320 |
escape (default_rule->lhs->tag)); |
symbol_tag_get (default_rule->lhs)); |
321 |
} |
} |
322 |
} |
} |
323 |
|
|
375 |
print_grammar (FILE *out) |
print_grammar (FILE *out) |
376 |
{ |
{ |
377 |
symbol_number_t i; |
symbol_number_t i; |
|
int j; |
|
378 |
item_number_t *rule; |
item_number_t *rule; |
379 |
char buffer[90]; |
char buffer[90]; |
380 |
int column = 0; |
int column = 0; |
381 |
|
|
382 |
/* rule # : LHS -> RHS */ |
grammar_rules_print (out); |
|
fprintf (out, "%s\n\n", _("Grammar")); |
|
|
fprintf (out, " %s\n", _("Number, Line, Rule")); |
|
|
for (j = 1; j < nrules + 1; j++) |
|
|
{ |
|
|
fprintf (out, " %3d %3d %s ->", |
|
|
j - 1, rules[j].location.first_line, |
|
|
escape (rules[j].lhs->tag)); |
|
|
rule = rules[j].rhs; |
|
|
if (*rule >= 0) |
|
|
while (*rule >= 0) |
|
|
fprintf (out, " %s", escape (symbols[*rule++]->tag)); |
|
|
else |
|
|
fprintf (out, " /* %s */", _("empty")); |
|
|
fputc ('\n', out); |
|
|
} |
|
|
fputs ("\n\n", out); |
|
|
|
|
383 |
|
|
384 |
/* TERMINAL (type #) : rule #s terminal is on RHS */ |
/* TERMINAL (type #) : rule #s terminal is on RHS */ |
385 |
fprintf (out, "%s\n\n", _("Terminals, with rules where they appear")); |
fprintf (out, "%s\n\n", _("Terminals, with rules where they appear")); |
386 |
for (i = 0; i < max_user_token_number + 1; i++) |
for (i = 0; i < max_user_token_number + 1; i++) |
387 |
if (token_translations[i] != undeftoken->number) |
if (token_translations[i] != undeftoken->number) |
388 |
{ |
{ |
389 |
|
const char *tag = symbol_tag_get (symbols[token_translations[i]]); |
390 |
|
int r; |
391 |
buffer[0] = 0; |
buffer[0] = 0; |
392 |
column = strlen (escape (symbols[token_translations[i]]->tag)); |
column = strlen (tag); |
393 |
fputs (escape (symbols[token_translations[i]]->tag), out); |
fputs (tag, out); |
394 |
END_TEST (50); |
END_TEST (50); |
395 |
sprintf (buffer, " (%d)", i); |
sprintf (buffer, " (%d)", i); |
396 |
|
|
397 |
for (j = 1; j < nrules + 1; j++) |
for (r = 1; r < nrules + 1; r++) |
398 |
for (rule = rules[j].rhs; *rule >= 0; rule++) |
for (rule = rules[r].rhs; *rule >= 0; rule++) |
399 |
if (item_number_as_symbol_number (*rule) == token_translations[i]) |
if (item_number_as_symbol_number (*rule) == token_translations[i]) |
400 |
{ |
{ |
401 |
END_TEST (65); |
END_TEST (65); |
402 |
sprintf (buffer + strlen (buffer), " %d", j - 1); |
sprintf (buffer + strlen (buffer), " %d", r - 1); |
403 |
break; |
break; |
404 |
} |
} |
405 |
fprintf (out, "%s\n", buffer); |
fprintf (out, "%s\n", buffer); |
411 |
for (i = ntokens; i < nsyms; i++) |
for (i = ntokens; i < nsyms; i++) |
412 |
{ |
{ |
413 |
int left_count = 0, right_count = 0; |
int left_count = 0, right_count = 0; |
414 |
|
int r; |
415 |
|
const char *tag = symbol_tag_get (symbols[i]); |
416 |
|
|
417 |
for (j = 1; j < nrules + 1; j++) |
for (r = 1; r < nrules + 1; r++) |
418 |
{ |
{ |
419 |
if (rules[j].lhs->number == i) |
if (rules[r].lhs->number == i) |
420 |
left_count++; |
left_count++; |
421 |
for (rule = rules[j].rhs; *rule >= 0; rule++) |
for (rule = rules[r].rhs; *rule >= 0; rule++) |
422 |
if (item_number_as_symbol_number (*rule) == i) |
if (item_number_as_symbol_number (*rule) == i) |
423 |
{ |
{ |
424 |
right_count++; |
right_count++; |
427 |
} |
} |
428 |
|
|
429 |
buffer[0] = 0; |
buffer[0] = 0; |
430 |
fputs (escape (symbols[i]->tag), out); |
fputs (tag, out); |
431 |
column = strlen (escape (symbols[i]->tag)); |
column = strlen (tag); |
432 |
sprintf (buffer, " (%d)", i); |
sprintf (buffer, " (%d)", i); |
433 |
END_TEST (0); |
END_TEST (0); |
434 |
|
|
437 |
END_TEST (50); |
END_TEST (50); |
438 |
sprintf (buffer + strlen (buffer), _(" on left:")); |
sprintf (buffer + strlen (buffer), _(" on left:")); |
439 |
|
|
440 |
for (j = 1; j < nrules + 1; j++) |
for (r = 1; r < nrules + 1; r++) |
441 |
{ |
{ |
442 |
END_TEST (65); |
END_TEST (65); |
443 |
if (rules[j].lhs->number == i) |
if (rules[r].lhs->number == i) |
444 |
sprintf (buffer + strlen (buffer), " %d", j - 1); |
sprintf (buffer + strlen (buffer), " %d", r - 1); |
445 |
} |
} |
446 |
} |
} |
447 |
|
|
451 |
sprintf (buffer + strlen (buffer), ","); |
sprintf (buffer + strlen (buffer), ","); |
452 |
END_TEST (50); |
END_TEST (50); |
453 |
sprintf (buffer + strlen (buffer), _(" on right:")); |
sprintf (buffer + strlen (buffer), _(" on right:")); |
454 |
for (j = 1; j < nrules + 1; j++) |
for (r = 1; r < nrules + 1; r++) |
455 |
{ |
{ |
456 |
for (rule = rules[j].rhs; *rule >= 0; rule++) |
for (rule = rules[r].rhs; *rule >= 0; rule++) |
457 |
if (item_number_as_symbol_number (*rule) == i) |
if (item_number_as_symbol_number (*rule) == i) |
458 |
{ |
{ |
459 |
END_TEST (65); |
END_TEST (65); |
460 |
sprintf (buffer + strlen (buffer), " %d", j - 1); |
sprintf (buffer + strlen (buffer), " %d", r - 1); |
461 |
break; |
break; |
462 |
} |
} |
463 |
} |
} |