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;
ungetc (c, fin);
}
-/*-----------------------------------------------------------------.
-| Dump the wannabee comment from IN to OUT1 and OUT2 (which can be |
-| NULL). In fact we just saw a `/', which might or might not be a |
-| comment. In any case, copy what we saw. |
-| |
-| OUT2 might be NULL. |
-`-----------------------------------------------------------------*/
+
+/*------------------------------------------------------------------.
+| Dump the wannabee comment from IN to OOUT. In fact we just saw a |
+| `/', which might or might not be a comment. In any case, copy |
+| what we saw. |
+`------------------------------------------------------------------*/
static inline void
-copy_comment2 (FILE *fin, struct obstack *oout1, struct obstack *oout2)
+copy_comment (FILE *fin, struct obstack *oout)
{
int cplus_comment;
int ended;
int c;
/* We read a `/', output it. */
- obstack_1grow (oout1, '/');
- if (oout2)
- obstack_1grow (oout2, '/');
+ obstack_1grow (oout, '/');
switch ((c = getc (fin)))
{
return;
}
- obstack_1grow (oout1, c);
- if (oout2)
- obstack_1grow (oout2, c);
+ obstack_1grow (oout, c);
c = getc (fin);
ended = 0;
{
while (c == '*')
{
- obstack_1grow (oout1, c);
- if (oout2)
- obstack_1grow (oout2, c);
+ obstack_1grow (oout, c);
c = getc (fin);
}
if (c == '/')
{
- obstack_1grow (oout1, c);
- if (oout2)
- obstack_1grow (oout2, c);
+ obstack_1grow (oout, c);
ended = 1;
}
}
else if (c == '\n')
{
lineno++;
- obstack_1grow (oout1, c);
- if (oout2)
- obstack_1grow (oout2, c);
+ obstack_1grow (oout, c);
if (cplus_comment)
ended = 1;
else
fatal (_("unterminated comment"));
else
{
- obstack_1grow (oout1, c);
- if (oout2)
- obstack_1grow (oout2, c);
+ obstack_1grow (oout, c);
c = getc (fin);
}
}
}
-/*-------------------------------------------------------------------.
-| Dump the comment (actually the current string starting with a `/') |
-| from FIN to OOUT. |
-`-------------------------------------------------------------------*/
-
-static inline void
-copy_comment (FILE *fin, struct obstack *oout)
-{
- copy_comment2 (fin, oout, NULL);
-}
-
-
/*-----------------------------------------------------------------.
| FIN is pointing to a location (i.e., a `@'). Output to OOUT a |
| reference to this location. STACK_OFFSET is the number of values |
{
int c;
int count = 0;
+ bool done = FALSE;
struct obstack union_obstack;
- const char *prologue = "\
-#ifndef YYSTYPE\n\
-typedef union";
- const char *epilogue = "\
- yystype;\n\
-# define YYSTYPE yystype\n\
-#endif\n";
-
if (typed)
complain (_("multiple %s declarations"), "%union");
typed = 1;
- /* FIXME: I'm worried: are you sure attrs_obstack is properly
- filled? */
- /* I don't see any reasons to keep this line, because we should
- create a special skeleton for this option. */
- if (no_lines_flag)
- obstack_1grow (&attrs_obstack, '\n');
-
obstack_init (&union_obstack);
obstack_sgrow (&union_obstack, "union");
- if (defines_flag)
- obstack_sgrow (&defines_obstack, prologue);
-
- c = getc (finput);
- while (c != EOF)
+ while (!done)
{
+ c = xgetc (finput);
+
/* If C contains '/', it is output by copy_comment (). */
if (c != '/')
- {
- obstack_1grow (&union_obstack, c);
- if (defines_flag)
- obstack_1grow (&defines_obstack, c);
- }
+ obstack_1grow (&union_obstack, c);
switch (c)
{
break;
case '/':
- copy_comment2 (finput, &defines_obstack, &union_obstack);
+ copy_comment (finput, &union_obstack);
break;
case '{':
break;
case '}':
+ /* FIXME: Errr. How could this happen???. --akim */
if (count == 0)
complain (_("unmatched %s"), "`}'");
count--;
- if (count <= 0)
- {
- if (defines_flag)
- obstack_sgrow (&defines_obstack, epilogue);
- /* JF don't choke on trailing semi */
- c = skip_white_space ();
- if (c != ';')
- ungetc (c, finput);
- obstack_1grow (&union_obstack, 0);
- muscle_insert ("stype", obstack_finish (&union_obstack));
- return;
- }
+ if (!count)
+ done = TRUE;
+ break;
}
-
- c = getc (finput);
}
+ /* JF don't choke on trailing semi */
+ c = skip_white_space ();
+ if (c != ';')
+ ungetc (c, finput);
+ obstack_1grow (&union_obstack, 0);
+ muscle_insert ("stype", obstack_finish (&union_obstack));
+
+ if (defines_flag)
+ obstack_fgrow1 (&defines_obstack, "\
+#ifndef YYSTYPE\n\
+typedef %s
+yystype;\n\
+# define YYSTYPE yystype\n\
+#endif\n",
+ muscle_find ("stype"));
}
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);
}
}
- /* 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;
}
\f
/*-------------------------------------------------------------------.
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)