[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
FYI: Actions and Rules
From: |
Akim Demaille |
Subject: |
FYI: Actions and Rules |
Date: |
15 Dec 2001 15:08:32 +0100 |
User-agent: |
Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Civil Service) |
Index: ChangeLog
from Akim Demaille <address@hidden>
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/.
Index: src/bison.simple
===================================================================
RCS file: /cvsroot/bison/bison/src/bison.simple,v
retrieving revision 1.88
diff -u -u -r1.88 bison.simple
--- src/bison.simple 14 Dec 2001 01:52:50 -0000 1.88
+++ src/bison.simple 15 Dec 2001 14:13:44 -0000
@@ -891,7 +891,7 @@
#endif
switch (yyn)
{
- %%action
+%%actions
}
#line %%line "%%skeleton"
Index: src/gram.h
===================================================================
RCS file: /cvsroot/bison/bison/src/gram.h,v
retrieving revision 1.13
diff -u -u -r1.13 gram.h
--- src/gram.h 5 Dec 2001 09:29:02 -0000 1.13
+++ src/gram.h 15 Dec 2001 14:13:44 -0000
@@ -122,6 +122,8 @@
short assoc;
short line;
bool useful;
+ const char *action;
+ short action_line;
} rule_t;
extern struct rule_s *rule_table;
Index: src/output.c
===================================================================
RCS file: /cvsroot/bison/bison/src/output.c,v
retrieving revision 1.88
diff -u -u -r1.88 output.c
--- src/output.c 14 Dec 2001 15:39:05 -0000 1.88
+++ src/output.c 15 Dec 2001 14:13:44 -0000
@@ -285,8 +285,6 @@
0, 1, nrules + 1);
muscle_insert ("r2", obstack_finish (&output_obstack));
XFREE (short_tab);
-
- XFREE (rule_table + 1);
}
/*------------------------------------------------------------------.
@@ -512,6 +510,34 @@
}
+/*-----------------------------.
+| 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
save_column (int symbol, int default_state)
{
@@ -931,10 +957,12 @@
/* Output the right value, or see if it's something special. */
muscle_key = obstack_finish (&muscle_obstack);
muscle_value = muscle_find (muscle_key);
- if (muscle_value)
- obstack_sgrow (oout, muscle_value);
+ if (!strcmp (muscle_key, "actions"))
+ actions_output (oout);
else if (!strcmp (muscle_key, "line"))
obstack_fgrow1 (oout, "%d", line + 1);
+ else if (muscle_value)
+ obstack_sgrow (oout, muscle_value);
else
{
obstack_sgrow (oout, "%%");
@@ -1011,11 +1039,6 @@
MUSCLE_INSERT_INT ("ntokens", ntokens);
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_master_parser ();
+ free (rule_table + 1);
obstack_free (&muscle_obstack, 0);
obstack_free (&output_obstack, 0);
obstack_free (&action_obstack, 0);
Index: src/reader.c
===================================================================
RCS file: /cvsroot/bison/bison/src/reader.c,v
retrieving revision 1.118
diff -u -u -r1.118 reader.c
--- src/reader.c 15 Dec 2001 11:09:05 -0000 1.118
+++ src/reader.c 15 Dec 2001 14:13:44 -0000
@@ -41,6 +41,9 @@
struct symbol_list *next;
bucket *sym;
int line;
+ /* The action is attached to the LHS of a rule. */
+ const char *action;
+ int action_line;
bucket *ruleprec;
}
symbol_list;
@@ -1131,16 +1134,6 @@
if (semantic_parser)
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;
c = getc (finput);
@@ -1198,13 +1191,9 @@
}
}
- /* 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. */
- if (yacc_flag)
- obstack_sgrow (&action_obstack, "}\n break;");
- else
- obstack_sgrow (&action_obstack, ";\n break;}");
+ obstack_1grow (&action_obstack, '\0');
+ rule->action = obstack_finish (&action_obstack);
+ rule->action_line = lineno;
}
/*-------------------------------------------------------------------.
@@ -1879,6 +1868,8 @@
rule_table[ruleno].rhs = itemno;
rule_table[ruleno].line = p->line;
rule_table[ruleno].useful = TRUE;
+ rule_table[ruleno].action = p->action;
+ rule_table[ruleno].action_line = p->action_line;
p = p->next;
while (p && p->sym)
Index: src/symtab.h
===================================================================
RCS file: /cvsroot/bison/bison/src/symtab.h,v
retrieving revision 1.15
diff -u -u -r1.15 symtab.h
--- src/symtab.h 23 Nov 2001 14:13:02 -0000 1.15
+++ src/symtab.h 15 Dec 2001 14:13:44 -0000
@@ -50,13 +50,13 @@
short prec;
associativity assoc;
short user_token_number;
+
/* Points to the other in the identifier-symbol pair for an
alias. Special value SALIAS in the identifier half of the
identifier-symbol pair for an alias. */
struct bucket *alias;
symbol_class class;
-}
-bucket;
+} bucket;
extern bucket *firstsymbol;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- FYI: Actions and Rules,
Akim Demaille <=