* src/reader.c (parse_thong_decl): Formatting changes.

(token_translations_init): New, extracted from...
(packsymbols): Here.
Adjust.
This commit is contained in:
Akim Demaille
2001-11-02 14:02:31 +00:00
parent 1d708336d4
commit 7ae1c5929e
4 changed files with 77 additions and 45 deletions

View File

@@ -1,3 +1,10 @@
2001-11-02 Akim Demaille <akim@epita.fr>
* src/reader.c (parse_thong_decl): Formatting changes.
(token_translations_init): New, extracted from...
(packsymbols): Here.
Adjust.
2001-11-01 Akim Demaille <akim@epita.fr> 2001-11-01 Akim Demaille <akim@epita.fr>
* tests/regression.at (AT_TEST_CPP_GUARD_H): New. * tests/regression.at (AT_TEST_CPP_GUARD_H): New.

4
NEWS
View File

@@ -2,6 +2,10 @@ Bison News
---------- ----------
Changes in version 1.30a: Changes in version 1.30a:
* Fixed incorrect processing of some invalid input.
* Fixed CPP guards: 9foo.h uses BISON_9FOO_H instead of 9FOO_H.
Changes in version 1.30: Changes in version 1.30:

1
THANKS
View File

@@ -7,6 +7,7 @@ Albert Chin-A-Young china@thewrittenword.com
Alexander Belopolsky alexb@rentec.com Alexander Belopolsky alexb@rentec.com
Daniel Hagerty hag@gnu.org Daniel Hagerty hag@gnu.org
David J. MacKenzie djm@gnu.org David J. MacKenzie djm@gnu.org
Dick Streefland dick.streefland@altium.nl
Fabrice Bauzac noon@cote-dazur.com Fabrice Bauzac noon@cote-dazur.com
Hans Aberg haberg@matematik.su.se Hans Aberg haberg@matematik.su.se
Jesse Thilo jthilo@gnu.org Jesse Thilo jthilo@gnu.org

View File

@@ -1,5 +1,5 @@
/* Input parser for bison /* Input parser for bison
Copyright 1984, 1986, 1989, 1992, 1998, 2000 Copyright 1984, 1986, 1989, 1992, 1998, 2000, 2001
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -821,7 +821,7 @@ parse_thong_decl (void)
token_t token; token_t token;
struct bucket *symbol; struct bucket *symbol;
char *typename = 0; char *typename = 0;
int usrtoknum; int usrtoknum = 0;
token = lex (); /* fetch typename or first token */ token = lex (); /* fetch typename or first token */
if (token == tok_typename) if (token == tok_typename)
@@ -852,8 +852,6 @@ parse_thong_decl (void)
usrtoknum = numval; usrtoknum = numval;
token = lex (); /* okay, did number, now get literal */ token = lex (); /* okay, did number, now get literal */
} }
else
usrtoknum = 0;
/* process literal string token */ /* process literal string token */
@@ -875,10 +873,11 @@ parse_thong_decl (void)
} }
/*-----------------------------------------------------------------------------. /*------------------------------------------------------------------.
| Parse a double quoted parameter. It was used for %{source,header}_extension. | | Parse a double quoted parameter. It was used for |
| For the moment, It is not used since extension features have been removed. | | %{source,header}_extension. For the moment, It is not used since |
`-----------------------------------------------------------------------------*/ | extension features have been removed. |
`------------------------------------------------------------------*/
#if 0 #if 0
@@ -1663,6 +1662,43 @@ output_token_defines (struct obstack *oout)
} }
/*------------------------------------------------------------------.
| Set TOKEN_TRANSLATIONS. Check that no two symbols share the same |
| number. |
`------------------------------------------------------------------*/
static void
token_translations_init (void)
{
bucket *bp = NULL;
int i;
token_translations = XCALLOC (short, max_user_token_number + 1);
/* Initialize all entries for literal tokens to 2, the internal
token number for $undefined., which represents all invalid
inputs. */
for (i = 0; i <= max_user_token_number; i++)
token_translations[i] = 2;
for (bp = firstsymbol; bp; bp = bp->next)
{
/* Non-terminal? */
if (bp->value >= ntokens)
continue;
/* A token string alias? */
if (bp->user_token_number == SALIAS)
continue;
/* A token which translation has already been set? */
if (token_translations[bp->user_token_number] != 2)
complain (_("tokens %s and %s both assigned number %d"),
tags[token_translations[bp->user_token_number]],
bp->tag, bp->user_token_number);
token_translations[bp->user_token_number] = bp->value;
}
}
/*------------------------------------------------------------------. /*------------------------------------------------------------------.
| Assign symbol numbers, and write definition of token names into | | Assign symbol numbers, and write definition of token names into |
| FDEFINES. Set up vectors TAGS and SPREC of names and precedences | | FDEFINES. Set up vectors TAGS and SPREC of names and precedences |
@@ -1674,20 +1710,19 @@ packsymbols (void)
{ {
bucket *bp = NULL; bucket *bp = NULL;
int tokno = 1; int tokno = 1;
int i, j;
int last_user_token_number; int last_user_token_number;
static char DOLLAR[] = "$"; static char DOLLAR[] = "$";
/* int lossage = 0; JF set but not used */
tags = XCALLOC (char *, nsyms + 1); tags = XCALLOC (char *, nsyms + 1);
tags[0] = DOLLAR;
user_toknums = XCALLOC (short, nsyms + 1); user_toknums = XCALLOC (short, nsyms + 1);
user_toknums[0] = 0;
sprec = XCALLOC (short, nsyms); sprec = XCALLOC (short, nsyms);
sassoc = XCALLOC (short, nsyms); sassoc = XCALLOC (short, nsyms);
/* The EOF token. */
tags[0] = DOLLAR;
user_toknums[0] = 0;
max_user_token_number = 256; max_user_token_number = 256;
last_user_token_number = 256; last_user_token_number = 256;
@@ -1740,7 +1775,7 @@ packsymbols (void)
if (bp->class == token_sym) if (bp->class == token_sym)
{ {
if (!bp->user_token_number) if (bp->user_token_number == 0)
bp->user_token_number = ++last_user_token_number; bp->user_token_number = ++last_user_token_number;
if (bp->user_token_number > max_user_token_number) if (bp->user_token_number > max_user_token_number)
max_user_token_number = bp->user_token_number; max_user_token_number = bp->user_token_number;
@@ -1752,26 +1787,7 @@ packsymbols (void)
sassoc[bp->value] = bp->assoc; sassoc[bp->value] = bp->assoc;
} }
token_translations = XCALLOC (short, max_user_token_number + 1); token_translations_init ();
/* initialize all entries for literal tokens to 2, the internal
token number for $undefined., which represents all invalid
inputs. */
for (j = 0; j <= max_user_token_number; j++)
token_translations[j] = 2;
for (bp = firstsymbol; bp; bp = bp->next)
{
if (bp->value >= ntokens)
continue; /* non-terminal */
if (bp->user_token_number == SALIAS)
continue;
if (token_translations[bp->user_token_number] != 2)
complain (_("tokens %s and %s both assigned number %d"),
tags[token_translations[bp->user_token_number]],
bp->tag, bp->user_token_number);
token_translations[bp->user_token_number] = bp->value;
}
error_token_number = errtoken->value; error_token_number = errtoken->value;
@@ -1800,19 +1816,23 @@ packsymbols (void)
} }
if (semantic_parser) if (semantic_parser)
for (i = ntokens; i < nsyms; i++) {
{ int i;
/* don't make these for dummy nonterminals made by gensym. */
if (*tags[i] != '@') for (i = ntokens; i < nsyms; i++)
obstack_fgrow2 (&defines_obstack, {
"# define\tNT%s\t%d\n", tags[i], 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 #if 0
/* `fdefines' is now a temporary file, so we need to copy its /* `fdefines' is now a temporary file, so we need to copy its
contents in `done', so we can't close it here. */ contents in `done', so we can't close it here. */
fclose (fdefines); fclose (fdefines);
fdefines = NULL; fdefines = NULL;
#endif #endif
}
} }
} }