[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
FYI: master: examples: shorten the name of the calc++ files
From: |
Akim Demaille |
Subject: |
FYI: master: examples: shorten the name of the calc++ files |
Date: |
Thu, 23 Aug 2018 13:37:39 +0200 |
I’m installing this, so that the directory of the example
is nicer to browse.
commit db8345289d92bc43865fdd3fe91cc5bfb8a96329
Author: Akim Demaille <address@hidden>
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.
address@hidden file: calc++-driver.hh
address@hidden 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.
address@hidden file: calc++-driver.hh
address@hidden 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.
address@hidden file: calc++-driver.hh
address@hidden 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.
address@hidden file: calc++-driver.hh
address@hidden 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.
address@hidden file: calc++-driver.hh
address@hidden 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.
address@hidden file: calc++-driver.hh
address@hidden 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.
address@hidden file: calc++-driver.cc
address@hidden 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.
address@hidden file: calc++-parser.yy
address@hidden 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}.
address@hidden file: calc++-parser.yy
address@hidden 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}.
address@hidden file: calc++-parser.yy
address@hidden 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.
address@hidden file: calc++-parser.yy
address@hidden 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.
address@hidden file: calc++-parser.yy
address@hidden 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}).
address@hidden file: calc++-parser.yy
address@hidden 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 @address@hidden is output in the
@file{*.cc} file; it needs detailed knowledge about the driver.
address@hidden file: calc++-parser.yy
address@hidden 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}).
address@hidden file: calc++-parser.yy
address@hidden file: calc++/parser.yy
@example
%define api.token.prefix @address@hidden
%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.
address@hidden file: calc++-parser.yy
address@hidden 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}).
address@hidden file: calc++-parser.yy
address@hidden 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}}).
address@hidden file: calc++-parser.yy
address@hidden file: calc++/parser.yy
@example
%%
%start unit;
@@ -11431,7 +11429,7 @@ exp:
Finally the @code{error} member function registers the errors to the
driver.
address@hidden file: calc++-parser.yy
address@hidden 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.
address@hidden file: calc++-scanner.ll
address@hidden file: calc++/scanner.ll
@example
address@hidden /* -*- 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.
address@hidden file: calc++-scanner.ll
address@hidden 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.
address@hidden file: calc++-scanner.ll
address@hidden 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.
address@hidden file: calc++-scanner.ll
address@hidden file: calc++/scanner.ll
@example
@group
address@hidden
@@ -11527,7 +11525,7 @@ preceding tokens. Comments would be treated equally.
@noindent
The rules are simple. The driver is used to report errors.
address@hidden file: calc++-scanner.ll
address@hidden 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.
address@hidden file: calc++-scanner.ll
address@hidden 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 address@hidden $@
-$(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 '--')
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- FYI: master: examples: shorten the name of the calc++ files,
Akim Demaille <=