* etc/bench.pl.in (variant_grammar): Fix the computation of
$variant.
Generate a grammar file that can work with or without %debug.
Do use the @directive.
(bench_variant_parser): Check impact of %debug.
(@directives): Rename all the occurrences to...
(@directive): this, for consistency.
+2008-11-03 Akim Demaille <demaille@gostai.com>
+
+ bench: check impact of %debug on variants.
+ * etc/bench.pl.in (variant_grammar): Fix the computation of
+ $variant.
+ Generate a grammar file that can work with or without %debug.
+ Do use the @directive.
+ (bench_variant_parser): Check impact of %debug.
+ (@directives): Rename all the occurrences to...
+ (@directive): this, for consistency.
+
2008-11-03 Akim Demaille <demaille@gostai.com>
bench: report the size too.
2008-11-03 Akim Demaille <demaille@gostai.com>
bench: report the size too.
- my ($bench, @directives) = @_;
+ my ($bench, @directive) = @_;
my $res = "/* Directives for bench `$bench'. */\n";
my $res = "/* Directives for bench `$bench'. */\n";
- for my $d (@directives)
{
$res .= $d . "\n"
unless $d eq '%variant';
{
$res .= $d . "\n"
unless $d eq '%variant';
-=item C<triangular_grammar ($base, $max, @directives)>
+=item C<triangular_grammar ($base, $max, @directive)>
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 (F<$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 (F<$base.y>).
C<$max> is the number of such rules (here, 5). You may pass
-additional Bison C<@directives>.
+additional Bison C<@directive>.
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 $directives = directives ($base, @directives);
+ my ($base, $max, @directive) = @_;
+ my $directives = directives ($base, @directive);
my $out = new IO::File ">$base.y"
or die;
my $out = new IO::File ">$base.y"
or die;
}
##################################################################
}
##################################################################
-=item C<calc_grammar ($base, $max, @directives)>
+=item C<calc_grammar ($base, $max, @directive)>
Generate a Bison file F<$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
+the additional Bison C<@directive>. C<$max> is ignored, but left to
have the same interface as C<triangular_grammar>.
=cut
sub calc_grammar ($$$)
{
have the same interface as C<triangular_grammar>.
=cut
sub calc_grammar ($$$)
{
- my ($base, $max, @directives) = @_;
- my $directives = directives ($base, @directives);
+ my ($base, $max, @directive) = @_;
+ my $directives = directives ($base, @directive);
my $out = new IO::File ">$base.y"
or die;
my $out = new IO::File ">$base.y"
or die;
##################################################################
##################################################################
-=item C<variant_grammar ($base, $max, @directives)>
+=item C<variant_grammar ($base, $max, @directive)>
Generate a Bison file F<$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>.
+depending on the C<@directive>.
=cut
sub variant_grammar ($$$)
{
=cut
sub variant_grammar ($$$)
{
- my ($base, $max, @directives) = @_;
- my $directives = directives ($base, @directives);
- my $variant = grep { '%variant' } @directives;
+ my ($base, $max, @directive) = @_;
+ my $directives = directives ($base, @directive);
+ my $variant = grep { $_ eq '%variant' } @directive;
my $out = new IO::File ">$base.y"
or die;
print $out <<EOF;
my $out = new IO::File ">$base.y"
or die;
print $out <<EOF;
-%code requires // code for the .hh file
+%code requires // variant.h
-%code // code for the .cc file
{
#include <algorithm>
#include <iostream>
{
#include <algorithm>
#include <iostream>
int main(int argc, char *argv[])
{
yy::parser p;
int main(int argc, char *argv[])
{
yy::parser p;
p.set_debug_level(!!getenv("YYDEBUG"));
p.set_debug_level(!!getenv("YYDEBUG"));
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:
-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<@directive> 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.
# Call the Bison input file generator.
my $generator = "$gram" . "_grammar";
&$generator ($name, 200, @$directives);
# Call the Bison input file generator.
my $generator = "$gram" . "_grammar";
&$generator ($name, 200, @$directives);
+ # Compile the executable.
compile ($name);
$bench{$name} = "system ('./$name');";
chop($size{$name} = `wc -c <$name`);
compile ($name);
$bench{$name} = "system ('./$name');";
chop($size{$name} = `wc -c <$name`);
bench_grammar
('variant',
(
bench_grammar
('variant',
(
- "union" => [],
- "variant" => ['%variant'],
+ "union" => [],
+ "variant" => ['%variant'],
+ "union-debug" => ['%debug'],
+ "variant-debug" => ['%debug', '%variant'],