(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 <akim@epita.fr>
+
+ * 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 <akim@epita.fr>
* configure.in (WERROR_CFLAGS): Compute it.
-%%{section} %%{body} %%".c" %%{yacc}
+%%{section} %%{output-prefix} %%{output-infix} %%".c"
/* -*- C -*- */
/* YYERROR and YYCOST are set by guards. If yyerror is set to a
-%%{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
/* 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.
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;
\f
/*--------------------------.
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);
}
/* 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);
/* 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.
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_ */
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);
typed access to it. */
#define yycontrol ((skel_control_t *) skel_control)
-char* prefix = NULL;
FILE* parser = NULL;
size_t output_line;
%token LINE
%token SLINE
-%token YACC
%token SECTION
%token GUARDS
%token TOKENS
%token ACTIONS
-%type <boolean> section.yacc
+%type <string> string.1 string
%start input
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);
}
;
-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. */ { }
case CHARACTER:
fprintf (file, " = '%c'", value->character);
break;
-
- case YACC:
- fprintf (file, " = %s", value->boolean ? "true" : "false");
- break;
}
}
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;
"%%{line}" { return LINE; }
"%%{skeleton-line}" { return SLINE; }
-"%%{yacc}" { return YACC; }
"%%{section}" { return SECTION; }
"%%{guards}" { return GUARDS; }