mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 12:53:03 +00:00
* src/output.c (output_short_or_char_table): New function.
(output_short_table, output_token_translations): Use it. (goto_actions): Use output_short_table.
This commit is contained in:
@@ -354,7 +354,9 @@ set_goto_map (void)
|
||||
|
||||
|
||||
|
||||
/* Map_goto maps a state/symbol pair into its numeric representation. */
|
||||
/*----------------------------------------------------------.
|
||||
| Map a state/symbol pair into its numeric representation. |
|
||||
`----------------------------------------------------------*/
|
||||
|
||||
static int
|
||||
map_goto (int state, int symbol)
|
||||
@@ -379,8 +381,8 @@ map_goto (int state, int symbol)
|
||||
high = middle - 1;
|
||||
}
|
||||
|
||||
berror ("map_goto");
|
||||
/* NOTREACHED */
|
||||
assert (0);
|
||||
/* NOTREACHED */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
15
src/lalr.h
15
src/lalr.h
@@ -1,5 +1,5 @@
|
||||
/* Compute look-ahead criteria for bison,
|
||||
Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc.
|
||||
Copyright (C) 1984, 1986, 1989, 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
|
||||
@@ -35,14 +35,15 @@ void lalr PARAMS ((void));
|
||||
|
||||
/* lalr() builds these data structures. */
|
||||
|
||||
/* goto_map, from_state and to_state --record each shift transition
|
||||
/* GOTO_MAP, FROM_STATE and TO_STATE -- record each shift transition
|
||||
which accepts a variable (a nonterminal).
|
||||
|
||||
from_state[t] is the state number which a transition leads from and
|
||||
to_state[t] is the state number it leads to. All the transitions
|
||||
that accept a particular variable are grouped together and
|
||||
goto_map[i - ntokens] is the index in from_state and to_state of
|
||||
the first of them. */
|
||||
FROM_STATE[T] -- state number which a transition leads from.
|
||||
TO_STATE[T] -- state number it leads to.
|
||||
|
||||
All the transitions that accept a particular variable are grouped
|
||||
together and GOTO_MAP[I - NTOKENS] is the index in FROM_STATE and
|
||||
TO_STATE of the first of them. */
|
||||
|
||||
extern short *goto_map;
|
||||
extern short *from_state;
|
||||
|
||||
120
src/output.c
120
src/output.c
@@ -125,20 +125,21 @@ static int high;
|
||||
|
||||
|
||||
static inline void
|
||||
output_short_table (FILE *out,
|
||||
const char *comment,
|
||||
const char *table_name,
|
||||
short *short_table,
|
||||
short first_value,
|
||||
short begin, short end)
|
||||
output_short_or_char_table (FILE *out,
|
||||
const char *comment,
|
||||
const char *type,
|
||||
const char *table_name,
|
||||
short *short_table,
|
||||
short first_value,
|
||||
short begin, short end)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
if (comment)
|
||||
fprintf (out, "/* %s. */\n", comment);
|
||||
|
||||
fprintf (out, "static const short %s[] =\n{\n %6d",
|
||||
table_name, first_value);
|
||||
fprintf (out, "static const %s %s[] =\n{\n %6d",
|
||||
type, table_name, first_value);
|
||||
|
||||
j = 1;
|
||||
for (i = begin; i < end; i++)
|
||||
@@ -162,6 +163,19 @@ output_short_table (FILE *out,
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
output_short_table (FILE *out,
|
||||
const char *comment,
|
||||
const char *table_name,
|
||||
short *short_table,
|
||||
short first_value,
|
||||
short begin, short end)
|
||||
{
|
||||
output_short_or_char_table (out, comment, "short", table_name, short_table,
|
||||
first_value, begin, end);
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------.
|
||||
| output_headers -- Output constant strings to the beginning of |
|
||||
| certain files. |
|
||||
@@ -256,39 +270,23 @@ output_trailers (void)
|
||||
static void
|
||||
output_token_translations (void)
|
||||
{
|
||||
int i, j;
|
||||
/* short *sp; JF unused */
|
||||
|
||||
fputs ("\
|
||||
\n\
|
||||
/* YYRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n",
|
||||
ftable);
|
||||
if (translations)
|
||||
{
|
||||
fprintf (ftable,
|
||||
"\n#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\n",
|
||||
"#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\
|
||||
\n\
|
||||
\n",
|
||||
max_user_token_number, nsyms);
|
||||
|
||||
if (ntokens < 127) /* play it very safe; check maximum element value. */
|
||||
fprintf (ftable, "\nstatic const char yytranslate[] = { 0");
|
||||
else
|
||||
fprintf (ftable, "\nstatic const short yytranslate[] = { 0");
|
||||
|
||||
j = 10;
|
||||
for (i = 1; i <= max_user_token_number; i++)
|
||||
{
|
||||
putc (',', ftable);
|
||||
|
||||
if (j >= 10)
|
||||
{
|
||||
putc ('\n', ftable);
|
||||
j = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
j++;
|
||||
}
|
||||
|
||||
fprintf (ftable, "%6d", token_translations[i]);
|
||||
}
|
||||
|
||||
fprintf (ftable, "\n};\n");
|
||||
output_short_or_char_table (ftable,
|
||||
"YYRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX",
|
||||
ntokens < 127 ? "char" : "short",
|
||||
"yytranslate", token_translations,
|
||||
0, 1, max_user_token_number + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -724,8 +722,13 @@ token_actions (void)
|
||||
}
|
||||
XFREE (actrow);
|
||||
|
||||
output_short_table (ftable, NULL, "yydefact", yydefact,
|
||||
output_short_table (ftable,
|
||||
"YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
|
||||
doesn't specify something else to do. Zero means the default is an\n\
|
||||
error",
|
||||
"yydefact", yydefact,
|
||||
yydefact[0], 1, nstates);
|
||||
putc ('\n', ftable);
|
||||
XFREE (yydefact);
|
||||
}
|
||||
|
||||
@@ -765,19 +768,17 @@ static void
|
||||
save_column (int symbol, int default_state)
|
||||
{
|
||||
int i;
|
||||
int m;
|
||||
int n;
|
||||
short *sp;
|
||||
short *sp1;
|
||||
short *sp2;
|
||||
int count;
|
||||
int symno;
|
||||
|
||||
m = goto_map[symbol];
|
||||
n = goto_map[symbol + 1];
|
||||
short begin = goto_map[symbol];
|
||||
short end = goto_map[symbol + 1];
|
||||
|
||||
count = 0;
|
||||
for (i = m; i < n; i++)
|
||||
for (i = begin; i < end; i++)
|
||||
{
|
||||
if (to_state[i] != default_state)
|
||||
count++;
|
||||
@@ -791,7 +792,7 @@ save_column (int symbol, int default_state)
|
||||
froms[symno] = sp1 = sp = XCALLOC (short, count);
|
||||
tos[symno] = sp2 = XCALLOC (short, count);
|
||||
|
||||
for (i = m; i < n; i++)
|
||||
for (i = begin; i < end; i++)
|
||||
{
|
||||
if (to_state[i] != default_state)
|
||||
{
|
||||
@@ -853,36 +854,23 @@ default_goto (int symbol)
|
||||
static void
|
||||
goto_actions (void)
|
||||
{
|
||||
int i, j, k;
|
||||
int i;
|
||||
|
||||
short *yydefgoto = XMALLOC (short, nsyms - ntokens);
|
||||
state_count = XCALLOC (short, nstates);
|
||||
|
||||
k = default_goto (ntokens);
|
||||
fprintf (ftable, "\nstatic const short yydefgoto[] = {%6d", k);
|
||||
save_column (ntokens, k);
|
||||
|
||||
j = 10;
|
||||
for (i = ntokens + 1; i < nsyms; i++)
|
||||
for (i = ntokens; i < nsyms; ++i)
|
||||
{
|
||||
putc (',', ftable);
|
||||
|
||||
if (j >= 10)
|
||||
{
|
||||
putc ('\n', ftable);
|
||||
j = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
j++;
|
||||
}
|
||||
|
||||
k = default_goto (i);
|
||||
fprintf (ftable, "%6d", k);
|
||||
save_column (i, k);
|
||||
int default_state = default_goto (i);
|
||||
save_column (i, default_state);
|
||||
yydefgoto[i - ntokens] = default_state;
|
||||
}
|
||||
|
||||
fprintf (ftable, "\n};\n");
|
||||
output_short_table (ftable, NULL, "yydefgoto", yydefgoto,
|
||||
yydefgoto[0], 1, nsyms - ntokens);
|
||||
|
||||
XFREE (state_count);
|
||||
XFREE (yydefgoto);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user