Attach actions to rules, instead of pre-outputting them to

actions_obstack.
* src/gram.h (rule_t): action and action_line are new members.
* src/reader.c (symbol_list): Likewise.
(copy_action): Save the actions within the rule.
(packgram): Save them in rule_table.
* src/output.c (actions_output): New.
(output_parser): Use it on `%%actions'.
(output_rule_data): Don't free rule_table.
(output): Do it.
(prepare): Don't save the `action' muscle.
* src/bison.simple: s/%%action/%%actions/.
This commit is contained in:
Akim Demaille
2001-12-15 14:14:30 +00:00
parent 51576fb3c6
commit 3f96f4dc41
6 changed files with 62 additions and 29 deletions

View File

@@ -1,3 +1,19 @@
2001-12-15 Akim Demaille <akim@epita.fr>
Attach actions to rules, instead of pre-outputting them to
actions_obstack.
* src/gram.h (rule_t): action and action_line are new members.
* src/reader.c (symbol_list): Likewise.
(copy_action): Save the actions within the rule.
(packgram): Save them in rule_table.
* src/output.c (actions_output): New.
(output_parser): Use it on `%%actions'.
(output_rule_data): Don't free rule_table.
(output): Do it.
(prepare): Don't save the `action' muscle.
* src/bison.simple: s/%%action/%%actions/.
2001-12-15 Akim Demaille <akim@epita.fr> 2001-12-15 Akim Demaille <akim@epita.fr>
* src/reader.c (copy_action): When --yacc, don't append a `;' * src/reader.c (copy_action): When --yacc, don't append a `;'

View File

@@ -891,7 +891,7 @@ yyreduce:
#endif #endif
switch (yyn) switch (yyn)
{ {
%%action %%actions
} }
#line %%line "%%skeleton" #line %%line "%%skeleton"

View File

@@ -122,6 +122,8 @@ typedef struct rule_s
short assoc; short assoc;
short line; short line;
bool useful; bool useful;
const char *action;
short action_line;
} rule_t; } rule_t;
extern struct rule_s *rule_table; extern struct rule_s *rule_table;

View File

@@ -285,8 +285,6 @@ output_rule_data (void)
0, 1, nrules + 1); 0, 1, nrules + 1);
muscle_insert ("r2", obstack_finish (&output_obstack)); muscle_insert ("r2", obstack_finish (&output_obstack));
XFREE (short_tab); XFREE (short_tab);
XFREE (rule_table + 1);
} }
/*------------------------------------------------------------------. /*------------------------------------------------------------------.
@@ -512,6 +510,34 @@ token_actions (void)
} }
/*-----------------------------.
| Output the actions to OOUT. |
`-----------------------------*/
static void
actions_output (struct obstack *oout)
{
int rule;
for (rule = 1; rule < nrules + 1; ++rule)
if (rule_table[rule].action)
{
obstack_fgrow1 (oout, " case %d:\n", rule);
if (!no_lines_flag)
obstack_fgrow2 (oout, muscle_find ("linef"),
rule_table[rule].action_line,
quotearg_style (c_quoting_style,
muscle_find ("filename")));
obstack_1grow (oout, '{');
obstack_sgrow (oout, rule_table[rule].action);
/* As a Bison extension, add the ending semicolon. Since some
Yacc don't do that, help people using bison as a Yacc
finding their missing semicolons. */
obstack_fgrow1 (oout, "%s}\n break;\n\n", yacc_flag ? ";" : "");
}
}
static void static void
save_column (int symbol, int default_state) save_column (int symbol, int default_state)
{ {
@@ -931,10 +957,12 @@ output_parser (const char *skel_filename, struct obstack *oout)
/* Output the right value, or see if it's something special. */ /* Output the right value, or see if it's something special. */
muscle_key = obstack_finish (&muscle_obstack); muscle_key = obstack_finish (&muscle_obstack);
muscle_value = muscle_find (muscle_key); muscle_value = muscle_find (muscle_key);
if (muscle_value) if (!strcmp (muscle_key, "actions"))
obstack_sgrow (oout, muscle_value); actions_output (oout);
else if (!strcmp (muscle_key, "line")) else if (!strcmp (muscle_key, "line"))
obstack_fgrow1 (oout, "%d", line + 1); obstack_fgrow1 (oout, "%d", line + 1);
else if (muscle_value)
obstack_sgrow (oout, muscle_value);
else else
{ {
obstack_sgrow (oout, "%%"); obstack_sgrow (oout, "%%");
@@ -1011,11 +1039,6 @@ prepare (void)
MUSCLE_INSERT_INT ("ntokens", ntokens); MUSCLE_INSERT_INT ("ntokens", ntokens);
MUSCLE_INSERT_INT ("locations-flag", locations_flag); MUSCLE_INSERT_INT ("locations-flag", locations_flag);
/* We need to save the actions in the muscle %%action. */
obstack_1grow (&action_obstack, 0);
muscle_insert ("action", obstack_finish (&action_obstack));
} }
/*----------------------------------------------------------. /*----------------------------------------------------------.
@@ -1044,6 +1067,7 @@ output (void)
output_master_parser (); output_master_parser ();
free (rule_table + 1);
obstack_free (&muscle_obstack, 0); obstack_free (&muscle_obstack, 0);
obstack_free (&output_obstack, 0); obstack_free (&output_obstack, 0);
obstack_free (&action_obstack, 0); obstack_free (&action_obstack, 0);

View File

@@ -41,6 +41,9 @@ typedef struct symbol_list
struct symbol_list *next; struct symbol_list *next;
bucket *sym; bucket *sym;
int line; int line;
/* The action is attached to the LHS of a rule. */
const char *action;
int action_line;
bucket *ruleprec; bucket *ruleprec;
} }
symbol_list; symbol_list;
@@ -1131,16 +1134,6 @@ copy_action (symbol_list *rule, int stack_offset)
if (semantic_parser) if (semantic_parser)
stack_offset = 0; stack_offset = 0;
obstack_fgrow1 (&action_obstack, "\ncase %d:\n", nrules);
if (!no_lines_flag)
{
obstack_fgrow2 (&action_obstack, muscle_find ("linef"),
lineno, quotearg_style (c_quoting_style,
muscle_find ("filename")));
}
obstack_1grow (&action_obstack, '{');
count = 1; count = 1;
c = getc (finput); c = getc (finput);
@@ -1198,13 +1191,9 @@ copy_action (symbol_list *rule, int stack_offset)
} }
} }
/* As a Bison extension, add the ending semicolon. Since some Yacc obstack_1grow (&action_obstack, '\0');
don't do that, help people using bison as a Yacc finding their rule->action = obstack_finish (&action_obstack);
missing semicolons. */ rule->action_line = lineno;
if (yacc_flag)
obstack_sgrow (&action_obstack, "}\n break;");
else
obstack_sgrow (&action_obstack, ";\n break;}");
} }
/*-------------------------------------------------------------------. /*-------------------------------------------------------------------.
@@ -1879,6 +1868,8 @@ packgram (void)
rule_table[ruleno].rhs = itemno; rule_table[ruleno].rhs = itemno;
rule_table[ruleno].line = p->line; rule_table[ruleno].line = p->line;
rule_table[ruleno].useful = TRUE; rule_table[ruleno].useful = TRUE;
rule_table[ruleno].action = p->action;
rule_table[ruleno].action_line = p->action_line;
p = p->next; p = p->next;
while (p && p->sym) while (p && p->sym)

View File

@@ -50,13 +50,13 @@ typedef struct bucket
short prec; short prec;
associativity assoc; associativity assoc;
short user_token_number; short user_token_number;
/* Points to the other in the identifier-symbol pair for an /* Points to the other in the identifier-symbol pair for an
alias. Special value SALIAS in the identifier half of the alias. Special value SALIAS in the identifier half of the
identifier-symbol pair for an alias. */ identifier-symbol pair for an alias. */
struct bucket *alias; struct bucket *alias;
symbol_class class; symbol_class class;
} } bucket;
bucket;
extern bucket *firstsymbol; extern bucket *firstsymbol;