I’m installing this, so that the directory of the example
is nicer to browse.

commit db8345289d92bc43865fdd3fe91cc5bfb8a96329
Author: Akim Demaille <[email protected]>
Date:   Thu Aug 23 08:42:00 2018 +0200

    examples: shorten the name of the calc++ files
    
    * doc/bison.texi: Turn the calc++- prefix into calc++/.
    * examples/extexi (%file_wanted): Replace with
    (&file_wanted): this.
    * examples/calc++/local.mk: Adjust.

diff --git a/doc/bison.texi b/doc/bison.texi
index 9eff2886..14389147 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -11113,18 +11113,17 @@ the file for parsing, instantiate the parser etc.), 
we recommend
 transforming the simple parsing context structure into a fully blown
 @dfn{parsing driver} class.
 
-The declaration of this driver class, @file{calc++-driver.hh}, is as
-follows.  The first part includes the CPP guard and imports the
-required standard library components, and the declaration of the parser
-class.
+The declaration of this driver class, in @file{driver.hh}, is as follows.  The
+first part includes the CPP guard and imports the required standard library
+components, and the declaration of the parser class.
 
-@comment file: calc++-driver.hh
+@comment file: calc++/driver.hh
 @example
-#ifndef CALCXX_DRIVER_HH
-# define CALCXX_DRIVER_HH
+#ifndef DRIVER_HH
+# define DRIVER_HH
 # include <string>
 # include <map>
-# include "calc++-parser.hh"
+# include "parser.hh"
 @end example
 
 
@@ -11134,7 +11133,7 @@ the signature of @code{yylex} to be defined in the macro
 @code{YY_DECL}, and the C++ parser expects it to be declared.  We can
 factor both as follows.
 
-@comment file: calc++-driver.hh
+@comment file: calc++/driver.hh
 @example
 // Tell Flex the lexer's prototype ...
 # define YY_DECL \
@@ -11147,7 +11146,7 @@ YY_DECL;
 The @code{calcxx_driver} class is then declared with its most obvious
 members.
 
-@comment file: calc++-driver.hh
+@comment file: calc++/driver.hh
 @example
 // Conducting the whole scanning and parsing of Calc++.
 class calcxx_driver
@@ -11165,7 +11164,7 @@ public:
 To encapsulate the coordination with the Flex scanner, it is useful to have
 member functions to open and close the scanning phase.
 
-@comment file: calc++-driver.hh
+@comment file: calc++/driver.hh
 @example
   // Handling the scanner.
   void scan_begin ();
@@ -11176,7 +11175,7 @@ member functions to open and close the scanning phase.
 @noindent
 Similarly for the parser itself.
 
-@comment file: calc++-driver.hh
+@comment file: calc++/driver.hh
 @example
   // Run the parser on file F.
   // Return 0 on success.
@@ -11194,13 +11193,13 @@ dumping them on the standard error output, we will 
pass them to the
 compiler driver using the following two member functions.  Finally, we
 close the class declaration and CPP guard.
 
-@comment file: calc++-driver.hh
+@comment file: calc++/driver.hh
 @example
   // Error handling.
   void error (const yy::location& l, const std::string& m);
   void error (const std::string& m);
 @};
-#endif // ! CALCXX_DRIVER_HH
+#endif // ! DRIVER_HH
 @end example
 
 The implementation of the driver is straightforward.  The @code{parse}
@@ -11208,10 +11207,10 @@ member function deserves some attention.  The 
@code{error} functions
 are simple stubs, they should actually register the located error
 messages and set error state.
 
-@comment file: calc++-driver.cc
+@comment file: calc++/driver.cc
 @example
-#include "calc++-driver.hh"
-#include "calc++-parser.hh"
+#include "driver.hh"
+#include "parser.hh"
 
 calcxx_driver::calcxx_driver ()
   : trace_scanning (false), trace_parsing (false)
@@ -11252,13 +11251,12 @@ calcxx_driver::error (const std::string& m)
 @node Calc++ Parser
 @subsubsection Calc++ Parser
 
-The grammar file @file{calc++-parser.yy} starts by asking for the C++
-deterministic parser skeleton, the creation of the parser header file,
-and specifies the name of the parser class.  Because the C++ skeleton
-changed several times, it is safer to require the version you designed
-the grammar for.
+The grammar file @file{parser.yy} starts by asking for the C++ deterministic
+parser skeleton, the creation of the parser header file, and specifies the
+name of the parser class.  Because the C++ skeleton changed several times,
+it is safer to require the version you designed the grammar for.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %skeleton "lalr1.cc" /* -*- C++ -*- */
 %require "@value{VERSION}"
@@ -11274,7 +11272,7 @@ require the variant-based interface.  To make sure we 
properly use it, we
 enable assertions.  To fully benefit from type-safety and more natural
 definition of ``symbol'', we enable @code{api.token.constructor}.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %define api.token.constructor
 %define api.value.type variant
@@ -11291,7 +11289,7 @@ driver's header needs detailed knowledge about the 
parser class (in
 particular its inner types), it is the parser's header which will use a
 forward declaration of the driver.  @xref{%code Summary}.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %code requires
 @{
@@ -11305,7 +11303,7 @@ The driver is passed by reference to the parser and to 
the scanner.
 This provides a simple but effective pure interface, not relying on
 global variables.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 // The parsing context.
 %param @{ calcxx_driver& driver @}
@@ -11317,7 +11315,7 @@ first location's file name.  Afterward new locations 
are computed
 relatively to the previous locations: the file name will be
 propagated.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %locations
 %initial-action
@@ -11332,7 +11330,7 @@ Use the following two directives to enable parser 
tracing and verbose error
 messages.  However, verbose error messages can contain incorrect information
 (@pxref{LAC}).
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %define parse.trace
 %define parse.error verbose
@@ -11343,11 +11341,11 @@ messages.  However, verbose error messages can 
contain incorrect information
 The code between @samp{%code @{} and @samp{@}} is output in the
 @file{*.cc} file; it needs detailed knowledge about the driver.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %code
 @{
-# include "calc++-driver.hh"
+# include "driver.hh"
 @}
 @end example
 
@@ -11359,7 +11357,7 @@ allows for nicer error messages referring to ``end of 
file'' instead of
 avoid name clashes in the generated files (@pxref{Calc++ Scanner}), prefix
 tokens with @code{TOK_} (@pxref{%define Summary,,api.token.prefix}).
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %define api.token.prefix @{TOK_@}
 %token
@@ -11379,7 +11377,7 @@ Since we use variant-based semantic values, 
@code{%union} is not used, and
 both @code{%type} and @code{%token} expect genuine types, as opposed to type
 tags.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %token <std::string> IDENTIFIER "identifier"
 %token <int> NUMBER "number"
@@ -11392,7 +11390,7 @@ recovery; the memory, for strings for instance, will be 
reclaimed by the
 regular destructors.  All the values are printed using their
 @code{operator<<} (@pxref{Printer Decl, , Printing Semantic Values}).
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %printer @{ yyoutput << $$; @} <*>;
 @end example
@@ -11401,7 +11399,7 @@ regular destructors.  All the values are printed using 
their
 The grammar itself is straightforward (@pxref{Location Tracking Calc, ,
 Location Tracking Calculator - @code{ltcalc}}).
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 %%
 %start unit;
@@ -11431,7 +11429,7 @@ exp:
 Finally the @code{error} member function registers the errors to the
 driver.
 
-@comment file: calc++-parser.yy
+@comment file: calc++/parser.yy
 @example
 void
 yy::calcxx_parser::error (const location_type& l,
@@ -11447,15 +11445,15 @@ yy::calcxx_parser::error (const location_type& l,
 The Flex scanner first includes the driver declaration, then the
 parser's to get the set of defined tokens.
 
-@comment file: calc++-scanner.ll
+@comment file: calc++/scanner.ll
 @example
 %@{ /* -*- C++ -*- */
 # include <cerrno>
 # include <climits>
 # include <cstdlib>
 # include <string>
-# include "calc++-driver.hh"
-# include "calc++-parser.hh"
+# include "driver.hh"
+# include "parser.hh"
 
 // Work around an incompatibility in flex (at least versions
 // 2.5.31 through 2.5.33): it generates code that does
@@ -11481,7 +11479,7 @@ Because there is no @code{#include}-like feature we 
don't need
 actual file, this is not an interactive session with the user.
 Finally, we enable scanner tracing.
 
-@comment file: calc++-scanner.ll
+@comment file: calc++/scanner.ll
 @example
 %option noyywrap nounput batch debug noinput
 @end example
@@ -11489,7 +11487,7 @@ Finally, we enable scanner tracing.
 @noindent
 Abbreviations allow for more readable rules.
 
-@comment file: calc++-scanner.ll
+@comment file: calc++/scanner.ll
 @example
 id    [a-zA-Z][a-zA-Z_0-9]*
 int   [0-9]+
@@ -11505,7 +11503,7 @@ cursor is adjusted, and each time blanks are matched, 
the begin cursor
 is moved onto the end cursor to effectively ignore the blanks
 preceding tokens.  Comments would be treated equally.
 
-@comment file: calc++-scanner.ll
+@comment file: calc++/scanner.ll
 @example
 @group
 %@{
@@ -11527,7 +11525,7 @@ preceding tokens.  Comments would be treated equally.
 @noindent
 The rules are simple.  The driver is used to report errors.
 
-@comment file: calc++-scanner.ll
+@comment file: calc++/scanner.ll
 @example
 "-"      return yy::calcxx_parser::make_MINUS  (loc);
 "+"      return yy::calcxx_parser::make_PLUS   (loc);
@@ -11556,7 +11554,7 @@ The rules are simple.  The driver is used to report 
errors.
 Finally, because the scanner-related driver's member-functions depend
 on the scanner's data, it is simpler to implement them in this file.
 
-@comment file: calc++-scanner.ll
+@comment file: calc++/scanner.ll
 @example
 @group
 void
@@ -11590,7 +11588,7 @@ The top level file, @file{calc++.cc}, poses no problem.
 @comment file: calc++.cc
 @example
 #include <iostream>
-#include "calc++-driver.hh"
+#include "driver.hh"
 
 @group
 int
diff --git a/examples/calc++/.gitignore b/examples/calc++/.gitignore
index 50eb5ba1..9c74fd08 100644
--- a/examples/calc++/.gitignore
+++ b/examples/calc++/.gitignore
@@ -2,18 +2,18 @@
 /*.tmp
 /.deps
 /calc++
-/calc++-driver.cc
-/calc++-driver.hh
-/calc++-parser.cc
-/calc++-parser.hh
-/calc++-parser.output
-/calc++-parser.stamp
-/calc++-parser.yy
-/calc++-scanner.cc
-/calc++-scanner.ll
 /calc++.cc
 /calc++.exe
 /calc.stamp
+/driver.cc
+/driver.hh
 /location.hh
+/parser.cc
+/parser.hh
+/parser.output
+/parser.stamp
+/parser.yy
 /position.hh
+/scanner.cc
+/scanner.ll
 /stack.hh
diff --git a/examples/calc++/local.mk b/examples/calc++/local.mk
index 53c6834b..06c1ed67 100644
--- a/examples/calc++/local.mk
+++ b/examples/calc++/local.mk
@@ -20,7 +20,7 @@
 
 # Don't depend on $(BISON) otherwise we would rebuild these files
 # in srcdir, including during distcheck, which is forbidden.
-%D%/calc++-parser.stamp: $(BISON_IN)
+%D%/parser.stamp: $(BISON_IN)
 SUFFIXES += .yy .stamp
 .yy.stamp:
        $(AM_V_YACC)rm -f $@
@@ -28,14 +28,14 @@ SUFFIXES += .yy .stamp
        $(AM_V_at)$(YACCCOMPILE) -o $*.cc $<
        $(AM_V_at)mv -f [email protected] $@
 
-$(calcxx_sources_generated): %D%/calc++-parser.stamp
-       @test -f $@ || rm -f %D%/calc++-parser.stamp
-       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/calc++-parser.stamp
-CLEANFILES +=                                   \
-  $(calcxx_sources_generated)                   \
-  %D%/calc++-parser.output                      \
-  %D%/calc++-parser.stamp                       \
-  %D%/calc++-scanner.cc
+$(calcxx_sources_generated): %D%/parser.stamp
+       @test -f $@ || rm -f %D%/parser.stamp
+       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/parser.stamp
+CLEANFILES +=                                  \
+  $(calcxx_sources_generated)                  \
+  %D%/parser.output                            \
+  %D%/parser.stamp                             \
+  %D%/scanner.cc
 
 
 ## -------------------- ##
@@ -45,18 +45,18 @@ CLEANFILES +=                                   \
 # Avoid using BUILT_SOURCES which is too global.
 $(%C%_calc___OBJECTS): $(calcxx_sources_generated)
 
-calcxx_sources_extracted =                      \
-  %D%/calc++-driver.cc                          \
-  %D%/calc++-driver.hh                          \
-  %D%/calc++-scanner.ll                         \
+calcxx_sources_extracted =                     \
+  %D%/driver.cc                                        \
+  %D%/driver.hh                                        \
+  %D%/scanner.ll                               \
   %D%/calc++.cc
 calcxx_extracted =                              \
   $(calcxx_sources_extracted)                   \
-  %D%/calc++-parser.yy
+  %D%/parser.yy
 extracted += $(calcxx_extracted)
 calcxx_sources_generated =                      \
-  %D%/calc++-parser.cc                          \
-  %D%/calc++-parser.hh                          \
+  %D%/parser.cc                                 \
+  %D%/parser.hh                                 \
   %D%/location.hh                               \
   %D%/position.hh                               \
   %D%/stack.hh
diff --git a/examples/calc++/y.tab.h b/examples/calc++/y.tab.h
deleted file mode 100644
index 798b670e..00000000
--- a/examples/calc++/y.tab.h
+++ /dev/null
@@ -1,6 +0,0 @@
-// Work around an Automake 1.11.2 bug: it asks for the creation of
-// y.tab.c and y.tab.h and then renames them as calc++-parser.cc and
-// calc++-parser.h, but in the former it does not convert the
-// #include "y.tab.h".  We don't want this to show in the
-// documentation.
-#include "calc++-parser.hh"
diff --git a/examples/extexi b/examples/extexi
index 95c6c395..f7157c07 100755
--- a/examples/extexi
+++ b/examples/extexi
@@ -65,8 +65,21 @@ sub message($)
     }
 }
 
-# basename => full file name for files we should extract.
-my %file_wanted;
+# The list of files we should extract.
+my @file_wanted;
+
+# Whether we should extract that file, and then under which path.
+sub file_wanted ($)
+{
+  my ($f) = @_;
+  for my $file (@file_wanted)
+    {
+      # No endswith in Perl 5...
+      return $file if $f eq substr($file, -length($f));
+    }
+  undef
+}
+
 
 sub process ($)
 {
@@ -89,9 +102,9 @@ sub process ($)
         {
           my $f = $1;
           $block = $2 || 1;
-          if ($file_wanted{$f})
+          if (file_wanted($f))
             {
-              $file = $file_wanted{$f};
+              $file = file_wanted($f);
               message(" GEN $file");
             }
           else
@@ -142,8 +155,7 @@ for my $arg (@ARGV)
 {
   if ($seen_dash)
     {
-      use File::Basename;
-      $file_wanted{basename($arg)} = $arg;
+      push @file_wanted, $arg;
     }
   elsif ($arg eq '--')
     {


Reply via email to