From: Akim Demaille Date: Mon, 16 Oct 2000 18:33:38 +0000 (+0000) Subject: * src/output.c (output_short_or_char_table): New function. X-Git-Tag: BISON-1_28b~85 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/43591cec981a3e7dd87bd1aef63ea0b9ec73c01c * src/output.c (output_short_or_char_table): New function. (output_short_table, output_token_translations): Use it. (goto_actions): Use output_short_table. --- diff --git a/ChangeLog b/ChangeLog index e0d44232..68912bab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2000-10-16 Akim Demaille + + * src/output.c (output_short_or_char_table): New function. + (output_short_table, output_token_translations): Use it. + (goto_actions): Use output_short_table. + 2000-10-16 Akim Demaille * src/symtab.c (bucket_new): New function. @@ -9,14 +15,14 @@ (output_gram): Use it. (output_rule_data): Nicer output layout for YYTNAME. - + 2000-10-16 Akim Demaille * src/lex.c (read_typename): New function. (lex): Use it. * src/reader.c (copy_dollar): Likewise. - + 2000-10-16 Akim Demaille * src/reader.c (copy_comment2): Expect the input stream to be on @@ -25,19 +31,19 @@ (copy_comment, copy_definition, parse_union_decl, copy_action) (copy_guard): Adjust. - + 2000-10-16 Akim Demaille * src/reader.c (parse_expect_decl): Use `skip_white_space' and `read_signed_integer'. - + 2000-10-16 Akim Demaille * src/reader.c (copy_dollar): New function. (copy_guard, copy_action): Use it. - + 2000-10-16 Akim Demaille * lib/quote.h, lib/quote.c, lib/quotearg.h, lib/quotearg.c: diff --git a/src/lalr.c b/src/lalr.c index 40da1987..76ad5173 100644 --- a/src/lalr.c +++ b/src/lalr.c @@ -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; } diff --git a/src/lalr.h b/src/lalr.h index c0abb2c7..596b1a58 100644 --- a/src/lalr.h +++ b/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; diff --git a/src/output.c b/src/output.c index 54ec5c19..b23ffe8e 100644 --- a/src/output.c +++ b/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); }