bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] bench.pl: a command line interface


From: Akim Demaille
Subject: [PATCH] bench.pl: a command line interface
Date: Mon, 03 Nov 2008 21:00:44 -0000

        * etc/bench.pl.in: More doc.
        Some fixes in the documentation.
        ($cflags, $iterations, &help, &getopt): New.
        Use them.
        (&variant_grammar): Let the number of stages be 10 times what is
        specified.
---
 ChangeLog       |   10 ++++++++
 etc/bench.pl.in |   65 +++++++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5a08e8e..ba32852 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2008-11-03  Akim Demaille  <address@hidden>
 
+       bench.pl: a command line interface
+       * etc/bench.pl.in: More doc.
+       Some fixes in the documentation.
+       ($cflags, $iterations, &help, &getopt): New.
+       Use them.
+       (&variant_grammar): Let the number of stages be 10 times what is
+       specified.
+
+2008-11-03  Akim Demaille  <address@hidden>
+
        Bench the use of Boost.Variants.
        * etc/bench.pl.in ($cxx, &variant_grammar, &bench_variant_parser):
        New.
diff --git a/etc/bench.pl.in b/etc/bench.pl.in
index c7690bd..041bc3f 100755
--- a/etc/bench.pl.in
+++ b/etc/bench.pl.in
@@ -25,6 +25,20 @@ bench.pl - perform benches on Bison parsers.
 
   ./bench.pl
 
+=head1 OPTIONS
+
+=item B<-c>, B<--cflags>=I<flags>
+
+Flags to pass to the C or C++ compiler.
+
+=item B<-i>, B<--iterations>=I<integer>
+
+Say how many times a single test of the bench must be run.
+
+=item B<-v>, B<--verbose>
+
+Raise the verbosity level.  Currently only affects B<--help>.
+
 =cut
 
 use IO::File;
@@ -33,9 +47,15 @@ use Benchmark qw (:all);
 my $bison = $ENV{'BISON'} || '@abs_top_builddir@/tests/bison';
 my $cc = $ENV{'CC'} || 'gcc';
 my $cxx = $ENV{'CXX'} || 'g++';
+# Compiler flags (C or C++).
+my $cflags = '';
+# The number of times the parser is run for a bench.
+my $iterations = 50;
 
 ##################################################################
 
+=head1 DESCRIPTIONS
+
 =head2 Functions
 
 =over 4
@@ -81,7 +101,7 @@ Create a large triangular grammar which looks like :
   | "1" "2" "3" "4" "5"  END    { $$ = 5; }
   ;
 
-C<$base> is the base name for the file to create (C<$base.y>).
+C<$base> is the base name for the file to create (F<$base.y>).
 C<$max> is the number of such rules (here, 5).  You may pass
 additional Bison C<@directives>.
 
@@ -180,7 +200,7 @@ EOF
 
 =item C<calc_input ($base, $max)>
 
-Generate the input file C<$base.input> for the calc parser.  The input
+Generate the input file F<$base.input> for the calc parser.  The input
 is composed of two expressions.  The first one is using left recursion
 only and consumes no stack.  The second one requires a deep stack.
 These two expressions are repeated C<$max> times in the output file.
@@ -202,7 +222,7 @@ sub calc_input ($$)
 ##################################################################
 =item C<calc_grammar ($base, $max, @directives)>
 
-Generate a Bison file C<$base.y> for a calculator parser in C.  Pass
+Generate a Bison file F<$base.y> for a calculator parser in C.  Pass
 the additional Bison C<@directives>.  C<$max> is ignored, but left to
 have the same interface as C<triangular_grammar>.
 
@@ -412,7 +432,7 @@ EOF
 
 =item C<variant_grammar ($base, $max, @directives)>
 
-Generate a Bison file C<$base.y> that uses, or not, the Boost.Variants
+Generate a Bison file F<$base.y> that uses, or not, the Boost.Variants
 depending on the C<@directives>.
 
 =cut
@@ -444,7 +464,7 @@ sub variant_grammar ($$$)
 // Prototype of the yylex function providing subsequent tokens.
 static yy::parser::token_type yylex(yy::parser::semantic_type* yylval);
 
-#define STAGE_MAX    $max
+#define STAGE_MAX    ($max * 10)
 #define USE_VARIANTS $variant
 #if USE_VARIANTS
 # define IF_VARIANTS(True, False) True
@@ -571,7 +591,7 @@ sub compile ($)
 
   system ("$bison $base.y -o $base.c") == 0
     or die;
-  system ("$compiler -o $base -O3 -I /opt/local/include $base.c") == 0
+  system ("$compiler -o $base $cflags $base.c") == 0
     or die;
 }
 
@@ -580,7 +600,7 @@ sub compile ($)
 Generate benches for C<$gram>.  C<$gram> should be C<calc> or
 C<triangle>.  C<%bench> is a hash of the form:
 
-  C<$name> => C<@directives>
+  $name => @directives
 
 where C<$name> is the name of the bench, and C<@directives> are the
 Bison directive to use for this bench.  All the benches are compared
@@ -606,7 +626,7 @@ sub bench_grammar ($%)
 
   print "$gram:\n";
   # Run the benches.
-  my $res = timethese (50, \%bench, 'nop');
+  my $res = timethese ($iterations, \%bench, 'nop');
   # Output the result.
   cmpthese ($res, 'nop');
 }
@@ -652,7 +672,34 @@ sub bench_variant_parser ()
 
 ############################################################################
 
-print STDERR "Using bison=$bison, cc=$cc, cxx=$cxx.\n";
+sub help ($)
+{
+  my ($verbose) = @_;
+  use Pod::Usage;
+  # See <URL:http://perldoc.perl.org/pod2man.html#NOTES>.
+  pod2usage( { -message => "Bench Bison parsers",
+               -exitval => 0,
+               -verbose => $verbose,
+               -output  => \*STDOUT });
+}
+
+sub getopt ()
+{
+  use Getopt::Long;
+  my $verbose = 0;
+  %option = ("h|help"     => sub { help ($verbose) },
+            "v|verbose"  => sub { ++$verbose },
+             "c|cflags=s" => \$cflags,
+             "i|iterations=i" => \$iterations);
+  Getopt::Long::Configure ("bundling", "pass_through");
+  GetOptions (%option)
+    or exit 1;
+}
+
+######################################################################
+
+getopt;
+print STDERR "Using bison=$bison, cc=$cc, cxx=$cxx, cflags=$cflags.\n";
 # bench_push_parser();
 bench_variant_parser();
 
-- 
1.6.0.2.588.g3102





reply via email to

[Prev in Thread] Current Thread [Next in Thread]