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>
Use the new code_props interface in parse-gram.y.

View File

@@ -1,7 +1,7 @@
/* Input parser for Bison
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.
@@ -256,10 +256,11 @@ symbol_should_be_used (symbol_list const *s)
if (symbol_destructor_get (s->content.sym))
return true;
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
&& 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;
}
@@ -278,7 +279,7 @@ grammar_rule_check (const symbol_list *r)
Don't worry about the default action if $$ is untyped, since $$'s
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;
/* 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;
int n = 0;
for (; l && l->content.sym; l = l->next, ++n)
if (! (l->used
if (! (l->action_props.is_value_used
|| !symbol_should_be_used (l)
/* The default action, $$ = $1, `uses' both. */
|| (!r->action && (n == 0 || n == 1))))
|| (!r->action_props.code && (n == 0 || n == 1))))
{
if (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
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_list *midrule = symbol_list_sym_new (dummy, dummy_location);
@@ -356,12 +357,11 @@ grammar_midrule_action (void)
++nritems;
/* Attach its location and actions to that of the DUMMY. */
midrule->location = dummy_location;
midrule->action = current_rule->action;
midrule->action_location = dummy_location;
current_rule->action = NULL;
/* The action has not been translated yet, so $$ use hasn't been
detected yet. */
midrule->used = false;
code_props_rule_action_init (&midrule->action_props,
current_rule->action_props.code,
current_rule->action_props.location,
midrule);
code_props_none_init (&current_rule->action_props);
if (previous_rule_end)
previous_rule_end->next = midrule;
@@ -427,7 +427,7 @@ grammar_current_rule_merge_set (uniqstr name, location loc)
void
grammar_current_rule_symbol_append (symbol *sym, location loc)
{
if (current_rule->action)
if (current_rule->action_props.code)
grammar_midrule_action ();
grammar_symbol_append (sym, loc);
}
@@ -437,12 +437,12 @@ grammar_current_rule_symbol_append (symbol *sym, location loc)
void
grammar_current_rule_action_append (const char *action, location loc)
{
if (current_rule->action)
if (current_rule->action_props.code)
grammar_midrule_action ();
/* After all symbol declarations have been parsed, packgram invokes
translate_rule_action. */
current_rule->action = action;
current_rule->action_location = loc;
code_props_translate_code. */
code_props_rule_action_init (&current_rule->action_props, action, loc,
current_rule);
}
@@ -473,8 +473,7 @@ packgram (void)
`$' from any midrule symbol name. */
while (p)
{
if (p->action)
p->action = translate_rule_action (p);
code_props_translate_code (&p->action_props);
if (p)
p = p->next;
}
@@ -496,16 +495,17 @@ packgram (void)
rules[ruleno].precsym = NULL;
rules[ruleno].location = p->location;
rules[ruleno].useful = true;
rules[ruleno].action = p->action;
rules[ruleno].action_location = p->action_location;
rules[ruleno].action = p->action_props.code;
rules[ruleno].action_location = p->action_props.location;
/* 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
%destructor and %printer apply. */
if (p->midrule_parent_rule
&& (p->used
&& (p->action_props.is_value_used
|| 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;
/* 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.
* \post
* - All dynamic memory allocated during invocations of
* \c code_props_translate_code or \c translate_rule_action (if any) has
* been freed. All \c code_props instances may now be invalid.
* \c code_props_translate_code (if any) has been freed. All \c code_props
* instances may now be invalid.
*/
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_ */

View File

@@ -304,7 +304,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
obstack_fgrow1 (&obstack_for_string,
"]b4_lhs_value([%s])[", type_name);
rule->used = true;
rule->action_props.is_value_used = true;
}
else
{
@@ -333,7 +333,8 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
"]b4_rhs_value(%d, %d, [%s])[",
effective_rule_length, n, type_name);
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
complain_at (dollar_loc, _("integer out of range: %s"), quote (text));
@@ -479,12 +480,3 @@ code_scanner_free (void)
/* Reclaim Flex's buffers. */
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_rhs_index = 0;
res->action = NULL;
res->used = false;
code_props_none_init (&res->action_props);
res->ruleprec = NULL;
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)
{
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)
fprintf (f, ", ");
}

View File

@@ -61,12 +61,9 @@ typedef struct symbol_list
struct symbol_list *midrule_parent_rule;
int midrule_parent_rhs_index;
/* The action is attached to the LHS of a rule. */
const char *action;
location action_location;
/* Whether this symbol's value is used in the current action. */
bool used;
/* The action is attached to the LHS of a rule, but action properties for
* each RHS are also stored here. */
code_props action_props;
/* Precedence/associativity. */
symbol *ruleprec;