From 234a3be30308bdf67bda1fe67fce08f3cc55e749 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 1 Aug 2001 18:08:48 +0000 Subject: [PATCH 1/1] * 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. --- ChangeLog | 18 +++++++ NEWS | 2 + doc/bison.1 | 15 ++++-- doc/bison.info | 134 +++++++++++++++++++++++----------------------- doc/bison.info-2 | 2 +- doc/bison.info-4 | 15 +++++- doc/bison.texinfo | 22 +++++++- doc/stamp-vti | 2 +- doc/version.texi | 2 +- src/files.c | 121 ++++++++++++++++++++++++++++++++++++----- src/system.h | 8 +-- 11 files changed, 250 insertions(+), 91 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b5e1b4d..8b8df992 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2001-08-01 Marc Autret + + * 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 * doc/autoconf.texi: Document @$. diff --git a/NEWS b/NEWS index 2a9937d1..787b41eb 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ Bison News Changes in version 1.28a: +* the input and the output files has automatically a similar extension. + * Russian translation added. * NLS support updated; should hopefully be less troublesome. diff --git a/doc/bison.1 b/doc/bison.1 index 0357819c..ebcd396c 100644 --- a/doc/bison.1 +++ b/doc/bison.1 @@ -71,13 +71,22 @@ Unlike .IR yacc , the generated files do not have fixed names, but instead use the prefix 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 -.B parse.y +.B parse.yxx would produce the generated parser in a file named -.BR parse.tab.c , +.BR parse.tab.cxx , instead of .IR yacc 's -.BR y.tab.c . +.BR y.tab.c +or old +.IR Bison +versions +.BR parse.tab.c . .PP This description of the options that can be given to .I bison diff --git a/doc/bison.info b/doc/bison.info index 55197427..246ad6c7 100644 --- a/doc/bison.info +++ b/doc/bison.info @@ -32,9 +32,9 @@ instead of in the original English. Indirect: bison.info-1: 1307 bison.info-2: 50189 -bison.info-3: 99779 -bison.info-4: 149657 -bison.info-5: 196400 +bison.info-3: 99814 +bison.info-4: 149692 +bison.info-5: 196961  Tag Table: (Indirect) @@ -71,69 +71,69 @@ Node: Mfcalc Rules72281 Node: Mfcalc Symtab73661 Node: Exercises80034 Node: Grammar File80540 -Node: Grammar Outline81353 -Node: C Declarations82087 -Node: Bison Declarations82667 -Node: Grammar Rules83079 -Node: C Code83539 -Node: Symbols84469 -Node: Rules89550 -Node: Recursion91189 -Node: Semantics92908 -Node: Value Type94002 -Node: Multiple Types94674 -Node: Actions95691 -Node: Action Types98476 -Node: Mid-Rule Actions99779 -Node: Locations105348 -Node: Location Type106013 -Node: Actions and Locations106571 -Node: Location Default Action107735 -Node: Declarations108942 -Node: Token Decl110261 -Node: Precedence Decl112274 -Node: Union Decl113825 -Node: Type Decl114669 -Node: Expect Decl115575 -Node: Start Decl117121 -Node: Pure Decl117499 -Node: Decl Summary119176 -Node: Multiple Parsers124559 -Node: Interface126053 -Node: Parser Function126925 -Node: Lexical127760 -Node: Calling Convention129166 -Node: Token Values131937 -Node: Token Positions133086 -Node: Pure Calling133971 -Node: Error Reporting136903 -Node: Action Features139025 -Node: Algorithm142320 -Node: Look-Ahead144613 -Node: Shift/Reduce146745 -Node: Precedence149657 -Node: Why Precedence150308 -Node: Using Precedence152173 -Node: Precedence Examples153141 -Node: How Precedence153842 -Node: Contextual Precedence154991 -Node: Parser States156782 -Node: Reduce/Reduce158025 -Node: Mystery Conflicts161586 -Node: Stack Overflow164972 -Node: Error Recovery166345 -Node: Context Dependency171481 -Node: Semantic Tokens172329 -Node: Lexical Tie-ins175346 -Node: Tie-in Recovery176894 -Node: Debugging179066 -Node: Invocation182367 -Node: Bison Options183097 -Node: Environment Variables186531 -Node: Option Cross Key187379 -Node: VMS Invocation188223 -Node: Table of Symbols189007 -Node: Glossary196400 -Node: Index202690 +Node: Grammar Outline81388 +Node: C Declarations82122 +Node: Bison Declarations82702 +Node: Grammar Rules83114 +Node: C Code83574 +Node: Symbols84504 +Node: Rules89585 +Node: Recursion91224 +Node: Semantics92943 +Node: Value Type94037 +Node: Multiple Types94709 +Node: Actions95726 +Node: Action Types98511 +Node: Mid-Rule Actions99814 +Node: Locations105383 +Node: Location Type106048 +Node: Actions and Locations106606 +Node: Location Default Action107770 +Node: Declarations108977 +Node: Token Decl110296 +Node: Precedence Decl112309 +Node: Union Decl113860 +Node: Type Decl114704 +Node: Expect Decl115610 +Node: Start Decl117156 +Node: Pure Decl117534 +Node: Decl Summary119211 +Node: Multiple Parsers124594 +Node: Interface126088 +Node: Parser Function126960 +Node: Lexical127795 +Node: Calling Convention129201 +Node: Token Values131972 +Node: Token Positions133121 +Node: Pure Calling134006 +Node: Error Reporting136938 +Node: Action Features139060 +Node: Algorithm142355 +Node: Look-Ahead144648 +Node: Shift/Reduce146780 +Node: Precedence149692 +Node: Why Precedence150343 +Node: Using Precedence152208 +Node: Precedence Examples153176 +Node: How Precedence153877 +Node: Contextual Precedence155026 +Node: Parser States156817 +Node: Reduce/Reduce158060 +Node: Mystery Conflicts161621 +Node: Stack Overflow165007 +Node: Error Recovery166380 +Node: Context Dependency171516 +Node: Semantic Tokens172364 +Node: Lexical Tie-ins175381 +Node: Tie-in Recovery176929 +Node: Debugging179101 +Node: Invocation182402 +Node: Bison Options183658 +Node: Environment Variables187092 +Node: Option Cross Key187940 +Node: VMS Invocation188784 +Node: Table of Symbols189568 +Node: Glossary196961 +Node: Index203251  End Tag Table diff --git a/doc/bison.info-2 b/doc/bison.info-2 index 09c68fd7..2cf29fce 100644 --- a/doc/bison.info-2 +++ b/doc/bison.info-2 @@ -903,7 +903,7 @@ produces a C-language function that recognizes correct instances of the grammar. The Bison grammar input file conventionally has a name ending in -`.y'. +`.y'. *Note Invoking Bison: Invocation. * Menu: diff --git a/doc/bison.info-4 b/doc/bison.info-4 index 644b95a3..ad510ac3 100644 --- a/doc/bison.info-4 +++ b/doc/bison.info-4 @@ -857,7 +857,20 @@ Invoking Bison 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'. 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: diff --git a/doc/bison.texinfo b/doc/bison.texinfo index f3ec3932..68b24c41 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -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. The Bison grammar input file conventionally has a name ending in @samp{.y}. +@xref{Invocation, ,Invoking Bison}. @menu * 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} 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{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 * Bison Options:: All the options described in detail, diff --git a/doc/stamp-vti b/doc/stamp-vti index 5f4eeb40..c82abc34 100644 --- a/doc/stamp-vti +++ b/doc/stamp-vti @@ -1,3 +1,3 @@ -@set UPDATED 30 July 2001 +@set UPDATED 1 August 2001 @set EDITION 1.28a @set VERSION 1.28a diff --git a/doc/version.texi b/doc/version.texi index 5f4eeb40..c82abc34 100644 --- a/doc/version.texi +++ b/doc/version.texi @@ -1,3 +1,3 @@ -@set UPDATED 30 July 2001 +@set UPDATED 1 August 2001 @set EDITION 1.28a @set VERSION 1.28a diff --git a/src/files.c b/src/files.c index eefa188d..8ecb1f9f 100644 --- a/src/files.c +++ b/src/files.c @@ -45,6 +45,11 @@ char *attrsfile; static char *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? | @@ -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. */ @@ -167,6 +231,11 @@ compute_base_names (void) { size_t 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), BASE_NAME and SHORT_BASE_NAME are `foo'. @@ -183,8 +252,18 @@ compute_base_names (void) #endif /* MSDOS */ /* BASE_LENGTH includes ".tab" but not ".c". */ 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); /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */ short_base_length = base_length; @@ -205,7 +284,6 @@ compute_base_names (void) strlwr (spec_file_prefix); #endif /* MSDOS */ short_base_name = xstrdup (spec_file_prefix); - base_name = XMALLOC (char, strlen (short_base_name) + strlen (EXT_TAB) + 1); 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 = 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_name = strndup (name_base, short_base_length); @@ -268,17 +356,21 @@ output_files (void) xfclose (finput); compute_base_names (); + attrsfile = stringappend (short_base_name, EXT_STYPE_H); +#ifndef MSDOS + stringappend (attrsfile, header_extension); +#endif /* MSDOS */ /* Output the main file. */ if (spec_outfile) obstack_save (&table_obstack, spec_outfile); else - obstack_save (&table_obstack, stringappend (base_name, ".c")); + obstack_save (&table_obstack, stringappend (base_name, src_extension)); /* Output the header file if wanted. */ 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 (no_parser_flag) @@ -288,9 +380,14 @@ output_files (void) into its own file, ATTTRSFILE. */ if (semantic_parser) { + char *temp_name; + obstack_save (&attrs_obstack, attrsfile); - obstack_save (&guard_obstack, - stringappend (short_base_name, EXT_GUARD_C)); + temp_name = 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) diff --git a/src/system.h b/src/system.h index c6f77dae..83e2b0a5 100644 --- a/src/system.h +++ b/src/system.h @@ -209,8 +209,8 @@ do { \ /* VMS. */ # define EXT_TAB "_tab" # define EXT_OUTPUT ".output" -# define EXT_STYPE_H "_stype.h" -# define EXT_GUARD_C "_guard.c" +# define EXT_STYPE_H "_stype" +# define EXT_GUARD_C "_guard" #else /* ! VMS */ # ifdef MSDOS /* MS DOS. */ @@ -222,8 +222,8 @@ do { \ /* Standard. */ # define EXT_TAB ".tab" # define EXT_OUTPUT ".output" -# define EXT_STYPE_H ".stype.h" -# define EXT_GUARD_C ".guard.c" +# define EXT_STYPE_H ".stype" +# define EXT_GUARD_C ".guard" # endif /* ! MSDOS */ #endif /* ! VMS */ -- 2.45.2