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:
Joel E. Denny
2007-01-04 03:21:08 +00:00
parent 7c0c61812d
commit f6857bbf8c
6 changed files with 47 additions and 50 deletions

View File

@@ -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.

View File

@@ -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 (&current_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 (&current_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

View File

@@ -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_ */

View File

@@ -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;
}

View File

@@ -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, ", ");
} }

View File

@@ -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;