X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/428046f8d4365e2cd60f8a5f645c2f3e23e3f7af..7742ddebf1f73cc15138d41c11a39f32b43c3ef5:/src/reader.c?ds=sidebyside diff --git a/src/reader.c b/src/reader.c index c06f4399..9bec971a 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" @@ -233,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))) { @@ -266,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; @@ -278,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 @@ -307,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 | @@ -755,30 +729,13 @@ parse_union_decl (void) 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); while (!done) { @@ -786,11 +743,7 @@ typedef union"; /* 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) { @@ -799,7 +752,7 @@ typedef union"; break; case '/': - copy_comment2 (finput, &defines_obstack, &union_obstack); + copy_comment (finput, &union_obstack); break; case '{': @@ -817,8 +770,6 @@ typedef union"; } } - if (defines_flag) - obstack_sgrow (&defines_obstack, epilogue); /* JF don't choke on trailing semi */ c = skip_white_space (); if (c != ';') @@ -1606,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. | @@ -1796,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 %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 T%s\t%d\n", symbol, bp->value); } + + obstack_1grow (&tokendefs, 0); + muscle_insert ("tokendef", xstrdup (obstack_finish (&tokendefs))); + obstack_free (&tokendefs, NULL); } @@ -1954,6 +1865,14 @@ reader (void) undeftoken->class = token_sym; undeftoken->user_token_number = 2; + /* Initialize the obstacks. */ + obstack_init (&action_obstack); + obstack_init (&attrs_obstack); + obstack_init (&guard_obstack); + obstack_init (&output_obstack); + + finput = xfopen (infile, "r"); + /* Read the declaration section. Copy %{ ... %} groups to TABLE_OBSTACK and FDEFINES file. Also notice any %token, %left, etc. found there. */ @@ -1964,15 +1883,15 @@ 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. */ + lex_free (); + xfclose (finput); /* 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 (); }