summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7484f1d)
* 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 <demaille@gostai.com>
+
+ 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 <demaille@gostai.com>
Improve genericity of bench.pl.
2008-11-03 Akim Demaille <demaille@gostai.com>
Improve genericity of bench.pl.
-=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 :
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
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.
The created parser is self contained: it includes its scanner, and
source of input.
sub triangular_grammar ($$$)
{
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;
my $out = new IO::File ">$base.y"
or die;
static int yylex (void);
static void yyerror (const char *msg);
%}
static int yylex (void);
static void yyerror (const char *msg);
%}
}
##################################################################
}
##################################################################
-=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.
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 ($$$)
{
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;
my $out = new IO::File ">$base.y"
or die;
static int global_count = 0;
%}
static int global_count = 0;
%}
$directives
%error-verbose
$directives
%error-verbose
%union
{
semantic_value ival;
%union
{
semantic_value ival;
Generate benches for C<$gram>. C<$gram> should be C<calc> or
C<triangle>. C<%bench> is a hash of the form:
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.
Bison directive to use for this bench. All the benches are compared
against each other, repeated 50 times.
print STDERR "$name\n";
# Call the Bison input file generator.
my $generator = "$gram" . "_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');";
}
compile ($name);
$bench{$name} = "system ('./$name');";
}
- "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'],