- return s;
-}
-
-
-/*------------------------------------------------------------------.
-| TEXT is pointing to a wannabee semantic value (i.e., a `$'). |
-| |
-| Possible inputs: $[<TYPENAME>]($|integer) |
-| |
-| Output to the STRING_OBSTACK a reference to this semantic value. |
-`------------------------------------------------------------------*/
-
-static inline void
-handle_action_dollar (char *text, location_t location)
-{
- const char *type_name = NULL;
- char *cp = text + 1;
-
- /* Get the type name if explicit. */
- if (*cp == '<')
- {
- type_name = ++cp;
- while (*cp != '>')
- ++cp;
- *cp = '\0';
- ++cp;
- }
-
- if (*cp == '$')
- {
- if (!type_name)
- type_name = symbol_list_n_type_name_get (current_rule, location, 0);
- if (!type_name && typed)
- complain_at (location, _("$$ of `%s' has no declared type"),
- current_rule->sym->tag);
- if (!type_name)
- type_name = "";
- obstack_fgrow1 (&string_obstack,
- "]b4_lhs_value([%s])[", type_name);
- }
- else
- {
- long num;
- errno = 0;
- num = strtol (cp, 0, 10);
-
- if (INT_MIN <= num && num <= rule_length && ! errno)
- {
- int n = num;
- if (!type_name && n > 0)
- type_name = symbol_list_n_type_name_get (current_rule, location,
- n);
- if (!type_name && typed)
- complain_at (location, _("$%d of `%s' has no declared type"),
- n, current_rule->sym->tag);
- if (!type_name)
- type_name = "";
- obstack_fgrow3 (&string_obstack,
- "]b4_rhs_value([%d], [%d], [%s])[",
- rule_length, n, type_name);
- }
- else
- complain_at (location, _("integer out of range: %s"), quote (text));
- }