* doc/bison.texinfo: Update.

* doc/bison.1 (mandoc): Update.
* src/system.h (EXT_GUARD_C, EXT_STYPE_H): Remove .c and .h.
* src/files.c: Support output files extensions computing.
(src_extension): New static variable.
(header_extension): New static variable.
(tr): New function.
(get_extension_index): New function, gets the index of an extension
filename in a string.
(compute_exts_from_gf): New function, computes extensions from the
grammar file extension.
(compute_exts_from_src): New functions, computes extensions from the
C source file extension, file given by ``-o'' option.
(compute_base_names): Update.
(output_files): Update.
This commit is contained in:
Akim Demaille
2001-08-01 18:08:48 +00:00
parent 847bf1f538
commit 234a3be303
11 changed files with 250 additions and 91 deletions

View File

@@ -1,3 +1,21 @@
2001-08-01 Marc Autret <autret_m@epita.fr>
* doc/bison.texinfo: Update.
* doc/bison.1 (mandoc): Update.
* src/system.h (EXT_GUARD_C, EXT_STYPE_H): Remove .c and .h.
* src/files.c: Support output files extensions computing.
(src_extension): New static variable.
(header_extension): New static variable.
(tr): New function.
(get_extension_index): New function, gets the index of an extension
filename in a string.
(compute_exts_from_gf): New function, computes extensions from the
grammar file extension.
(compute_exts_from_src): New functions, computes extensions from the
C source file extension, file given by ``-o'' option.
(compute_base_names): Update.
(output_files): Update.
2001-08-01 Robert Anisko <anisko_r@epita.fr> 2001-08-01 Robert Anisko <anisko_r@epita.fr>
* doc/autoconf.texi: Document @$. * doc/autoconf.texi: Document @$.

2
NEWS
View File

@@ -3,6 +3,8 @@ Bison News
Changes in version 1.28a: Changes in version 1.28a:
* the input and the output files has automatically a similar extension.
* Russian translation added. * Russian translation added.
* NLS support updated; should hopefully be less troublesome. * NLS support updated; should hopefully be less troublesome.

View File

@@ -71,13 +71,22 @@ Unlike
.IR yacc , .IR yacc ,
the generated files do not have fixed names, but instead use the prefix the generated files do not have fixed names, but instead use the prefix
of the input file. of the input file.
Moreover, if you need to put
.IR C++
code in the input file, you can end his name by a C++-like extension
(.ypp or .y++), then bison will follow your extension to name the
output file (.cpp or .c++).
For instance, a grammar description file named For instance, a grammar description file named
.B parse.y .B parse.yxx
would produce the generated parser in a file named would produce the generated parser in a file named
.BR parse.tab.c , .BR parse.tab.cxx ,
instead of instead of
.IR yacc 's .IR yacc 's
.BR y.tab.c . .BR y.tab.c
or old
.IR Bison
versions
.BR parse.tab.c .
.PP .PP
This description of the options that can be given to This description of the options that can be given to
.I bison .I bison

View File

@@ -32,9 +32,9 @@ instead of in the original English.
Indirect: Indirect:
bison.info-1: 1307 bison.info-1: 1307
bison.info-2: 50189 bison.info-2: 50189
bison.info-3: 99779 bison.info-3: 99814
bison.info-4: 149657 bison.info-4: 149692
bison.info-5: 196400 bison.info-5: 196961
 
Tag Table: Tag Table:
(Indirect) (Indirect)
@@ -71,69 +71,69 @@ Node: Mfcalc Rules72281
Node: Mfcalc Symtab73661 Node: Mfcalc Symtab73661
Node: Exercises80034 Node: Exercises80034
Node: Grammar File80540 Node: Grammar File80540
Node: Grammar Outline81353 Node: Grammar Outline81388
Node: C Declarations82087 Node: C Declarations82122
Node: Bison Declarations82667 Node: Bison Declarations82702
Node: Grammar Rules83079 Node: Grammar Rules83114
Node: C Code83539 Node: C Code83574
Node: Symbols84469 Node: Symbols84504
Node: Rules89550 Node: Rules89585
Node: Recursion91189 Node: Recursion91224
Node: Semantics92908 Node: Semantics92943
Node: Value Type94002 Node: Value Type94037
Node: Multiple Types94674 Node: Multiple Types94709
Node: Actions95691 Node: Actions95726
Node: Action Types98476 Node: Action Types98511
Node: Mid-Rule Actions99779 Node: Mid-Rule Actions99814
Node: Locations105348 Node: Locations105383
Node: Location Type106013 Node: Location Type106048
Node: Actions and Locations106571 Node: Actions and Locations106606
Node: Location Default Action107735 Node: Location Default Action107770
Node: Declarations108942 Node: Declarations108977
Node: Token Decl110261 Node: Token Decl110296
Node: Precedence Decl112274 Node: Precedence Decl112309
Node: Union Decl113825 Node: Union Decl113860
Node: Type Decl114669 Node: Type Decl114704
Node: Expect Decl115575 Node: Expect Decl115610
Node: Start Decl117121 Node: Start Decl117156
Node: Pure Decl117499 Node: Pure Decl117534
Node: Decl Summary119176 Node: Decl Summary119211
Node: Multiple Parsers124559 Node: Multiple Parsers124594
Node: Interface126053 Node: Interface126088
Node: Parser Function126925 Node: Parser Function126960
Node: Lexical127760 Node: Lexical127795
Node: Calling Convention129166 Node: Calling Convention129201
Node: Token Values131937 Node: Token Values131972
Node: Token Positions133086 Node: Token Positions133121
Node: Pure Calling133971 Node: Pure Calling134006
Node: Error Reporting136903 Node: Error Reporting136938
Node: Action Features139025 Node: Action Features139060
Node: Algorithm142320 Node: Algorithm142355
Node: Look-Ahead144613 Node: Look-Ahead144648
Node: Shift/Reduce146745 Node: Shift/Reduce146780
Node: Precedence149657 Node: Precedence149692
Node: Why Precedence150308 Node: Why Precedence150343
Node: Using Precedence152173 Node: Using Precedence152208
Node: Precedence Examples153141 Node: Precedence Examples153176
Node: How Precedence153842 Node: How Precedence153877
Node: Contextual Precedence154991 Node: Contextual Precedence155026
Node: Parser States156782 Node: Parser States156817
Node: Reduce/Reduce158025 Node: Reduce/Reduce158060
Node: Mystery Conflicts161586 Node: Mystery Conflicts161621
Node: Stack Overflow164972 Node: Stack Overflow165007
Node: Error Recovery166345 Node: Error Recovery166380
Node: Context Dependency171481 Node: Context Dependency171516
Node: Semantic Tokens172329 Node: Semantic Tokens172364
Node: Lexical Tie-ins175346 Node: Lexical Tie-ins175381
Node: Tie-in Recovery176894 Node: Tie-in Recovery176929
Node: Debugging179066 Node: Debugging179101
Node: Invocation182367 Node: Invocation182402
Node: Bison Options183097 Node: Bison Options183658
Node: Environment Variables186531 Node: Environment Variables187092
Node: Option Cross Key187379 Node: Option Cross Key187940
Node: VMS Invocation188223 Node: VMS Invocation188784
Node: Table of Symbols189007 Node: Table of Symbols189568
Node: Glossary196400 Node: Glossary196961
Node: Index202690 Node: Index203251
 
End Tag Table End Tag Table

View File

@@ -903,7 +903,7 @@ produces a C-language function that recognizes correct instances of the
grammar. grammar.
The Bison grammar input file conventionally has a name ending in The Bison grammar input file conventionally has a name ending in
`.y'. `.y'. *Note Invoking Bison: Invocation.
* Menu: * Menu:

View File

@@ -857,7 +857,20 @@ Invoking Bison
Here INFILE is the grammar file name, which usually ends in `.y'. Here INFILE is the grammar file name, which usually ends in `.y'.
The parser file's name is made by replacing the `.y' with `.tab.c'. The parser file's name is made by replacing the `.y' with `.tab.c'.
Thus, the `bison foo.y' filename yields `foo.tab.c', and the `bison Thus, the `bison foo.y' filename yields `foo.tab.c', and the `bison
hack/foo.y' filename yields `hack/foo.tab.c'. hack/foo.y' filename yields `hack/foo.tab.c'. It's is also possible, in
case you are writting C++ code instead of C in your grammar file, to
name it `foo.ypp' or `foo.y++'. Then, the output files will take an
extention like the given one as input (repectively `foo.tab.cpp' and
`foo.tab.c++'). This feature takes effect with all options that
manipulate filenames like `-o' or `-d'.
For example :
bison -d INFILE.YXX
will produce `infile.tab.cxx' and `infile.tab.hxx'. and
bison -d INFILE.Y -o OUTPUT.C++
will produce `output.c++' and `outfile.h++'.
* Menu: * Menu:

View File

@@ -2142,6 +2142,7 @@ Bison takes as input a context-free grammar specification and produces a
C-language function that recognizes correct instances of the grammar. C-language function that recognizes correct instances of the grammar.
The Bison grammar input file conventionally has a name ending in @samp{.y}. The Bison grammar input file conventionally has a name ending in @samp{.y}.
@xref{Invocation, ,Invoking Bison}.
@menu @menu
* Grammar Outline:: Overall layout of the grammar file. * Grammar Outline:: Overall layout of the grammar file.
@@ -5079,7 +5080,26 @@ Here @var{infile} is the grammar file name, which usually ends in
@samp{.y}. The parser file's name is made by replacing the @samp{.y} @samp{.y}. The parser file's name is made by replacing the @samp{.y}
with @samp{.tab.c}. Thus, the @samp{bison foo.y} filename yields with @samp{.tab.c}. Thus, the @samp{bison foo.y} filename yields
@file{foo.tab.c}, and the @samp{bison hack/foo.y} filename yields @file{foo.tab.c}, and the @samp{bison hack/foo.y} filename yields
@file{hack/foo.tab.c}.@refill @file{hack/foo.tab.c}. It's is also possible, in case you are writting
C++ code instead of C in your grammar file, to name it @file{foo.ypp}
or @file{foo.y++}. Then, the output files will take an extention like
the given one as input (repectively @file{foo.tab.cpp} and @file{foo.tab.c++}).
This feature takes effect with all options that manipulate filenames like
@samp{-o} or @samp{-d}.
For example :
@example
bison -d @var{infile.yxx}
@end example
will produce @file{infile.tab.cxx} and @file{infile.tab.hxx}. and
@example
bison -d @var{infile.y} -o @var{output.c++}
@end example
will produce @file{output.c++} and @file{outfile.h++}.
@refill
@menu @menu
* Bison Options:: All the options described in detail, * Bison Options:: All the options described in detail,

View File

@@ -1,3 +1,3 @@
@set UPDATED 30 July 2001 @set UPDATED 1 August 2001
@set EDITION 1.28a @set EDITION 1.28a
@set VERSION 1.28a @set VERSION 1.28a

View File

@@ -1,3 +1,3 @@
@set UPDATED 30 July 2001 @set UPDATED 1 August 2001
@set EDITION 1.28a @set EDITION 1.28a
@set VERSION 1.28a @set VERSION 1.28a

View File

@@ -45,6 +45,11 @@ char *attrsfile;
static char *base_name; static char *base_name;
static char *short_base_name; static char *short_base_name;
/* C source file extension (the parser source). */
static char *src_extension;
/* Header file extension (if option ``-d'' is specified). */
static char *header_extension;
/*--------------------------. /*--------------------------.
| Is SUFFIX ending STRING? | | Is SUFFIX ending STRING? |
@@ -156,9 +161,68 @@ skeleton_find (const char *envvar, const char *skeleton)
} }
/*----------------------------------------. /*----------------------------------------------------------------.
| Compute BASE_NAME and SHORT_BASE_NAME. | | Compute BASE_NAME, SHORT_BASE_NAME and output files extensions. |
`----------------------------------------*/ `----------------------------------------------------------------*/
/* Replace all characters FROM by TO in the string IN.
and returns a new allocated string. */
static char *
tr(const char *in, char from, char to)
{
char *temp;
char *out;
out = XMALLOC (char, strlen (in) + 1);
for (temp = out; *in; in++, out++)
if (*in == from)
*out = to;
else
*out = *in;
*out = 0;
return (temp);
}
/* Gets the extension index in FILENAME. Returns 0 if fails to
find an extension. */
static int
get_extension_index(const char *filename)
{
int len;
len = strlen (filename);
if (filename[len-- - 1] == '.')
return (0);
while ((len > 0) && (filename[len - 1] != '.'))
if (filename[len - 1] == '/')
return (0);
else
len--;
return (len - 1);
}
/* Computes extensions from the grammar file extension. */
static void
compute_exts_from_gf(const char *ext)
{
src_extension = tr(ext, 'y', 'c');
src_extension = tr(src_extension, 'Y', 'C');
header_extension = tr(ext, 'y', 'h');
header_extension = tr(header_extension, 'Y', 'H');
}
/* Computes extensions from the given c source file extension. */
static void
compute_exts_from_src(const char *ext)
{
src_extension = xstrdup(ext);
header_extension = tr(ext, 'c', 'h');
header_extension = tr(header_extension, 'C', 'H');
}
/* FIXME: Should use xstrndup. */ /* FIXME: Should use xstrndup. */
@@ -167,6 +231,11 @@ compute_base_names (void)
{ {
size_t base_length; size_t base_length;
size_t short_base_length; size_t short_base_length;
size_t ext_index;
/* Set default extensions */
src_extension = ".c";
header_extension = ".h";
/* If --output=foo.c was specified (SPEC_OUTFILE == foo.c), /* If --output=foo.c was specified (SPEC_OUTFILE == foo.c),
BASE_NAME and SHORT_BASE_NAME are `foo'. BASE_NAME and SHORT_BASE_NAME are `foo'.
@@ -183,8 +252,18 @@ compute_base_names (void)
#endif /* MSDOS */ #endif /* MSDOS */
/* BASE_LENGTH includes ".tab" but not ".c". */ /* BASE_LENGTH includes ".tab" but not ".c". */
base_length = strlen (spec_outfile); base_length = strlen (spec_outfile);
if (strsuffix (spec_outfile, ".c"))
base_length -= 2; ext_index = get_extension_index (spec_outfile);
/* if the initial segment of extension contains 'c' or a 'C', I assume
that it is a C or C++ source file */
if (ext_index)
ext_index = (strspn(spec_outfile + ext_index + 1, "cC")) ? ext_index : 0;
if (ext_index)
{
base_length -= strlen (spec_outfile + ext_index);
compute_exts_from_src(spec_outfile + ext_index);
}
base_name = strndup (spec_outfile, base_length); base_name = strndup (spec_outfile, base_length);
/* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */ /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */
short_base_length = base_length; short_base_length = base_length;
@@ -205,7 +284,6 @@ compute_base_names (void)
strlwr (spec_file_prefix); strlwr (spec_file_prefix);
#endif /* MSDOS */ #endif /* MSDOS */
short_base_name = xstrdup (spec_file_prefix); short_base_name = xstrdup (spec_file_prefix);
base_name = XMALLOC (char, base_name = XMALLOC (char,
strlen (short_base_name) + strlen (EXT_TAB) + 1); strlen (short_base_name) + strlen (EXT_TAB) + 1);
stpcpy (stpcpy (base_name, short_base_name), EXT_TAB); stpcpy (stpcpy (base_name, short_base_name), EXT_TAB);
@@ -224,8 +302,18 @@ compute_base_names (void)
/* BASE_LENGTH gets length of BASE_NAME, sans ".y" suffix if any. */ /* BASE_LENGTH gets length of BASE_NAME, sans ".y" suffix if any. */
base_length = strlen (name_base); base_length = strlen (name_base);
if (strsuffix (name_base, ".y"))
base_length -= 2; ext_index = get_extension_index (name_base);
/* if the initial segment of extension contains a 'y' or a 'Y', I assume
that it is a yacc or bison grammar file */
if (ext_index)
ext_index = (strspn(name_base + ext_index + 1, "yY")) ? ext_index : 0;
if (ext_index)
{
base_length -= strlen (name_base + ext_index);
compute_exts_from_gf(name_base + ext_index);
}
short_base_length = base_length; short_base_length = base_length;
short_base_name = strndup (name_base, short_base_length); short_base_name = strndup (name_base, short_base_length);
@@ -268,17 +356,21 @@ output_files (void)
xfclose (finput); xfclose (finput);
compute_base_names (); compute_base_names ();
attrsfile = stringappend (short_base_name, EXT_STYPE_H); attrsfile = stringappend (short_base_name, EXT_STYPE_H);
#ifndef MSDOS
stringappend (attrsfile, header_extension);
#endif /* MSDOS */
/* Output the main file. */ /* Output the main file. */
if (spec_outfile) if (spec_outfile)
obstack_save (&table_obstack, spec_outfile); obstack_save (&table_obstack, spec_outfile);
else else
obstack_save (&table_obstack, stringappend (base_name, ".c")); obstack_save (&table_obstack, stringappend (base_name, src_extension));
/* Output the header file if wanted. */ /* Output the header file if wanted. */
if (defines_flag) if (defines_flag)
obstack_save (&defines_obstack, stringappend (base_name, ".h")); obstack_save (&defines_obstack, stringappend (base_name, header_extension));
/* If we output only the table, dump the actions in ACTFILE. */ /* If we output only the table, dump the actions in ACTFILE. */
if (no_parser_flag) if (no_parser_flag)
@@ -288,9 +380,14 @@ output_files (void)
into its own file, ATTTRSFILE. */ into its own file, ATTTRSFILE. */
if (semantic_parser) if (semantic_parser)
{ {
char *temp_name;
obstack_save (&attrs_obstack, attrsfile); obstack_save (&attrs_obstack, attrsfile);
obstack_save (&guard_obstack, temp_name = stringappend (short_base_name, EXT_GUARD_C);
stringappend (short_base_name, EXT_GUARD_C)); #ifndef MSDOS
temp_name = stringappend (temp_name, src_extension);
#endif /* MSDOS */
obstack_save (&guard_obstack, temp_name);
} }
if (verbose_flag) if (verbose_flag)

View File

@@ -209,8 +209,8 @@ do { \
/* VMS. */ /* VMS. */
# define EXT_TAB "_tab" # define EXT_TAB "_tab"
# define EXT_OUTPUT ".output" # define EXT_OUTPUT ".output"
# define EXT_STYPE_H "_stype.h" # define EXT_STYPE_H "_stype"
# define EXT_GUARD_C "_guard.c" # define EXT_GUARD_C "_guard"
#else /* ! VMS */ #else /* ! VMS */
# ifdef MSDOS # ifdef MSDOS
/* MS DOS. */ /* MS DOS. */
@@ -222,8 +222,8 @@ do { \
/* Standard. */ /* Standard. */
# define EXT_TAB ".tab" # define EXT_TAB ".tab"
# define EXT_OUTPUT ".output" # define EXT_OUTPUT ".output"
# define EXT_STYPE_H ".stype.h" # define EXT_STYPE_H ".stype"
# define EXT_GUARD_C ".guard.c" # define EXT_GUARD_C ".guard"
# endif /* ! MSDOS */ # endif /* ! MSDOS */
#endif /* ! VMS */ #endif /* ! VMS */