+add_param (char const *type, char *decl, location loc)
+{
+ static char const alphanum[] =
+ "0123456789"
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "_";
+ char const *alpha = alphanum + 10;
+ char const *name_start = NULL;
+ char *p;
+
+ for (p = decl; *p; p++)
+ if ((p == decl || ! strchr (alphanum, p[-1])) && strchr (alpha, p[0]))
+ name_start = p;
+
+ /* Strip the surrounding '{' and '}'. */
+ decl++;
+ p[-1] = '\0';
+
+ if (! name_start)
+ complain_at (loc, _("missing identifier in parameter declaration"));
+ else
+ {
+ char *name;
+ size_t name_len;
+
+ for (name_len = 1;
+ name_start[name_len] && strchr (alphanum, name_start[name_len]);
+ name_len++)
+ continue;
+
+ name = xmalloc (name_len + 1);
+ memcpy (name, name_start, name_len);
+ name[name_len] = '\0';
+ muscle_pair_list_grow (type, decl, name);
+ free (name);
+ }
+
+ scanner_last_string_free ();
+}
+
+/*----------------------------------------------------.
+| When debugging the parser, display tokens' values. |
+`----------------------------------------------------*/
+
+static void
+print_token_value (FILE *file, int type, YYSTYPE const *value)