X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/51576fb3c661cec97bb58e503351e7ad75053f6d..709ae8c6ee619a2bf89a26ddd7575bdeb5d1896f:/src/reader.c diff --git a/src/reader.c b/src/reader.c index cfcab068..f1577b48 100644 --- a/src/reader.c +++ b/src/reader.c @@ -21,7 +21,6 @@ #include "system.h" -#include "obstack.h" #include "quotearg.h" #include "quote.h" #include "getargs.h" @@ -41,6 +40,9 @@ typedef struct symbol_list 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; @@ -230,25 +232,22 @@ copy_identifier (FILE *fin, struct obstack *oout) 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))) { @@ -263,9 +262,7 @@ copy_comment2 (FILE *fin, struct obstack *oout1, struct obstack *oout2) return; } - obstack_1grow (oout1, c); - if (oout2) - obstack_1grow (oout2, c); + obstack_1grow (oout, c); c = getc (fin); ended = 0; @@ -275,26 +272,20 @@ copy_comment2 (FILE *fin, struct obstack *oout1, struct obstack *oout2) { 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 @@ -304,27 +295,13 @@ copy_comment2 (FILE *fin, struct obstack *oout1, struct obstack *oout2) 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 | @@ -750,43 +727,23 @@ parse_union_decl (void) { 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) { @@ -795,7 +752,7 @@ typedef union"; break; case '/': - copy_comment2 (finput, &defines_obstack, &union_obstack); + copy_comment (finput, &union_obstack); break; case '{': @@ -803,26 +760,22 @@ typedef union"; 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)); } @@ -1131,16 +1084,6 @@ copy_action (symbol_list *rule, int stack_offset) 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 +1141,9 @@ copy_action (symbol_list *rule, int stack_offset) } } - /* 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; } /*-------------------------------------------------------------------. @@ -1618,55 +1557,6 @@ read_additionnal_code (void) } -/*--------------------------------------------------------------. -| For named tokens, but not literal ones, define the name. The | -| value is the user token number. | -`--------------------------------------------------------------*/ - -static void -output_token_defines (struct obstack *oout) -{ - bucket *bp; - char *cp, *symbol; - char c; - - for (bp = firstsymbol; bp; bp = bp->next) - { - symbol = bp->tag; /* get symbol */ - - if (bp->value >= ntokens) - continue; - if (bp->user_token_number == SALIAS) - continue; - if ('\'' == *symbol) - continue; /* skip literal character */ - if (bp == errtoken) - continue; /* skip error token */ - if ('\"' == *symbol) - { - /* use literal string only if given a symbol with an alias */ - if (bp->alias) - symbol = bp->alias->tag; - else - continue; - } - - /* Don't #define nonliteral tokens whose names contain periods. */ - cp = symbol; - while ((c = *cp++) && c != '.'); - if (c != '\0') - continue; - - obstack_fgrow2 (oout, "# define\t%s\t%d\n", - symbol, bp->user_token_number); - if (semantic_parser) - /* FIXME: This is certainly dead wrong, and should be just as - above. --akim. */ - obstack_fgrow2 (oout, "# define\tT%s\t%d\n", symbol, bp->value); - } -} - - /*------------------------------------------------------------------. | Set TOKEN_TRANSLATIONS. Check that no two symbols share the same | | number. | @@ -1808,48 +1698,57 @@ packsymbols (void) } -/*-----------------------------------. -| Output definition of token names. | -`-----------------------------------*/ +/*---------------------------------------------------------------. +| Save the definition of token names in the `TOKENDEFS' muscle. | +`---------------------------------------------------------------*/ static void -symbols_output (void) +symbols_save (void) { - { - struct obstack tokendefs; - obstack_init (&tokendefs); - output_token_defines (&tokendefs); - obstack_1grow (&tokendefs, 0); - muscle_insert ("tokendef", xstrdup (obstack_finish (&tokendefs))); - obstack_free (&tokendefs, NULL); - } - - if (defines_flag) + struct obstack tokendefs; + bucket *bp; + char *cp, *symbol; + char c; + obstack_init (&tokendefs); + + for (bp = firstsymbol; bp; bp = bp->next) { - output_token_defines (&defines_obstack); + symbol = bp->tag; /* get symbol */ - if (!pure_parser) - obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n", - spec_name_prefix); - if (semantic_parser) + if (bp->value >= ntokens) + continue; + if (bp->user_token_number == SALIAS) + continue; + if ('\'' == *symbol) + continue; /* skip literal character */ + if (bp == errtoken) + continue; /* skip error token */ + if ('\"' == *symbol) { - int i; - - for (i = ntokens; i < nsyms; i++) - { - /* don't make these for dummy nonterminals made by gensym. */ - if (*tags[i] != '@') - obstack_fgrow2 (&defines_obstack, - "# define\tNT%s\t%d\n", tags[i], i); - } -#if 0 - /* `fdefines' is now a temporary file, so we need to copy its - contents in `done', so we can't close it here. */ - fclose (fdefines); - fdefines = NULL; -#endif + /* use literal string only if given a symbol with an alias */ + if (bp->alias) + symbol = bp->alias->tag; + else + continue; } + + /* Don't #define nonliteral tokens whose names contain periods. */ + cp = symbol; + while ((c = *cp++) && c != '.'); + if (c != '\0') + continue; + + obstack_fgrow2 (&tokendefs, "# define\t%s\t%d\n", + symbol, bp->user_token_number); + if (semantic_parser) + /* FIXME: This is probably wrong, and should be just as + above. --akim. */ + obstack_fgrow2 (&tokendefs, "# define\tT%s\t%d\n", symbol, bp->value); } + + obstack_1grow (&tokendefs, 0); + muscle_insert ("tokendef", xstrdup (obstack_finish (&tokendefs))); + obstack_free (&tokendefs, NULL); } @@ -1879,6 +1778,8 @@ packgram (void) 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) @@ -1974,15 +1875,12 @@ reader (void) /* Some C code is given at the end of the grammar file. */ read_additionnal_code (); - /* Now we know whether we need the line-number stack. If we do, - write its type into the .tab.h file. - This is no longer need with header skeleton. */ - /* Assign the symbols their symbol numbers. Write #defines for the token symbols into FDEFINES if requested. */ packsymbols (); + /* Save them. */ + symbols_save (); + /* Convert the grammar into the format described in gram.h. */ packgram (); - /* Output the headers. */ - symbols_output (); }