bison-patches
[Top][All Lists]
Advanced

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

[PATCH] bench.pl: Pass directives as a list instead of as a string.


From: Akim Demaille
Subject: [PATCH] bench.pl: Pass directives as a list instead of as a string.
Date: Mon, 03 Nov 2008 21:00:37 -0000

        * etc/bench.pl.in (&directives): New.
        (&triangular_grammar, &calc_grammar): Use it to format the Bison
        directives.
        (&triangular_grammar): Do use the directives (were ignored).
        (&bench_grammar, &bench_push_parser): Adjust to pass lists of
        directives.
---
 ChangeLog       |   10 ++++++++++
 etc/bench.pl.in |   46 ++++++++++++++++++++++++++++++++--------------
 2 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c15a154..4c282e7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2008-11-03  Akim Demaille  <address@hidden>
 
+       bench.pl: Pass directives as a list instead of as a string.
+       * etc/bench.pl.in (&directives): New.
+       (&triangular_grammar, &calc_grammar): Use it to format the Bison
+       directives.
+       (&triangular_grammar): Do use the directives (were ignored).
+       (&bench_grammar, &bench_push_parser): Adjust to pass lists of
+       directives.
+
+2008-11-03  Akim Demaille  <address@hidden>
+
        Improve genericity of bench.pl.
        * etc/bench.pl.in (&bench_grammar): Take the set of benches as
        argument.
diff --git a/etc/bench.pl.in b/etc/bench.pl.in
index 87bb53b..804d4c8 100755
--- a/etc/bench.pl.in
+++ b/etc/bench.pl.in
@@ -39,7 +39,22 @@ my $cc = $ENV{'CC'} || 'gcc';
 
 =over 4
 
-=item C<triangular_grammar ($base, $max, $directives)>
+=item C<directives($bench, @directive)>
+
+Format the list of directives for Bison for bench named C<$bench>.
+
+=cut
+
+sub directives($@)
+{
+  my ($bench, @directives) = @_;
+  my $res = "/* Directives for bench `$bench'. */\n";
+  $res .= join ("\n", @directives);
+  $res .= "/* End of directives for bench `$bench'. */\n";
+  return $res;
+}
+
+=item C<triangular_grammar ($base, $max, @directives)>
 
 Create a large triangular grammar which looks like :
 
@@ -59,7 +74,7 @@ Create a large triangular grammar which looks like :
 
 C<$base> is the base name for the file to create (C<$base.y>).
 C<$max> is the number of such rules (here, 5).  You may pass
-additional Bison C<$directives>.
+additional Bison C<@directives>.
 
 The created parser is self contained: it includes its scanner, and
 source of input.
@@ -67,7 +82,8 @@ source of input.
 
 sub triangular_grammar ($$$)
 {
-  my ($base, $max, $directives) = @_;
+  my ($base, $max, @directives) = @_;
+  my $directives = directives ($base, @directives);
 
   my $out = new IO::File ">$base.y"
     or die;
@@ -81,6 +97,7 @@ sub triangular_grammar ($$$)
 static int yylex (void);
 static void yyerror (const char *msg);
 %}
+$directives
 %union
 {
   int val;
@@ -174,17 +191,18 @@ sub calc_input ($$)
 }
 
 ##################################################################
-=item C<calc_grammar ($base, $max, $directives)>
+=item C<calc_grammar ($base, $max, @directives)>
 
 Generate a Bison file C<$base.y> that for a calculator parser in C.
-Pass the additional Bison C<$directives>.  C<$max> is ignored, but
+Pass the additional Bison C<@directives>.  C<$max> is ignored, but
 left to have the same interface as C<triangular_grammar>.
 
 =cut
 
 sub calc_grammar ($$$)
 {
-  my ($base, $max, $directives) = @_;
+  my ($base, $max, @directives) = @_;
+  my $directives = directives ($base, @directives);
 
   my $out = new IO::File ">$base.y"
     or die;
@@ -204,9 +222,9 @@ static semantic_value global_result = 0;
 static int global_count = 0;
 %}
 
-/* Exercise %union. */
 $directives
 %error-verbose
+/* Exercise %union. */
 %union
 {
   semantic_value ival;
@@ -403,9 +421,9 @@ 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>
+  C<$name> => C<@directives>
 
-where C<$name> is the name of the bench, and C<$directives> are the
+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
 against each other, repeated 50 times.
 
@@ -422,7 +440,7 @@ sub bench_grammar ($%)
       print STDERR "$name\n";
       # Call the Bison input file generator.
       my $generator = "$gram" . "_grammar";
-      &$generator ($name, 200, $directives);
+      &$generator ($name, 200, @$directives);
       compile ($name);
       $bench{$name} = "system ('./$name');";
     }
@@ -449,10 +467,10 @@ sub bench_push_parser ()
   bench_grammar
     ('calc',
      (
-      "pull-impure" => '',
-      "pull-pure" => '%define api.pure',
-      "push-impure" => '%define api.push_pull "both"',
-      "push-pure" => '%define api.push_pull "both" %define api.pure',
+      "pull-impure" => [],
+      "pull-pure"   => ['%define api.pure'],
+      "push-impure" => ['%define api.push_pull "both"'],
+      "push-pure"   => ['%define api.push_pull "both"', '%define api.pure'],
      )
     );
 }
-- 
1.6.0.2.588.g3102





reply via email to

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