all: show the rules in comments before the user actions

For instance, in the case of Bison's own parser:

    -  case 40:
    +  case 40:  /* grammar_declaration: "%code" "identifier" "{...}"  */
         {
           muscle_percent_code_grow ((yyvsp[-1].ID), (yylsp[-1]),
                                     translate_code_braceless ((yyvsp[0].BRACED_CODE), (yylsp[0])),
                                     (yylsp[0]));
           code_scanner_last_string_free ();
         }
         break;

* data/skeletons/c.m4: Modified.
* data/skeletons/d.m4: Modified.
* data/skeletons/java.m4: Modified.
* src/output.c (output_escaped): New.
(quoted_output): Use it, and rename as...
(output_quoted): this.
Adjust dependencies.
(rule_output): New.
(user_actions_output): Use it.
* data/skeletons/c.m4, data/skeletons/d.m4, data/skeletons/java.m4
(b4_case): Add support for $3, an optional comment.
This commit is contained in:
Akim Demaille
2020-06-05 16:51:59 +02:00
parent 2101b0e210
commit 39be113b1f
6 changed files with 140 additions and 119 deletions

View File

@@ -107,10 +107,8 @@ GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_state_number_table, state_number)
`----------------------------------------------------------------*/
static void
quoted_output (FILE *out, char const *cp)
output_escaped (FILE *out, const char *cp)
{
fprintf (out, "[[");
for (; *cp; cp++)
switch (*cp)
{
@@ -120,7 +118,13 @@ quoted_output (FILE *out, char const *cp)
case ']': fputs ("@}", out); break;
default: fputc (*cp, out); break;
}
}
static void
output_quoted (FILE *out, char const *cp)
{
fprintf (out, "[[");
output_escaped (out, cp);
fprintf (out, "]]");
}
@@ -132,7 +136,7 @@ quoted_output (FILE *out, char const *cp)
static void
string_output (FILE *out, char const *string)
{
quoted_output (out, quotearg_style (c_quoting_style, string));
output_quoted (out, quotearg_style (c_quoting_style, string));
}
@@ -474,6 +478,21 @@ symbol_numbers_output (FILE *out)
| Output the user reduction actions to OUT. |
`-------------------------------------------*/
static void
rule_output (const rule *r, FILE *out)
{
output_escaped (out, r->lhs->symbol->tag);
fputc (':', out);
if (0 <= *r->rhs)
for (item_number *rhsp = r->rhs; 0 <= *rhsp; ++rhsp)
{
fputc (' ', out);
output_escaped (out, symbols[*rhsp]->tag);
}
else
fputs (" %empty", out);
}
static void
user_actions_output (FILE *out)
{
@@ -492,9 +511,11 @@ user_actions_output (FILE *out)
string_output (out, rules[r].action_loc.start.file);
fprintf (out, ")dnl\n");
}
fprintf (out, "[%*s%s]])\n\n",
fprintf (out, "[%*s%s]],\n[[",
rules[r].action_loc.start.column - 1, "",
rules[r].action);
rule_output (&rules[r], out);
fprintf (out, "]])\n\n");
}
fputs ("])\n\n", out);
}