report: clean up its format

The format is inconsistent.  For instance most sections are
indented (including "Terminals unused in grammar" for instance), but
the sections "Terminals, with rules where they appear" and
"Nonterminals, with rules where they appear" are not.  Let's indent
them.  Also, these two sections try to wrap the output to avoid lines
too long.  Yet we don't do that in the rest of the file, for instance
when listing the lookaheads of an item.

For instance in the case of Bison's parse-gram.output we go from:

    Terminals, with rules where they appear

    "end of file" (0) 0
    error (256) 28 88
    "string" <char*> (258) 9 13 16 17 20 23 24 109 116
    [...]

    Nonterminals, with rules where they appear

    $accept (58)
        on left: 0
    input (59)
        on left: 1, on right: 0
    prologue_declarations (60)
        on left: 2 3, on right: 1 3
    prologue_declaration (61)
        on left: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24
        25 26 27 28 29, on right: 3
    [...]

to

    Terminals, with rules where they appear

    "end of file" (0) 0
    error (256) 28 88
    "string" <char*> (258) 9 13 16 17 20 23 24 109 116
    [...]

    Nonterminals, with rules where they appear

        $accept (58)
            on left: 0
        input (59)
            on left: 1
            on right: 0
        prologue_declarations (60)
            on left: 2 3
            on right: 1 3
        prologue_declaration (61)
            on left: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29
            on right: 3
    [...]

* src/print.c (END_TEST): Remove.
(print_terminal_symbols): Don't try to wrap the output.
(print_nonterminal_symbols): Likewise.
Make two different lines for occurrences on the left, and occurrence
on the rhs of the rules.
Indent by 4 and 8, not 3.
* src/reduce.c (reduce_output): Indent by 4, not 3.

* tests/conflicts.at, tests/existing.at, tests/reduce.at,
* tests/regression.at, tests/report.at:
Adjust.
This commit is contained in:
Akim Demaille
2019-02-03 14:26:37 +01:00
parent e346210c03
commit 51861998c7
7 changed files with 304 additions and 306 deletions

View File

@@ -357,17 +357,6 @@ print_state (FILE *out, state *s)
| Print information on the whole grammar. |
`-----------------------------------------*/
#define END_TEST(End) \
do { \
if (column + strlen (buffer) > (End)) \
{ \
fprintf (out, "%s\n ", buffer); \
column = 3; \
buffer[0] = 0; \
} \
} while (0)
static void
print_terminal_symbols (FILE *out)
{
@@ -377,29 +366,20 @@ print_terminal_symbols (FILE *out)
if (token_translations[i] != undeftoken->content->number)
{
const char *tag = symbols[token_translations[i]]->tag;
int column = strlen (tag);
char buffer[90];
buffer[0] = 0;
fputs (tag, out);
END_TEST (65);
fprintf (out, "%4s%s", "", tag);
if (symbols[token_translations[i]]->content->type_name)
{
column += fprintf (out, " <%s>",
symbols[token_translations[i]]->content->type_name);
END_TEST (65);
}
sprintf (buffer, " (%d)", i);
fprintf (out, " <%s>",
symbols[token_translations[i]]->content->type_name);
fprintf (out, " (%d)", i);
for (rule_number r = 0; r < nrules; r++)
for (item_number *rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
if (item_number_as_symbol_number (*rhsp) == token_translations[i])
{
END_TEST (65);
sprintf (buffer + strlen (buffer), " %d", r);
fprintf (out, " %d", r);
break;
}
fprintf (out, "%s\n", buffer);
fputc ('\n', out);
}
fputs ("\n\n", out);
}
@@ -412,14 +392,13 @@ print_nonterminal_symbols (FILE *out)
for (symbol_number i = ntokens; i < nsyms; i++)
{
const char *tag = symbols[i]->tag;
int column = strlen (tag);
int left_count = 0, right_count = 0;
for (rule_number r = 0; r < nrules; r++)
{
if (rules[r].lhs->number == i)
left_count++;
for (item_number *rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
for (item_number *rhsp = rules[r].rhs; 0 <= *rhsp; rhsp++)
if (item_number_as_symbol_number (*rhsp) == i)
{
right_count++;
@@ -427,49 +406,34 @@ print_nonterminal_symbols (FILE *out)
}
}
fputs (tag, out);
int column = 4 + strlen (tag);
fprintf (out, "%4s%s", "", tag);
if (symbols[i]->content->type_name)
column += fprintf (out, " <%s>",
symbols[i]->content->type_name);
char buffer[90];
buffer[0] = 0;
sprintf (buffer, " (%d)", i);
END_TEST (0);
fprintf (out, " (%d)\n", i);
if (left_count > 0)
{
END_TEST (65);
sprintf (buffer + strlen (buffer), _(" on left:"));
fprintf (out, "%8s%s", "", _("on left:"));
for (rule_number r = 0; r < nrules; r++)
{
if (rules[r].lhs->number == i)
{
END_TEST (65);
sprintf (buffer + strlen (buffer), " %d", r);
}
}
if (rules[r].lhs->number == i)
fprintf (out, " %d", r);
fputc ('\n', out);
}
if (right_count > 0)
{
if (left_count > 0)
sprintf (buffer + strlen (buffer), ",");
END_TEST (65);
sprintf (buffer + strlen (buffer), _(" on right:"));
fprintf (out, "%8s%s", "", _("on right:"));
for (rule_number r = 0; r < nrules; r++)
{
item_number *rhsp;
for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
if (item_number_as_symbol_number (*rhsp) == i)
{
END_TEST (65);
sprintf (buffer + strlen (buffer), " %d", r);
break;
}
}
for (item_number *rhsp = rules[r].rhs; 0 <= *rhsp; rhsp++)
if (item_number_as_symbol_number (*rhsp) == i)
{
fprintf (out, " %d", r);
break;
}
fputc ('\n', out);
}
fprintf (out, "%s\n", buffer);
}
}

View File

@@ -320,7 +320,7 @@ reduce_output (FILE *out)
{
fprintf (out, "%s\n\n", _("Nonterminals useless in grammar"));
for (int i = 0; i < nuseless_nonterminals; ++i)
fprintf (out, " %s\n", symbols[nsyms + i]->tag);
fprintf (out, " %s\n", symbols[nsyms + i]->tag);
fputs ("\n\n", out);
}
@@ -332,7 +332,7 @@ reduce_output (FILE *out)
if (!b)
fprintf (out, "%s\n\n", _("Terminals unused in grammar"));
b = true;
fprintf (out, " %s\n", symbols[i]->tag);
fprintf (out, " %s\n", symbols[i]->tag);
}
if (b)
fputs ("\n\n", out);