From b85810aec0e5172c813b1cdd511bfce8a0cd4b4f Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 9 Jan 2002 13:03:45 +0000 Subject: [PATCH] * src/files.c, src/files.h (output_infix): New. (tab_extension): Remove. (compute_base_names): Compute the former, drop the latter. * src/output.c (prepare): Insert the muscles `output-infix', and `output-suffix'. * src/parse-skel.y (string, string.1): New. (section.header): Use it. (section.yacc): Remove. (prefix): Remove too. * src/scan-skel.l: Adjust. * src/bison.simple, src/bison.hairy: Adjust. --- ChangeLog | 14 +++++++++++ src/bison.hairy | 2 +- src/bison.simple | 4 ++-- src/files.c | 21 ++++++++++------ src/files.h | 11 +++++---- src/output.c | 5 ++++ src/parse-skel.y | 62 +++++++++++++----------------------------------- src/scan-skel.l | 1 - 8 files changed, 59 insertions(+), 61 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1de0a987..a10fd0bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2002-01-09 Akim Demaille + + * src/files.c, src/files.h (output_infix): New. + (tab_extension): Remove. + (compute_base_names): Compute the former, drop the latter. + * src/output.c (prepare): Insert the muscles `output-infix', and + `output-suffix'. + * src/parse-skel.y (string, string.1): New. + (section.header): Use it. + (section.yacc): Remove. + (prefix): Remove too. + * src/scan-skel.l: Adjust. + * src/bison.simple, src/bison.hairy: Adjust. + 2002-01-09 Akim Demaille * configure.in (WERROR_CFLAGS): Compute it. diff --git a/src/bison.hairy b/src/bison.hairy index 5371ea6f..1034eae7 100644 --- a/src/bison.hairy +++ b/src/bison.hairy @@ -1,4 +1,4 @@ -%%{section} %%{body} %%".c" %%{yacc} +%%{section} %%{output-prefix} %%{output-infix} %%".c" /* -*- C -*- */ /* YYERROR and YYCOST are set by guards. If yyerror is set to a diff --git a/src/bison.simple b/src/bison.simple index 207395fc..59ff145b 100644 --- a/src/bison.simple +++ b/src/bison.simple @@ -1,11 +1,11 @@ -%%{section} %%{body} %%".c" %%{yacc} +%%{section} %%{output-prefix} %%{output-infix} %%".c" /* -*- C -*- */ /* A Bison parser, made from %%{filename} by GNU bison %%{version}. */ /* Skeleton output parser for bison, - Copyright 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc. + Copyright 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/files.c b/src/files.c index 5240c410..11de06e7 100644 --- a/src/files.c +++ b/src/files.c @@ -1,5 +1,6 @@ /* Open and close files for bison, - Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc. + Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002 + Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -54,15 +55,18 @@ char *infile = NULL; char *attrsfile = NULL; static char *full_base_name = NULL; + +/* Prefix used to generate output file names. */ char *short_base_name = NULL; +/* Infix used to generate output file names (i.e., `.tab', or `_tab', + or `'). */ +char *output_infix = NULL; + /* C source file extension (the parser source). */ const char *src_extension = NULL; /* Header file extension (if option ``-d'' is specified). */ const char *header_extension = NULL; - -/* Should we insert '.tab' in yacc-compatible parsers? */ -int tab_extension = 0; /*--------------------------. @@ -347,14 +351,16 @@ compute_base_names (void) full_base_name = xstrndup (spec_outfile, (strlen (spec_outfile) - (ext ? strlen (ext) : 0))); + /* The short base name goes up to TAB, excluding it. */ short_base_name = xstrndup (spec_outfile, (strlen (spec_outfile) - (tab ? strlen (tab) : (ext ? strlen (ext) : 0)))); - /* Do we have a tab part? */ - tab_extension = !!tab; + if (tab) + output_infix = xstrndup (tab, + (strlen (tab) - (ext ? strlen (ext) : 0))); if (ext) compute_exts_from_src (ext); @@ -388,7 +394,8 @@ compute_base_names (void) } /* In these cases, always append `.tab'. */ - tab_extension = 1; + output_infix = xstrdup (EXT_TAB); + full_base_name = XMALLOC (char, strlen (short_base_name) + strlen (EXT_TAB) + 1); diff --git a/src/files.h b/src/files.h index 604216c5..6d8f640f 100644 --- a/src/files.h +++ b/src/files.h @@ -1,5 +1,5 @@ /* File names and variables for bison, - Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc. + Copyright 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -76,10 +76,11 @@ int strsuffix (const char* string, const char* suffix); STRING1, and STRING2. */ char* stringappend (const char* string1, const char* string2); -/* Should we insert '.tab' in yacc-compatible parsers? */ -extern int tab_extension; +/* Prefix used to generate output file names. */ +extern char *short_base_name; -/* Prefix used to generate output files names. */ -extern char* short_base_name; +/* Infix used to generate output file names (i.e., `.tab', or `_tab', + or `'). */ +extern char *output_infix; #endif /* !FILES_H_ */ diff --git a/src/output.c b/src/output.c index 7b0e8f0c..d5eba988 100644 --- a/src/output.c +++ b/src/output.c @@ -995,6 +995,11 @@ prepare (void) MUSCLE_INSERT_INT ("error-verbose", error_verbose); MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy"); + /* FIXME: This is wrong: the muscles should decide whether they hold + a copy or not, but the situation is too obscure currently. */ + MUSCLE_INSERT_STRING ("output-infix", output_infix ? output_infix : ""); + MUSCLE_INSERT_STRING ("output-prefix", short_base_name); + MUSCLE_INSERT_INT ("nnts", nvars); MUSCLE_INSERT_INT ("nrules", nrules); MUSCLE_INSERT_INT ("nstates", nstates); diff --git a/src/parse-skel.y b/src/parse-skel.y index 34445f3f..ccb5e43f 100644 --- a/src/parse-skel.y +++ b/src/parse-skel.y @@ -44,7 +44,6 @@ typed access to it. */ #define yycontrol ((skel_control_t *) skel_control) -char* prefix = NULL; FILE* parser = NULL; size_t output_line; @@ -87,14 +86,13 @@ static void yyprint (FILE *file, const yyltype *loc, %token LINE %token SLINE -%token YACC %token SECTION %token GUARDS %token TOKENS %token ACTIONS -%type section.yacc +%type string.1 string %start input @@ -110,43 +108,14 @@ skeleton : /* Empty. */ { } section : section.header section.body { } ; -section.header : SECTION BLANKS MUSCLE BLANKS STRING BLANKS section.yacc '\n' +section.header : SECTION BLANKS string '\n' { - char *name = 0; - char *limit = 0; - char *suffix = $5; + char *name = $3; /* Close the previous parser. */ if (parser) parser = (xfclose (parser), NULL); - /* If the following section should be named with the yacc-style, and it's - suffix is of the form 'something.h' or 'something.c', then add '.tab' in - the middle of the suffix. */ - if (tab_extension && $7 && (strsuffix (suffix, ".h") || - strsuffix (suffix, ".c"))) - { - size_t prefix_len = strlen (prefix); - size_t suffix_len = strlen (suffix); - - /* Allocate enough space to insert '.tab'. */ - name = XMALLOC (char, prefix_len + suffix_len + 5); - limit = strrchr (suffix, '.'); - if (!limit) - limit = suffix; - - /* Prefix is 'X', suffix is 'Y.Z'. Name will be 'XY.tab.Z'. */ - { - char* cp = 0; - cp = stpcpy (name, prefix); - cp = stpncpy (cp, suffix, limit - suffix); - cp = stpcpy (cp, ".tab"); - cp = stpcpy (cp, limit); - } - } - else - name = stringappend (prefix, suffix); - /* Prepare the next parser to be output. */ parser = xfopen (name, "w"); MUSCLE_INSERT_STRING ("parser-file-name", name); @@ -156,9 +125,20 @@ section.header : SECTION BLANKS MUSCLE BLANKS STRING BLANKS section.yacc '\n' } ; -section.yacc : /* Empty. */ { $$ = 0; } - | YACC { $$ = 1; } -; +/* Either a literal string, or a muscle value. */ +string.1: + STRING { $$ = $1; } + | MUSCLE { $$ = xstrdup (muscle_find ($1)); } + ; + +/* Either a literal string, or a muscle value, or the concatenation of + them. */ +string: + string.1 + { $$ = $1; } + | string BLANKS string.1 + { $$ = stringappend ($1, $3); free ($1); free ($3); } + ; section.body : /* Empty. */ { } @@ -210,10 +190,6 @@ yyprint (FILE *file, case CHARACTER: fprintf (file, " = '%c'", value->character); break; - - case YACC: - fprintf (file, " = %s", value->boolean ? "true" : "false"); - break; } } @@ -238,10 +214,6 @@ skel_error (skel_control_t *control, void process_skeleton (const char* skel) { - /* Compute prefix. Actually, it seems that the processing I need here is - done in compute_base_names, and the result stored in short_base_name. */ - prefix = short_base_name; - /* Prepare a few things. */ output_line = 1; skeleton_line = 1; diff --git a/src/scan-skel.l b/src/scan-skel.l index b04968c4..924f4ab9 100644 --- a/src/scan-skel.l +++ b/src/scan-skel.l @@ -50,7 +50,6 @@ "%%{line}" { return LINE; } "%%{skeleton-line}" { return SLINE; } -"%%{yacc}" { return YACC; } "%%{section}" { return SECTION; } "%%{guards}" { return GUARDS; } -- 2.45.2