mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-19 09:13:04 +00:00
Use the new code_props interface for rule actions.
* src/symlist.h (symbol_list): Replace action, action_location, and used members with a code_props action_props member. * src/reader.c (symbol_should_be_used, grammar_rule_check, grammar_midrule_action, grammar_current_rule_merge_set, grammar_current_rule_symbol_append, packgram): Update. * src/scan-code.h (translate_rule_action): Remove, no longer used. * src/scan-code.l (handle_action_dollar): Update. (translate_rule_action): Remove, no longer used. * src/symlist.c (symbol_list_sym_new, symbol_list_syms_print): Update.
This commit is contained in:
13
ChangeLog
13
ChangeLog
@@ -1,3 +1,16 @@
|
|||||||
|
2007-01-03 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||||
|
|
||||||
|
Use the new code_props interface for rule actions.
|
||||||
|
* src/symlist.h (symbol_list): Replace action, action_location, and
|
||||||
|
used members with a code_props action_props member.
|
||||||
|
* src/reader.c (symbol_should_be_used, grammar_rule_check,
|
||||||
|
grammar_midrule_action, grammar_current_rule_merge_set,
|
||||||
|
grammar_current_rule_symbol_append, packgram): Update.
|
||||||
|
* src/scan-code.h (translate_rule_action): Remove, no longer used.
|
||||||
|
* src/scan-code.l (handle_action_dollar): Update.
|
||||||
|
(translate_rule_action): Remove, no longer used.
|
||||||
|
* src/symlist.c (symbol_list_sym_new, symbol_list_syms_print): Update.
|
||||||
|
|
||||||
2007-01-02 Joel E. Denny <jdenny@ces.clemson.edu>
|
2007-01-02 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||||
|
|
||||||
Use the new code_props interface in parse-gram.y.
|
Use the new code_props interface in parse-gram.y.
|
||||||
|
|||||||
48
src/reader.c
48
src/reader.c
@@ -1,7 +1,7 @@
|
|||||||
/* Input parser for Bison
|
/* Input parser for Bison
|
||||||
|
|
||||||
Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
|
Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
|
||||||
2005, 2006 Free Software Foundation, Inc.
|
2005, 2006, 2007 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -256,10 +256,11 @@ symbol_should_be_used (symbol_list const *s)
|
|||||||
if (symbol_destructor_get (s->content.sym))
|
if (symbol_destructor_get (s->content.sym))
|
||||||
return true;
|
return true;
|
||||||
if (warnings_flag & warnings_midrule_values)
|
if (warnings_flag & warnings_midrule_values)
|
||||||
return ((s->midrule && s->midrule->used)
|
return ((s->midrule && s->midrule->action_props.is_value_used)
|
||||||
|| (s->midrule_parent_rule
|
|| (s->midrule_parent_rule
|
||||||
&& symbol_list_n_get (s->midrule_parent_rule,
|
&& symbol_list_n_get (s->midrule_parent_rule,
|
||||||
s->midrule_parent_rhs_index)->used));
|
s->midrule_parent_rhs_index)
|
||||||
|
->action_props.is_value_used));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,7 +279,7 @@ grammar_rule_check (const symbol_list *r)
|
|||||||
|
|
||||||
Don't worry about the default action if $$ is untyped, since $$'s
|
Don't worry about the default action if $$ is untyped, since $$'s
|
||||||
value can't be used. */
|
value can't be used. */
|
||||||
if (!r->action && r->content.sym->type_name)
|
if (!r->action_props.code && r->content.sym->type_name)
|
||||||
{
|
{
|
||||||
symbol *first_rhs = r->next->content.sym;
|
symbol *first_rhs = r->next->content.sym;
|
||||||
/* If $$ is being set in default way, report if any type mismatch. */
|
/* If $$ is being set in default way, report if any type mismatch. */
|
||||||
@@ -303,10 +304,10 @@ grammar_rule_check (const symbol_list *r)
|
|||||||
symbol_list const *l = r;
|
symbol_list const *l = r;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for (; l && l->content.sym; l = l->next, ++n)
|
for (; l && l->content.sym; l = l->next, ++n)
|
||||||
if (! (l->used
|
if (! (l->action_props.is_value_used
|
||||||
|| !symbol_should_be_used (l)
|
|| !symbol_should_be_used (l)
|
||||||
/* The default action, $$ = $1, `uses' both. */
|
/* The default action, $$ = $1, `uses' both. */
|
||||||
|| (!r->action && (n == 0 || n == 1))))
|
|| (!r->action_props.code && (n == 0 || n == 1))))
|
||||||
{
|
{
|
||||||
if (n)
|
if (n)
|
||||||
warn_at (r->location, _("unused value: $%d"), n);
|
warn_at (r->location, _("unused value: $%d"), n);
|
||||||
@@ -346,7 +347,7 @@ grammar_midrule_action (void)
|
|||||||
|
|
||||||
/* Make a DUMMY nonterminal, whose location is that of the midrule
|
/* Make a DUMMY nonterminal, whose location is that of the midrule
|
||||||
action. Create the MIDRULE. */
|
action. Create the MIDRULE. */
|
||||||
location dummy_location = current_rule->action_location;
|
location dummy_location = current_rule->action_props.location;
|
||||||
symbol *dummy = dummy_symbol_get (dummy_location);
|
symbol *dummy = dummy_symbol_get (dummy_location);
|
||||||
symbol_list *midrule = symbol_list_sym_new (dummy, dummy_location);
|
symbol_list *midrule = symbol_list_sym_new (dummy, dummy_location);
|
||||||
|
|
||||||
@@ -356,12 +357,11 @@ grammar_midrule_action (void)
|
|||||||
++nritems;
|
++nritems;
|
||||||
/* Attach its location and actions to that of the DUMMY. */
|
/* Attach its location and actions to that of the DUMMY. */
|
||||||
midrule->location = dummy_location;
|
midrule->location = dummy_location;
|
||||||
midrule->action = current_rule->action;
|
code_props_rule_action_init (&midrule->action_props,
|
||||||
midrule->action_location = dummy_location;
|
current_rule->action_props.code,
|
||||||
current_rule->action = NULL;
|
current_rule->action_props.location,
|
||||||
/* The action has not been translated yet, so $$ use hasn't been
|
midrule);
|
||||||
detected yet. */
|
code_props_none_init (¤t_rule->action_props);
|
||||||
midrule->used = false;
|
|
||||||
|
|
||||||
if (previous_rule_end)
|
if (previous_rule_end)
|
||||||
previous_rule_end->next = midrule;
|
previous_rule_end->next = midrule;
|
||||||
@@ -427,7 +427,7 @@ grammar_current_rule_merge_set (uniqstr name, location loc)
|
|||||||
void
|
void
|
||||||
grammar_current_rule_symbol_append (symbol *sym, location loc)
|
grammar_current_rule_symbol_append (symbol *sym, location loc)
|
||||||
{
|
{
|
||||||
if (current_rule->action)
|
if (current_rule->action_props.code)
|
||||||
grammar_midrule_action ();
|
grammar_midrule_action ();
|
||||||
grammar_symbol_append (sym, loc);
|
grammar_symbol_append (sym, loc);
|
||||||
}
|
}
|
||||||
@@ -437,12 +437,12 @@ grammar_current_rule_symbol_append (symbol *sym, location loc)
|
|||||||
void
|
void
|
||||||
grammar_current_rule_action_append (const char *action, location loc)
|
grammar_current_rule_action_append (const char *action, location loc)
|
||||||
{
|
{
|
||||||
if (current_rule->action)
|
if (current_rule->action_props.code)
|
||||||
grammar_midrule_action ();
|
grammar_midrule_action ();
|
||||||
/* After all symbol declarations have been parsed, packgram invokes
|
/* After all symbol declarations have been parsed, packgram invokes
|
||||||
translate_rule_action. */
|
code_props_translate_code. */
|
||||||
current_rule->action = action;
|
code_props_rule_action_init (¤t_rule->action_props, action, loc,
|
||||||
current_rule->action_location = loc;
|
current_rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -473,8 +473,7 @@ packgram (void)
|
|||||||
`$' from any midrule symbol name. */
|
`$' from any midrule symbol name. */
|
||||||
while (p)
|
while (p)
|
||||||
{
|
{
|
||||||
if (p->action)
|
code_props_translate_code (&p->action_props);
|
||||||
p->action = translate_rule_action (p);
|
|
||||||
if (p)
|
if (p)
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
@@ -496,16 +495,17 @@ packgram (void)
|
|||||||
rules[ruleno].precsym = NULL;
|
rules[ruleno].precsym = NULL;
|
||||||
rules[ruleno].location = p->location;
|
rules[ruleno].location = p->location;
|
||||||
rules[ruleno].useful = true;
|
rules[ruleno].useful = true;
|
||||||
rules[ruleno].action = p->action;
|
rules[ruleno].action = p->action_props.code;
|
||||||
rules[ruleno].action_location = p->action_location;
|
rules[ruleno].action_location = p->action_props.location;
|
||||||
|
|
||||||
/* If the midrule's $$ is set or its $n is used, remove the `$' from the
|
/* If the midrule's $$ is set or its $n is used, remove the `$' from the
|
||||||
symbol name so that it's a user-defined symbol so that the default
|
symbol name so that it's a user-defined symbol so that the default
|
||||||
%destructor and %printer apply. */
|
%destructor and %printer apply. */
|
||||||
if (p->midrule_parent_rule
|
if (p->midrule_parent_rule
|
||||||
&& (p->used
|
&& (p->action_props.is_value_used
|
||||||
|| symbol_list_n_get (p->midrule_parent_rule,
|
|| symbol_list_n_get (p->midrule_parent_rule,
|
||||||
p->midrule_parent_rhs_index)->used))
|
p->midrule_parent_rhs_index)
|
||||||
|
->action_props.is_value_used))
|
||||||
p->content.sym->tag += 1;
|
p->content.sym->tag += 1;
|
||||||
|
|
||||||
/* Don't check the generated rule 0. It has no action, so some rhs
|
/* Don't check the generated rule 0. It has no action, so some rhs
|
||||||
|
|||||||
@@ -163,13 +163,9 @@ void code_scanner_last_string_free (void);
|
|||||||
* - None.
|
* - None.
|
||||||
* \post
|
* \post
|
||||||
* - All dynamic memory allocated during invocations of
|
* - All dynamic memory allocated during invocations of
|
||||||
* \c code_props_translate_code or \c translate_rule_action (if any) has
|
* \c code_props_translate_code (if any) has been freed. All \c code_props
|
||||||
* been freed. All \c code_props instances may now be invalid.
|
* instances may now be invalid.
|
||||||
*/
|
*/
|
||||||
void code_scanner_free (void);
|
void code_scanner_free (void);
|
||||||
|
|
||||||
/* The action of the rule R contains $$, $1 etc. referring to the values
|
|
||||||
of the rule R. */
|
|
||||||
char const *translate_rule_action (struct symbol_list *r);
|
|
||||||
|
|
||||||
#endif /* !SCAN_CODE_H_ */
|
#endif /* !SCAN_CODE_H_ */
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
|
|||||||
|
|
||||||
obstack_fgrow1 (&obstack_for_string,
|
obstack_fgrow1 (&obstack_for_string,
|
||||||
"]b4_lhs_value([%s])[", type_name);
|
"]b4_lhs_value([%s])[", type_name);
|
||||||
rule->used = true;
|
rule->action_props.is_value_used = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -333,7 +333,8 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
|
|||||||
"]b4_rhs_value(%d, %d, [%s])[",
|
"]b4_rhs_value(%d, %d, [%s])[",
|
||||||
effective_rule_length, n, type_name);
|
effective_rule_length, n, type_name);
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
symbol_list_n_get (effective_rule, n)->used = true;
|
symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
|
||||||
|
true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
complain_at (dollar_loc, _("integer out of range: %s"), quote (text));
|
complain_at (dollar_loc, _("integer out of range: %s"), quote (text));
|
||||||
@@ -479,12 +480,3 @@ code_scanner_free (void)
|
|||||||
/* Reclaim Flex's buffers. */
|
/* Reclaim Flex's buffers. */
|
||||||
yylex_destroy ();
|
yylex_destroy ();
|
||||||
}
|
}
|
||||||
|
|
||||||
char const *
|
|
||||||
translate_rule_action (symbol_list *rule)
|
|
||||||
{
|
|
||||||
code_props cp;
|
|
||||||
code_props_rule_action_init (&cp, rule->action, rule->action_location, rule);
|
|
||||||
code_props_translate_code (&cp);
|
|
||||||
return cp.code;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -43,8 +43,7 @@ symbol_list_sym_new (symbol *sym, location loc)
|
|||||||
res->midrule_parent_rule = NULL;
|
res->midrule_parent_rule = NULL;
|
||||||
res->midrule_parent_rhs_index = 0;
|
res->midrule_parent_rhs_index = 0;
|
||||||
|
|
||||||
res->action = NULL;
|
code_props_none_init (&res->action_props);
|
||||||
res->used = false;
|
|
||||||
|
|
||||||
res->ruleprec = NULL;
|
res->ruleprec = NULL;
|
||||||
res->dprec = 0;
|
res->dprec = 0;
|
||||||
@@ -118,7 +117,7 @@ symbol_list_syms_print (const symbol_list *l, FILE *f)
|
|||||||
for (/* Nothing. */; l && l->content.sym; l = l->next)
|
for (/* Nothing. */; l && l->content.sym; l = l->next)
|
||||||
{
|
{
|
||||||
symbol_print (l->content.sym, f);
|
symbol_print (l->content.sym, f);
|
||||||
fprintf (stderr, l->used ? " used" : " unused");
|
fprintf (stderr, l->action_props.is_value_used ? " used" : " unused");
|
||||||
if (l && l->content.sym)
|
if (l && l->content.sym)
|
||||||
fprintf (f, ", ");
|
fprintf (f, ", ");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,12 +61,9 @@ typedef struct symbol_list
|
|||||||
struct symbol_list *midrule_parent_rule;
|
struct symbol_list *midrule_parent_rule;
|
||||||
int midrule_parent_rhs_index;
|
int midrule_parent_rhs_index;
|
||||||
|
|
||||||
/* The action is attached to the LHS of a rule. */
|
/* The action is attached to the LHS of a rule, but action properties for
|
||||||
const char *action;
|
* each RHS are also stored here. */
|
||||||
location action_location;
|
code_props action_props;
|
||||||
|
|
||||||
/* Whether this symbol's value is used in the current action. */
|
|
||||||
bool used;
|
|
||||||
|
|
||||||
/* Precedence/associativity. */
|
/* Precedence/associativity. */
|
||||||
symbol *ruleprec;
|
symbol *ruleprec;
|
||||||
|
|||||||
Reference in New Issue
Block a user