mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
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.
This commit is contained in:
10
ChangeLog
10
ChangeLog
@@ -1,3 +1,13 @@
|
|||||||
|
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>
|
2008-11-03 Akim Demaille <demaille@gostai.com>
|
||||||
|
|
||||||
Improve genericity of bench.pl.
|
Improve genericity of bench.pl.
|
||||||
|
|||||||
@@ -39,7 +39,22 @@ my $cc = $ENV{'CC'} || 'gcc';
|
|||||||
|
|
||||||
=over 4
|
=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 :
|
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<$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<$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
|
The created parser is self contained: it includes its scanner, and
|
||||||
source of input.
|
source of input.
|
||||||
@@ -67,7 +82,8 @@ 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"
|
my $out = new IO::File ">$base.y"
|
||||||
or die;
|
or die;
|
||||||
@@ -81,6 +97,7 @@ sub triangular_grammar ($$$)
|
|||||||
static int yylex (void);
|
static int yylex (void);
|
||||||
static void yyerror (const char *msg);
|
static void yyerror (const char *msg);
|
||||||
%}
|
%}
|
||||||
|
$directives
|
||||||
%union
|
%union
|
||||||
{
|
{
|
||||||
int val;
|
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.
|
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>.
|
left to have the same interface as C<triangular_grammar>.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub calc_grammar ($$$)
|
sub calc_grammar ($$$)
|
||||||
{
|
{
|
||||||
my ($base, $max, $directives) = @_;
|
my ($base, $max, @directives) = @_;
|
||||||
|
my $directives = directives ($base, @directives);
|
||||||
|
|
||||||
my $out = new IO::File ">$base.y"
|
my $out = new IO::File ">$base.y"
|
||||||
or die;
|
or die;
|
||||||
@@ -204,9 +222,9 @@ static semantic_value global_result = 0;
|
|||||||
static int global_count = 0;
|
static int global_count = 0;
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/* Exercise %union. */
|
|
||||||
$directives
|
$directives
|
||||||
%error-verbose
|
%error-verbose
|
||||||
|
/* Exercise %union. */
|
||||||
%union
|
%union
|
||||||
{
|
{
|
||||||
semantic_value ival;
|
semantic_value ival;
|
||||||
@@ -403,9 +421,9 @@ sub compile ($)
|
|||||||
Generate benches for C<$gram>. C<$gram> should be C<calc> or
|
Generate benches for C<$gram>. C<$gram> should be C<calc> or
|
||||||
C<triangle>. C<%bench> is a hash of the form:
|
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
|
Bison directive to use for this bench. All the benches are compared
|
||||||
against each other, repeated 50 times.
|
against each other, repeated 50 times.
|
||||||
|
|
||||||
@@ -422,7 +440,7 @@ sub bench_grammar ($%)
|
|||||||
print STDERR "$name\n";
|
print STDERR "$name\n";
|
||||||
# Call the Bison input file generator.
|
# Call the Bison input file generator.
|
||||||
my $generator = "$gram" . "_grammar";
|
my $generator = "$gram" . "_grammar";
|
||||||
&$generator ($name, 200, $directives);
|
&$generator ($name, 200, @$directives);
|
||||||
compile ($name);
|
compile ($name);
|
||||||
$bench{$name} = "system ('./$name');";
|
$bench{$name} = "system ('./$name');";
|
||||||
}
|
}
|
||||||
@@ -449,10 +467,10 @@ sub bench_push_parser ()
|
|||||||
bench_grammar
|
bench_grammar
|
||||||
('calc',
|
('calc',
|
||||||
(
|
(
|
||||||
"pull-impure" => '',
|
"pull-impure" => [],
|
||||||
"pull-pure" => '%define api.pure',
|
"pull-pure" => ['%define api.pure'],
|
||||||
"push-impure" => '%define api.push_pull "both"',
|
"push-impure" => ['%define api.push_pull "both"'],
|
||||||
"push-pure" => '%define api.push_pull "both" %define api.pure',
|
"push-pure" => ['%define api.push_pull "both"', '%define api.pure'],
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user