From 573c1d9ff8aca759e7d01405c809b0318e2edfb2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 19 Dec 2000 14:51:24 +0000 Subject: [PATCH] * src/system.h (obstack_grow_literal_string): Rename as... (obstack_grow_string): this. * src/output.c (output_parser): Recognize `%% actions' instead of `$'. * src/bison.s1: s/$/%% actions/. * src/bison.hairy: Likewise. --- ChangeLog | 9 +++ src/bison.hairy | 6 +- src/bison.s1 | 8 +- src/bison.simple | 8 +- src/output.c | 197 +++++++++++++++++++++++++++-------------------- src/reader.c | 31 ++++---- src/system.h | 2 +- 7 files changed, 146 insertions(+), 115 deletions(-) diff --git a/ChangeLog b/ChangeLog index 256dac88..1f1236b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2000-12-19 Akim Demaille + + * src/system.h (obstack_grow_literal_string): Rename as... + (obstack_grow_string): this. + * src/output.c (output_parser): Recognize `%% actions' instead of + `$'. + * src/bison.s1: s/$/%% actions/. + * src/bison.hairy: Likewise. + 2000-12-19 Akim Demaille * src/output.c (output_parser): Compute the `#line' lines when diff --git a/src/bison.hairy b/src/bison.hairy index 999b5559..3acb54bc 100644 --- a/src/bison.hairy +++ b/src/bison.hairy @@ -1,4 +1,4 @@ - + /* -*- C -*- */ extern int timeclock; @@ -261,7 +261,7 @@ yyresume: yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } - + if (yyptr == yyrq + YYMAXRULES) yyptr = yyrq; } @@ -331,4 +331,4 @@ yyerrlab: goto yyresume; } -$ +%% actions diff --git a/src/bison.s1 b/src/bison.s1 index 0117220a..2a0f0b19 100644 --- a/src/bison.s1 +++ b/src/bison.s1 @@ -78,10 +78,6 @@ # define YYSTACK_ALLOC malloc #endif -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 @@ -583,7 +579,7 @@ yyreduce: yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `{dollar}{dollar} = {dollar}1'. + `$$ = $1'. Otherwise, the following line sets YYVAL to the semantic value of the lookahead token. This behavior is undocumented and Bison @@ -615,7 +611,7 @@ yyreduce: fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif -$ /* The action file replaces this line marked with this dollarsign. */ +%% actions /* The action file replaces this line. */ #line yyvsp -= yylen; diff --git a/src/bison.simple b/src/bison.simple index 0117220a..2a0f0b19 100644 --- a/src/bison.simple +++ b/src/bison.simple @@ -78,10 +78,6 @@ # define YYSTACK_ALLOC malloc #endif -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 @@ -583,7 +579,7 @@ yyreduce: yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `{dollar}{dollar} = {dollar}1'. + `$$ = $1'. Otherwise, the following line sets YYVAL to the semantic value of the lookahead token. This behavior is undocumented and Bison @@ -615,7 +611,7 @@ yyreduce: fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif -$ /* The action file replaces this line marked with this dollarsign. */ +%% actions /* The action file replaces this line. */ #line yyvsp -= yylen; diff --git a/src/output.c b/src/output.c index adef0433..609d9801 100644 --- a/src/output.c +++ b/src/output.c @@ -150,7 +150,7 @@ output_short_or_char_table (struct obstack *oout, if (j >= 10) { - obstack_grow_literal_string (oout, "\n "); + obstack_grow_string (oout, "\n "); j = 1; } else @@ -161,7 +161,7 @@ output_short_or_char_table (struct obstack *oout, obstack_fgrow1 (oout, "%6d", short_table[i]); } - obstack_grow_literal_string (oout, "\n};\n"); + obstack_grow_string (oout, "\n};\n"); } @@ -234,7 +234,7 @@ output_headers (void) if (semantic_parser) obstack_fgrow1 (&action_obstack, ACTSTR, attrsfile_quoted); else - obstack_grow_literal_string (&action_obstack, ACTSTR_SIMPLE); + obstack_grow_string (&action_obstack, ACTSTR_SIMPLE); /* if (semantic_parser) JF moved this below fprintf(ftable, "#include \"%s\"\n", attrsfile); @@ -278,9 +278,9 @@ output_trailers (void) return; if (semantic_parser) - obstack_grow_literal_string (&action_obstack, " }\n"); + obstack_grow_string (&action_obstack, " }\n"); - obstack_grow_literal_string (&action_obstack, "}\n"); + obstack_grow_string (&action_obstack, "}\n"); } @@ -288,7 +288,7 @@ output_trailers (void) static void output_token_translations (void) { - obstack_grow_literal_string (&table_obstack, "\ + obstack_grow_string (&table_obstack, "\ \n\ /* YYRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n"); @@ -308,8 +308,8 @@ output_token_translations (void) } else { - obstack_grow_literal_string (&table_obstack, - "\n#define YYTRANSLATE(x) (x)\n"); + obstack_grow_string (&table_obstack, + "\n#define YYTRANSLATE(x) (x)\n"); } } @@ -321,7 +321,7 @@ output_gram (void) yyprhs and yyrhs are needed only for yydebug. */ /* With the no_parser option, all tables are generated */ if (!semantic_parser && !no_parser_flag) - obstack_grow_literal_string (&table_obstack, "\n#if YYDEBUG != 0\n"); + obstack_grow_string (&table_obstack, "\n#if YYDEBUG != 0\n"); output_short_table (&table_obstack, NULL, "yyprhs", rrhs, 0, 1, nrules + 1); @@ -344,7 +344,7 @@ output_gram (void) } if (!semantic_parser && !no_parser_flag) - obstack_grow_literal_string (&table_obstack, "\n#endif\n"); + obstack_grow_string (&table_obstack, "\n#endif\n"); } @@ -363,7 +363,7 @@ output_rule_data (void) int j; short *short_tab = NULL; - obstack_grow_literal_string (&table_obstack, "\n\ + obstack_grow_string (&table_obstack, "\n\ #if YYDEBUG != 0\n"); output_short_table (&table_obstack, @@ -371,7 +371,7 @@ output_rule_data (void) "yyrline", rline, 0, 1, nrules + 1); - obstack_grow_literal_string (&table_obstack, "#endif\n\n"); + obstack_grow_string (&table_obstack, "#endif\n\n"); if (token_table_flag || no_parser_flag) { @@ -385,11 +385,11 @@ output_rule_data (void) /* Output the table of symbol names. */ if (!token_table_flag && !no_parser_flag) - obstack_grow_literal_string (&table_obstack, - "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n"); - obstack_grow_literal_string (&table_obstack, "\ + obstack_grow_string (&table_obstack, + "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n"); + obstack_grow_string (&table_obstack, "\ /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n"); - obstack_grow_literal_string (&table_obstack, + obstack_grow_string (&table_obstack, "static const char *const yytname[] =\n{\n "); j = 0; @@ -413,7 +413,7 @@ output_rule_data (void) if (j + strsize > 75) { - obstack_grow_literal_string (&table_obstack, "\n "); + obstack_grow_string (&table_obstack, "\n "); j = 2; } @@ -421,39 +421,27 @@ output_rule_data (void) for (p = tags[i]; p && *p; p++) { if (*p == '"' || *p == '\\') - { - obstack_fgrow1 (&table_obstack, "\\%c", *p); - } + obstack_fgrow1 (&table_obstack, "\\%c", *p); else if (*p == '\n') - { - obstack_grow_literal_string (&table_obstack, "\\n"); - } + obstack_grow_string (&table_obstack, "\\n"); else if (*p == '\t') - { - obstack_grow_literal_string (&table_obstack, "\\t"); - } + obstack_grow_string (&table_obstack, "\\t"); else if (*p == '\b') - { - obstack_grow_literal_string (&table_obstack, "\\b"); - } + obstack_grow_string (&table_obstack, "\\b"); else if (*p < 040 || *p >= 0177) - { - obstack_fgrow1 (&table_obstack, "\\%03o", *p); - } + obstack_fgrow1 (&table_obstack, "\\%03o", *p); else - { - obstack_1grow (&table_obstack, *p); - } + obstack_1grow (&table_obstack, *p); } - obstack_grow_literal_string (&table_obstack, "\", "); + obstack_grow_string (&table_obstack, "\", "); j += strsize; } /* add a NULL entry to list of tokens */ - obstack_grow_literal_string (&table_obstack, "NULL\n};\n"); + obstack_grow_string (&table_obstack, "NULL\n};\n"); if (!token_table_flag && !no_parser_flag) - obstack_grow_literal_string (&table_obstack, "#endif\n\n"); + obstack_grow_string (&table_obstack, "#endif\n\n"); /* Output YYTOKNUM. */ if (token_table_flag) @@ -1164,10 +1152,10 @@ output_parser (void) FILE *fskel; size_t line; const char *skeleton = NULL; - int number_of_dollar_signs = 0; + int actions_dumped = 0; if (pure_parser) - obstack_grow_literal_string (&table_obstack, "#define YYPURE 1\n\n"); + obstack_grow_string (&table_obstack, "#define YYPURE 1\n\n"); /* Loop over lines in the standard parser file. */ if (semantic_parser) @@ -1184,63 +1172,106 @@ output_parser (void) while (1) { - int is_sync_line = 0; - int write_line = 1; + enum line_type_e + { + regular_line, + sync_line, /* #line. */ + actions_line /* %% actions. */ + }; + enum line_type_e line_type = regular_line; c = getc (fskel); - /* See if the line starts with `#line'. */ + /* Is this line special? */ if (c == '#') - if ((c = getc (fskel)) == 'l') - if ((c = getc (fskel)) == 'i') - if ((c = getc (fskel)) == 'n') - if ((c = getc (fskel)) == 'e') - is_sync_line = 1; + { + /* See if it's a `#line' line. */ + if ((c = getc (fskel)) == 'l') + if ((c = getc (fskel)) == 'i') + if ((c = getc (fskel)) == 'n') + if ((c = getc (fskel)) == 'e') + line_type = sync_line; + else + obstack_grow_string (&table_obstack, "#lin"); else - obstack_grow_literal_string (&table_obstack, "#lin"); + obstack_grow_string (&table_obstack, "#li"); else - obstack_grow_literal_string (&table_obstack, "#li"); + obstack_grow_string (&table_obstack, "#l"); else - obstack_grow_literal_string (&table_obstack, "#l"); - else - obstack_grow_literal_string (&table_obstack, "#"); + obstack_grow_string (&table_obstack, "#"); + } + else if (c == '%') + { + /* See if it's a `%% actions' line. */ + if ((c = getc (fskel)) == '%') + if ((c = getc (fskel)) == ' ') + if ((c = getc (fskel)) == 'a') + if ((c = getc (fskel)) == 'c') + if ((c = getc (fskel)) == 't') + if ((c = getc (fskel)) == 'i') + if ((c = getc (fskel)) == 'o') + if ((c = getc (fskel)) == 'n') + if ((c = getc (fskel)) == 's') + line_type = actions_line; + else + obstack_grow_string (&table_obstack, "%% action"); + else + obstack_grow_string (&table_obstack, "%% actio"); + else + obstack_grow_string (&table_obstack, "%% acti"); + else + obstack_grow_string (&table_obstack, "%% act"); + else + obstack_grow_string (&table_obstack, "%% ac"); + else + obstack_grow_string (&table_obstack, "%% a"); + else + obstack_grow_string (&table_obstack, "%% "); + else + obstack_grow_string (&table_obstack, "%%"); + else + obstack_grow_string (&table_obstack, "%"); + } - /* If was a `#line' line, either compute it, or drop it. */ - if (is_sync_line && !no_lines_flag) - obstack_fgrow2 (&table_obstack, "#line %d %s\n", - line, quotearg_style (c_quoting_style, skeleton)); + switch (line_type) + { + case sync_line: + if (!no_lines_flag) + obstack_fgrow2 (&table_obstack, "#line %d %s\n", + line, quotearg_style (c_quoting_style, skeleton)); - if (is_sync_line) - write_line = 0; + /* Skip the end of line. */ + for (; c != '\n' && c != EOF; c = getc (fskel)) + /* nothing */; + break; - /* now write out the line... */ - for (; c != '\n' && c != EOF; c = getc (fskel)) - if (write_line) + case actions_line: { - /* `$' in the parser file indicates where to put the - actions. Copy them in at this point. */ - if (c == '$') - { - size_t size = obstack_object_size (&action_obstack); - - number_of_dollar_signs++; - assert (number_of_dollar_signs == 1); - obstack_grow (&table_obstack, - obstack_finish (&action_obstack), - size); - - /* Skip the end of the line containing `$'. */ - write_line = 0; - } - else - obstack_1grow (&table_obstack, c); + size_t size = obstack_object_size (&action_obstack); + + actions_dumped++; + assert (actions_dumped == 1); + obstack_grow (&table_obstack, + obstack_finish (&action_obstack), + size); } + + /* Skip the end of line. */ + for (; c != '\n' && c != EOF; c = getc (fskel)) + /* nothing */; + break; + + case regular_line: + for (; c != '\n' && c != EOF; c = getc (fskel)) + obstack_1grow (&table_obstack, c); + } + if (c == EOF) break; obstack_1grow (&table_obstack, c); line++; } - assert (number_of_dollar_signs == 1); + assert (actions_dumped == 1); xfclose (fskel); } @@ -1291,7 +1322,7 @@ output (void) } reader_output_yylsp (&table_obstack); if (debug_flag) - obstack_grow_literal_string (&table_obstack, "\ + obstack_grow_string (&table_obstack, "\ #ifndef YYDEBUG\n\ # define YYDEBUG 1\n\ #endif\n\ @@ -1302,10 +1333,10 @@ output (void) quotearg_style (c_quoting_style, attrsfile)); if (!no_parser_flag) - obstack_grow_literal_string (&table_obstack, "#include \n\n"); + obstack_grow_string (&table_obstack, "#include \n\n"); /* Make "const" do nothing if not in ANSI C. */ - obstack_grow_literal_string (&table_obstack, "\ + obstack_grow_string (&table_obstack, "\ #ifndef __cplusplus\n\ # ifndef __STDC__\n\ # define const\n\ diff --git a/src/reader.c b/src/reader.c index cc24af65..156fa452 100644 --- a/src/reader.c +++ b/src/reader.c @@ -343,7 +343,7 @@ copy_at (FILE *fin, FILE *fout, struct obstack *oout, int stack_offset) if (fout) fprintf (fout, "yyloc"); if (oout) - obstack_grow_literal_string (oout, "yyloc"); + obstack_grow_string (oout, "yyloc"); locations_flag = 1; } else if (isdigit (c) || c == '-') @@ -401,7 +401,7 @@ copy_dollar (FILE *fin, FILE *fout, struct obstack *oout, if (fout) fputs ("yyval", fout); if (oout) - obstack_grow_literal_string (oout, "yyval"); + obstack_grow_string (oout, "yyval"); if (!type_name) type_name = get_type_name (0, rule); @@ -786,9 +786,9 @@ parse_union_decl (void) else obstack_1grow (&attrs_obstack, '\n'); - obstack_grow_literal_string (&attrs_obstack, "typedef union"); + obstack_grow_string (&attrs_obstack, "typedef union"); if (defines_flag) - obstack_grow_literal_string (&defines_obstack, "typedef union"); + obstack_grow_string (&defines_obstack, "typedef union"); c = getc (finput); @@ -818,9 +818,9 @@ parse_union_decl (void) count--; if (count <= 0) { - obstack_grow_literal_string (&attrs_obstack, " YYSTYPE;\n"); + obstack_grow_string (&attrs_obstack, " YYSTYPE;\n"); if (defines_flag) - obstack_grow_literal_string (&defines_obstack, " YYSTYPE;\n"); + obstack_grow_string (&defines_obstack, " YYSTYPE;\n"); /* JF don't choke on trailing semi */ c = skip_white_space (); if (c != ';') @@ -1117,8 +1117,7 @@ copy_action (symbol_list *rule, int stack_offset) } } - obstack_grow_literal_string (&action_obstack, - ";\n break;}"); + obstack_grow_string (&action_obstack, ";\n break;}"); } /*-------------------------------------------------------------------. @@ -1597,10 +1596,10 @@ readgram (void) /* We used to use `unsigned long' as YYSTYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ - obstack_grow_literal_string (&attrs_obstack, - "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n"); + obstack_grow_string (&attrs_obstack, + "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n"); if (defines_flag) - obstack_grow_literal_string (&defines_obstack, "\ + obstack_grow_string (&defines_obstack, "\ #ifndef YYSTYPE\n\ # define YYSTYPE int\n\ #endif\n"); @@ -1810,8 +1809,8 @@ packsymbols (void) obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n", spec_name_prefix); else - obstack_grow_literal_string (&defines_obstack, - "\nextern YYSTYPE yylval;\n"); + obstack_grow_string (&defines_obstack, + "\nextern YYSTYPE yylval;\n"); } if (semantic_parser) @@ -1963,7 +1962,7 @@ reader (void) no_parser_flag ? "Bison-generated parse tables" : "A Bison parser", infile, VERSION); - obstack_grow_literal_string (&table_obstack, + obstack_grow_string (&table_obstack, "#define YYBISON 1 /* Identify Bison output. */\n\n"); read_declarations (); /* Start writing the guard and action files, if they are needed. */ @@ -1978,7 +1977,7 @@ reader (void) /* Write closing delimiters for actions and guards. */ output_trailers (); if (locations_flag) - obstack_grow_literal_string (&table_obstack, "#define YYLSP_NEEDED 1\n\n"); + obstack_grow_string (&table_obstack, "#define YYLSP_NEEDED 1\n\n"); /* Assign the symbols their symbol numbers. Write #defines for the token symbols into FDEFINES if requested. */ packsymbols (); @@ -1999,7 +1998,7 @@ void reader_output_yylsp (struct obstack *oout) { if (locations_flag) - obstack_grow_literal_string (oout, "\ + obstack_grow_string (oout, "\ \n\ #ifndef YYLTYPE\n\ typedef struct yyltype\n\ diff --git a/src/system.h b/src/system.h index fbb298bc..8229d484 100644 --- a/src/system.h +++ b/src/system.h @@ -145,7 +145,7 @@ typedef int bool; #define obstack_chunk_free free #include "obstack.h" -#define obstack_grow_literal_string(Obs, Str) \ +#define obstack_grow_string(Obs, Str) \ obstack_grow (Obs, Str, sizeof (Str) - 1) #define obstack_fgrow1(Obs, Format, Arg1) \ -- 2.45.2