mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 21:03:04 +00:00
Fix bug that mistakes braced code in a declaration in the rules section
to be a rule action. Mentioned at <http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00105.html>. * src/scan-gram.l: Move midrule action detection from the start of the scanning of any braced code to... * src/parse-gram.y (rhs): ... the parsing of braced code as a rule action. For readability, use $2 and @2 rather than the equivalent global variables. * tests/regression.at (Braced code in declaration in rules section): New test to catch the error fixed by the above patch. Work on code readability some. * src/scan-code.l (current_rule): Get rid of this misleading and redundant declaration: it's actually extern'ed in reader.h. (YY_DECL, code_lex, handle_action_dollar, handle_action_at, translate_action): Add a rule argument and use it instead of the global current_rule. (translate_rule_action): This already receives current_rule through an argument, so pass it on to translate_action instead of assigning current_rule to current_rule. (translate_symbol_action, translate_code): Pass rule = NULL to translate_action.
This commit is contained in:
@@ -45,18 +45,16 @@
|
||||
|
||||
/* The current calling start condition: SC_RULE_ACTION or
|
||||
SC_SYMBOL_ACTION. */
|
||||
# define YY_DECL const char *code_lex (int sc_context)
|
||||
# define YY_DECL const char *code_lex (int sc_context, symbol_list *rule)
|
||||
YY_DECL;
|
||||
|
||||
#define YY_USER_ACTION location_compute (loc, &loc->end, yytext, yyleng);
|
||||
|
||||
static void handle_action_dollar (char *cp, location dollar_loc);
|
||||
static void handle_action_at (char *cp, location at_loc);
|
||||
static void handle_action_dollar (symbol_list *rule, char *cp,
|
||||
location dollar_loc);
|
||||
static void handle_action_at (symbol_list *rule, char *cp, location at_loc);
|
||||
static location the_location;
|
||||
static location *loc = &the_location;
|
||||
|
||||
/* The rule being processed. */
|
||||
symbol_list *current_rule;
|
||||
%}
|
||||
/* C and C++ comments in code. */
|
||||
%x SC_COMMENT SC_LINE_COMMENT
|
||||
@@ -153,8 +151,8 @@ splice (\\[ \f\t\v]*\n)*
|
||||
|
||||
<SC_RULE_ACTION>
|
||||
{
|
||||
"$"("<"{tag}">")?(-?[0-9]+|"$") handle_action_dollar (yytext, *loc);
|
||||
"@"(-?[0-9]+|"$") handle_action_at (yytext, *loc);
|
||||
"$"("<"{tag}">")?(-?[0-9]+|"$") handle_action_dollar (rule, yytext, *loc);
|
||||
"@"(-?[0-9]+|"$") handle_action_at (rule, yytext, *loc);
|
||||
|
||||
"$" {
|
||||
warn_at (*loc, _("stray `$'"));
|
||||
@@ -238,11 +236,11 @@ int max_left_semantic_context = 0;
|
||||
`------------------------------------------------------------------*/
|
||||
|
||||
static void
|
||||
handle_action_dollar (char *text, location dollar_loc)
|
||||
handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
|
||||
{
|
||||
const char *type_name = NULL;
|
||||
char *cp = text + 1;
|
||||
int rule_length = symbol_list_length (current_rule->next);
|
||||
int rule_length = symbol_list_length (rule->next);
|
||||
|
||||
/* Get the type name if explicit. */
|
||||
if (*cp == '<')
|
||||
@@ -257,15 +255,15 @@ handle_action_dollar (char *text, location dollar_loc)
|
||||
if (*cp == '$')
|
||||
{
|
||||
if (!type_name)
|
||||
type_name = symbol_list_n_type_name_get (current_rule, dollar_loc, 0);
|
||||
type_name = symbol_list_n_type_name_get (rule, dollar_loc, 0);
|
||||
if (!type_name && typed)
|
||||
complain_at (dollar_loc, _("$$ of `%s' has no declared type"),
|
||||
current_rule->sym->tag);
|
||||
rule->sym->tag);
|
||||
if (!type_name)
|
||||
type_name = "";
|
||||
obstack_fgrow1 (&obstack_for_string,
|
||||
"]b4_lhs_value([%s])[", type_name);
|
||||
current_rule->used = true;
|
||||
rule->used = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -279,16 +277,16 @@ handle_action_dollar (char *text, location dollar_loc)
|
||||
max_left_semantic_context = 1-n;
|
||||
if (!type_name && n > 0)
|
||||
type_name =
|
||||
symbol_list_n_type_name_get (current_rule, dollar_loc, n);
|
||||
symbol_list_n_type_name_get (rule, dollar_loc, n);
|
||||
if (!type_name && typed)
|
||||
complain_at (dollar_loc, _("$%d of `%s' has no declared type"),
|
||||
n, current_rule->sym->tag);
|
||||
n, rule->sym->tag);
|
||||
if (!type_name)
|
||||
type_name = "";
|
||||
obstack_fgrow3 (&obstack_for_string,
|
||||
"]b4_rhs_value(%d, %d, [%s])[",
|
||||
rule_length, n, type_name);
|
||||
symbol_list_n_used_set (current_rule, n, true);
|
||||
symbol_list_n_used_set (rule, n, true);
|
||||
}
|
||||
else
|
||||
complain_at (dollar_loc, _("integer out of range: %s"), quote (text));
|
||||
@@ -302,10 +300,10 @@ handle_action_dollar (char *text, location dollar_loc)
|
||||
`------------------------------------------------------*/
|
||||
|
||||
static void
|
||||
handle_action_at (char *text, location at_loc)
|
||||
handle_action_at (symbol_list *rule, char *text, location at_loc)
|
||||
{
|
||||
char *cp = text + 1;
|
||||
int rule_length = symbol_list_length (current_rule->next);
|
||||
int rule_length = symbol_list_length (rule->next);
|
||||
locations_flag = true;
|
||||
|
||||
if (*cp == '$')
|
||||
@@ -337,7 +335,7 @@ handle_action_at (char *text, location at_loc)
|
||||
INITIAL), the processing is different. */
|
||||
|
||||
static const char *
|
||||
translate_action (int sc_context, const char *a, location l)
|
||||
translate_action (int sc_context, symbol_list *rule, const char *a, location l)
|
||||
{
|
||||
const char *res;
|
||||
static bool initialized = false;
|
||||
@@ -352,29 +350,28 @@ translate_action (int sc_context, const char *a, location l)
|
||||
|
||||
loc->start = loc->end = l.start;
|
||||
yy_switch_to_buffer (yy_scan_string (a));
|
||||
res = code_lex (sc_context);
|
||||
res = code_lex (sc_context, rule);
|
||||
yy_delete_buffer (YY_CURRENT_BUFFER);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
const char *
|
||||
translate_rule_action (symbol_list *r, const char *a, location l)
|
||||
translate_rule_action (symbol_list *rule, const char *a, location l)
|
||||
{
|
||||
current_rule = r;
|
||||
return translate_action (SC_RULE_ACTION, a, l);
|
||||
return translate_action (SC_RULE_ACTION, rule, a, l);
|
||||
}
|
||||
|
||||
const char *
|
||||
translate_symbol_action (const char *a, location l)
|
||||
{
|
||||
return translate_action (SC_SYMBOL_ACTION, a, l);
|
||||
return translate_action (SC_SYMBOL_ACTION, NULL, a, l);
|
||||
}
|
||||
|
||||
const char *
|
||||
translate_code (const char *a, location l)
|
||||
{
|
||||
return translate_action (INITIAL, a, l);
|
||||
return translate_action (INITIAL, NULL, a, l);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------.
|
||||
|
||||
Reference in New Issue
Block a user