47 |
int pure_parser = 0; |
int pure_parser = 0; |
48 |
|
|
49 |
|
|
50 |
|
/*----------------------------------------------------------------. |
51 |
|
| Print this RULE's number and lhs on OUT. If a PREVIOUS_LHS was | |
52 |
|
| already displayed (by a previous call for another rule), avoid | |
53 |
|
| useless repetitions. | |
54 |
|
`----------------------------------------------------------------*/ |
55 |
|
|
56 |
|
void |
57 |
|
rule_lhs_print (rule_t *rule, symbol_t *previous_lhs, FILE *out) |
58 |
|
{ |
59 |
|
fprintf (out, " %3d ", rule->number - 1); |
60 |
|
if (previous_lhs != rule->lhs) |
61 |
|
{ |
62 |
|
fprintf (out, "%s:", symbol_tag_get (rule->lhs)); |
63 |
|
} |
64 |
|
else |
65 |
|
{ |
66 |
|
int n; |
67 |
|
for (n = strlen (symbol_tag_get (previous_lhs)); n > 0; --n) |
68 |
|
fputc (' ', out); |
69 |
|
fputc ('|', out); |
70 |
|
} |
71 |
|
} |
72 |
|
|
73 |
|
|
74 |
/*--------------------------------------. |
/*--------------------------------------. |
75 |
| Return the number of symbols in RHS. | |
| Return the number of symbols in RHS. | |
76 |
`--------------------------------------*/ |
`--------------------------------------*/ |
163 |
| (exclusive) on OUT under TITLE. | |
| (exclusive) on OUT under TITLE. | |
164 |
`----------------------------------------------------------------*/ |
`----------------------------------------------------------------*/ |
165 |
|
|
|
static inline void |
|
|
blanks_print (unsigned n, FILE *out) |
|
|
{ |
|
|
for (/* Nothing*/; n > 0; --n) |
|
|
fputc (' ', out); |
|
|
} |
|
|
|
|
166 |
void |
void |
167 |
grammar_rules_partial_print (FILE *out, const char *title, |
grammar_rules_partial_print (FILE *out, const char *title, |
168 |
rule_number_t begin, rule_number_t end) |
rule_number_t begin, rule_number_t end) |
169 |
{ |
{ |
170 |
int r; |
int r; |
171 |
symbol_t *last_lhs = NULL; |
symbol_t *previous_lhs = NULL; |
172 |
|
|
173 |
/* rule # : LHS -> RHS */ |
/* rule # : LHS -> RHS */ |
174 |
fprintf (out, "%s\n\n", title); |
fprintf (out, "%s\n\n", title); |
175 |
for (r = begin; r < end; r++) |
for (r = begin; r < end; r++) |
176 |
{ |
{ |
177 |
if (last_lhs && last_lhs != rules[r].lhs) |
if (previous_lhs && previous_lhs != rules[r].lhs) |
178 |
fputc ('\n', out); |
fputc ('\n', out); |
179 |
|
rule_lhs_print (&rules[r], previous_lhs, out); |
|
fprintf (out, " %3d ", r - 1); |
|
|
if (last_lhs != rules[r].lhs) |
|
|
{ |
|
|
last_lhs = rules[r].lhs; |
|
|
fprintf (out, "%s:", symbol_tag_get (last_lhs)); |
|
|
} |
|
|
else |
|
|
{ |
|
|
blanks_print (strlen (symbol_tag_get (last_lhs)), out); |
|
|
fputc ('|', out); |
|
|
} |
|
180 |
rule_rhs_print (&rules[r], out); |
rule_rhs_print (&rules[r], out); |
181 |
|
previous_lhs = rules[r].lhs; |
182 |
} |
} |
183 |
fputs ("\n\n", out); |
fputs ("\n\n", out); |
184 |
} |
} |