* src/output.c (quoted_output): Split into...
(quoted_output, string_output): these.
Use the former when outputting a type_name.
* tests/input.at: Check this case.
* src/symtab.h: Comment changes.
GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number)
GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number)
-/*--------------------------------------------------------------------.
-| Print to OUT a representation of STRING escaped both for C and M4. |
-`--------------------------------------------------------------------*/
+/*----------------------------------------------------------------.
+| Print to OUT a representation of CP quoted and escaped for M4. |
+`----------------------------------------------------------------*/
-escaped_output (FILE *out, char const *string)
+quoted_output (FILE *out, char const *cp)
- for (p = quotearg_style (c_quoting_style, string); *p; p++)
- switch (*p)
+ for (; *cp; cp++)
+ switch (*cp)
{
case '$': fputs ("$][", out); break;
case '@': fputs ("@@", out); break;
case '[': fputs ("@{", out); break;
case ']': fputs ("@}", out); break;
{
case '$': fputs ("$][", out); break;
case '@': fputs ("@@", out); break;
case '[': fputs ("@{", out); break;
case ']': fputs ("@}", out); break;
- default: fputc (*p, out); break;
+ default: fputc (*cp, out); break;
+/*----------------------------------------------------------------.
+| Print to OUT a representation of STRING quoted and escaped both |
+| for C and M4. |
+`----------------------------------------------------------------*/
+
+static void
+string_output (FILE *out, char const *string)
+{
+ quoted_output (out, quotearg_style (c_quoting_style, string));
+}
+
/*------------------------------------------------------------------.
| Prepare the muscles related to the symbols: translate, tname, and |
/*------------------------------------------------------------------.
| Prepare the muscles related to the symbols: translate, tname, and |
{
fprintf (out, "b4_case(%d, [b4_syncline(%d, ", r + 1,
rules[r].action_location.start.line);
{
fprintf (out, "b4_case(%d, [b4_syncline(%d, ", r + 1,
rules[r].action_location.start.line);
- escaped_output (out, rules[r].action_location.start.file);
+ string_output (out, rules[r].action_location.start.file);
fprintf (out, ")\n[ %s]])\n\n", rules[r].action);
}
fputs ("])\n\n", out);
fprintf (out, ")\n[ %s]])\n\n", rules[r].action);
}
fputs ("])\n\n", out);
code, optional typename. */
fprintf (out, "%s[", sep);
sep = ",\n";
code, optional typename. */
fprintf (out, "%s[", sep);
sep = ",\n";
- escaped_output (out, loc.start.file);
+ string_output (out, loc.start.file);
fprintf (out, ", %d, ", loc.start.line);
fprintf (out, ", %d, ", loc.start.line);
- escaped_output (out, sym->tag);
+ quoted_output (out, sym->tag);
fprintf (out, ", %d, [[%s]]", sym->number, code);
if (sym->type_name)
fprintf (out, ", %d, [[%s]]", sym->number, code);
if (sym->type_name)
- fprintf (out, ", [[%s]]", sym->type_name);
+ {
+ fputs (", ", out);
+ quoted_output (out, sym->type_name);
+ }
/** The location of its first occurrence. */
location location;
/** The location of its first occurrence. */
location location;
+ /** Its \c \%type.
+
+ Beware that this is the type_name as was entered by the user,
+ including silly things such as "]" if she entered "%token <]> t".
+ Therefore, when outputting type_name to M4, be sure to escape it
+ into "@}". See quoted_output for instance. */
uniqstr type_name;
/** Its \c \%type's location. */
uniqstr type_name;
/** Its \c \%type's location. */
$$;
$<$1(DEAD %initial-action)>$
};
$$;
$<$1(DEAD %initial-action)>$
};
+%printer
+{
+ $$
+ $<$1(DEAD %printer)>$
+} <> <*>;
+%lex-param
+{
+ $1(DEAD %lex-param)
+};
+%parse-param
+{
+ $1(DEAD %parse-param)
+};