From: Joel E. Denny Date: Thu, 4 Jan 2007 03:21:08 +0000 (+0000) Subject: Use the new code_props interface for rule actions. X-Git-Tag: v2.3b~198 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/f6857bbf8c40df05d7c7324cf41ced6d1961ca89 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. --- diff --git a/ChangeLog b/ChangeLog index 71427307..a358368c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2007-01-03 Joel E. Denny + + 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 Use the new code_props interface in parse-gram.y. diff --git a/src/reader.c b/src/reader.c index 7b769232..4bbed58f 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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 (¤t_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 (¤t_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 diff --git a/src/scan-code.h b/src/scan-code.h index c5f14fd5..955aef1f 100644 --- a/src/scan-code.h +++ b/src/scan-code.h @@ -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_ */ diff --git a/src/scan-code.l b/src/scan-code.l index bf46e2da..b54f4c9a 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -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; -} diff --git a/src/symlist.c b/src/symlist.c index 71a8642d..c5c26272 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -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, ", "); } diff --git a/src/symlist.h b/src/symlist.h index 6c2fd613..ab9a4b5e 100644 --- a/src/symlist.h +++ b/src/symlist.h @@ -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;