X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/918eb7c5ae9ec56d998fe931cc437cb626fe5cb4..3c5362b825a9d01eafe257943b7faad92ea43a05:/etc/bench.pl.in?ds=inline diff --git a/etc/bench.pl.in b/etc/bench.pl.in index 1ee98b7f..cfa055d3 100755 --- a/etc/bench.pl.in +++ b/etc/bench.pl.in @@ -1,6 +1,6 @@ #! /usr/bin/perl -w -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is part of Bison, the GNU Compiler Compiler. # @@ -57,11 +57,6 @@ request. =over 4 -=item I - -Test F with three stacks against F which -uses a single one. - =item I Test the push parser vs. the pull interface. Use the C parser. @@ -251,7 +246,6 @@ sub generate_grammar_triangular ($$@) or die; print $out < #include @@ -323,7 +317,9 @@ yyerror (const char *msg) int main (void) { +#if YYDEBUG yydebug = !!getenv ("YYDEBUG"); +#endif return yyparse (); } EOF @@ -548,6 +544,10 @@ main (int argc, const char **argv) int count = 0; int status; +#if YYDEBUG + yydebug = !!getenv ("YYDEBUG"); +#endif + input = fopen ("calc.input", "r"); if (!input) { @@ -580,11 +580,13 @@ sub generate_grammar_list ($$@) my ($base, $max, @directive) = @_; my $directives = directives ($base, @directive); my $variant = grep { /%define "?variant"?/ } @directive; + my $lex_symbol = grep { /%define "?lex_symbol"?/ } @directive; my $out = new IO::File ">$base.y" or die; print $out < #include -// Prototype of the yylex function providing subsequent tokens. -static yy::parser::token_type yylex(yy::parser::semantic_type* yylval); - #define STAGE_MAX ($max * 10) // max = $max +#define USE_LEX_SYMBOL $lex_symbol #define USE_VARIANTS $variant -#if USE_VARIANTS -# define IF_VARIANTS(True, False) True -#else -# define IF_VARIANTS(True, False) False -#endif -#ifdef ONE_STAGE_BUILD -# define IF_ONE_STAGE_BUILD(True, False) True + // Prototype of the yylex function providing subsequent tokens. + static +#if USE_LEX_SYMBOL + yy::parser::symbol_type yylex(); #else -# define IF_ONE_STAGE_BUILD(True, False) False + yy::parser::token_type yylex(yy::parser::semantic_type* yylval, + yy::parser::location_type* yylloc); #endif // Conversion to string. @@ -627,6 +625,8 @@ static yy::parser::token_type yylex(yy::parser::semantic_type* yylval); return o.str (); } } + +%token END_OF_FILE 0 EOF if ($variant) @@ -636,7 +636,6 @@ EOF %token NUMBER %printer { std::cerr << "Number: " << $$; } %printer { std::cerr << "Text: " << $$; } -%token END_OF_FILE 0 %type text result %% @@ -660,7 +659,6 @@ EOF %token NUMBER %printer { std::cerr << "Number: " << $$; } %printer { std::cerr << "Text: " << *$$; } -%token END_OF_FILE 0 %type text result %% @@ -678,49 +676,69 @@ EOF print $out <<'EOF'; %% +# + static -yy::parser::token_type -yylex(yy::parser::semantic_type* yylval) +#if USE_LEX_SYMBOL +yy::parser::symbol_type yylex() +#else +yy::parser::token_type yylex(yy::parser::semantic_type* yylval, + yy::parser::location_type* yylloc) +#endif { + typedef yy::parser::location_type location_type; + typedef yy::parser::token token; static int stage = -1; ++stage; if (stage == STAGE_MAX) - return yy::parser::token::END_OF_FILE; + { +#if USE_LEX_SYMBOL + return yy::parser::make_END_OF_FILE (location_type ()); +#else + *yylloc = location_type (); + return token::END_OF_FILE; +#endif + } else if (stage % 2) { -#if USE_VARIANTS -# ifdef ONE_STAGE_BUILD +#if USE_LEX_SYMBOL + return yy::parser::make_NUMBER (stage, location_type ()); +#else +# if defined ONE_STAGE_BUILD yylval->build(stage); -# else +# elif USE_VARIANTS yylval->build() = stage; -# endif -#else +# else yylval->ival = stage; +# endif + *yylloc = location_type (); + return token::NUMBER; #endif - return yy::parser::token::NUMBER; } else { -#if USE_VARIANTS -# ifdef ONE_STAGE_BUILD +#if USE_LEX_SYMBOL + return yy::parser::make_TEXT ("A string.", location_type ()); +#else +# if defined ONE_STAGE_BUILD yylval->build(std::string("A string.")); -# else +# elif USE_VARIANTS yylval->build() = std::string("A string."); -# endif -#else +# else yylval->sval = new std::string("A string."); +# endif + *yylloc = location_type (); + return token::TEXT; #endif - return yy::parser::token::TEXT; } abort(); } // Mandatory error function void -yy::parser::error(const yy::parser::location_type& yylloc, - const std::string& message) +yy::parser::error(const yy::parser::location_type& loc, const std::string& msg) { - std::cerr << yylloc << ": " << message << std::endl; + std::cerr << loc << ": " << msg << std::endl; } int main(int argc, char *argv[]) @@ -878,7 +896,7 @@ sub bench_push_parser () qw( [ %d api.pure ] & - [ %d api.push_pull=both ] + [ %d api.push-pull=both ] )); } @@ -886,7 +904,7 @@ sub bench_push_parser () =item C -Bench the C++ lalr1.cc parser using Boost.Variants or %union. +Bench the C++ lalr1.cc parser using variants or %union. =cut @@ -894,37 +912,15 @@ sub bench_variant_parser () { bench ('list', qw( - [ %debug ] - & - [ %d variant - & - [ #d VARIANT_DESTROY ] + [ + %d variant & - [ #d ONE_STAGE_BUILD ] + [ #d ONE_STAGE_BUILD | %d lex_symbol ] ] ) ); } -###################################################################### - -=item C - -Bench the C++ lalr1.cc parser using Boost.Variants or %union. - -=cut - -sub bench_fusion_parser () -{ - bench ('list', - qw( - %s lalr1-split.cc - | - %s lalr1.cc - ) - ); -} - ############################################################################ sub help ($) @@ -995,7 +991,7 @@ sub parse_term () { for my $lhs (@lhs) { - push @res, "$lhs\n$rhs"; + push @res, $lhs . ($lhs && $rhs ? "\n" : "") . $rhs; } } } @@ -1110,7 +1106,6 @@ verbose 2, "Grammar: $grammar\n"; # Support -b: predefined benches. my %bench = ( - "fusion" => \&bench_fusion_parser, "push" => \&bench_push_parser, "variant" => \&bench_variant_parser, );