From: Akim Demaille Date: Mon, 18 Aug 2008 18:21:13 +0000 (+0200) Subject: Bench: syntactic sugar for %define/#define. X-Git-Tag: v2.7.90~1081 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/fce629c0efad342c9b1c538eb447b22731e031d0?ds=sidebyside Bench: syntactic sugar for %define/#define. * etc/bench.pl.in (parse_dirs): Support %d and #d with arguments. (&bench_push_parser, bench_variant_parser): Use this feature. (&eat): New. Use it. --- diff --git a/ChangeLog b/ChangeLog index 811d6fa0..17023e24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-11-11 Akim Demaille + + Bench: syntactic sugar for %define/#define. + * etc/bench.pl.in (parse_dirs): Support %d and #d with arguments. + (&bench_push_parser, bench_variant_parser): Use this feature. + (&eat): New. + Use it. + 2008-11-11 Akim Demaille Less memory pressure on the "list" bench. diff --git a/etc/bench.pl.in b/etc/bench.pl.in index d365d653..0e536290 100755 --- a/etc/bench.pl.in +++ b/etc/bench.pl.in @@ -35,8 +35,9 @@ I: | directives & directives -- Concatenation | [ directives> ] -- Optional | ( directives> ) -- Parentheses + | #d NAME[=VALUE] -- %code { #define NAME [VALUE] } + | %d NAME[=VALUE] -- %define NAME ["VALUE"] | %s skeleton -- %skeleton "skeleton" - | #d definition -- %code { #define definition } | directive Parentheses only group to override precedence. For instance: @@ -872,10 +873,10 @@ interfaces. sub bench_push_parser () { bench ('calc', - ( - '[', '%define api.pure', ']', - '&', - '[', '%define api.push_pull "both"', ']' + qw( + [ %d api.pure ] + & + [ %d api.push_pull=both ] )); } @@ -891,11 +892,9 @@ sub bench_variant_parser () { bench ('list', qw( - %s lalr1.cc - & [ %debug ] & - [ %define variant + [ %d variant & [ #d VARIANT_DESTROY ] & @@ -939,30 +938,42 @@ sub help ($) ###################################################################### +# The end of the directives to parse. +my $eod = "end of directives"; # The list of tokens parsed by the following functions. my @token; +# eat ($EXPECTED) +# --------------- +# Check that the current token is $EXPECTED, and move to the next. +sub eat ($) +{ + my ($expected) = @_; + die "expected $expected, unexpected: $token[0] (@token)\n" + unless $token[0] eq $expected; + shift @token; +} + # Parse directive specifications: # expr: term (| term)* # term: fact (& fact)* # fact: ( expr ) | [ expr ] | dirs -# dirs: %s SKELETON | #d DEFINE | directive +# dirs: %s SKELETON | #d NAME[=VALUE] | %d NAME[=VALUE] | directive sub parse (@) { - @token = @_; + @token = (@_, $eod); verbose 3, "Parsing: @token\n"; my @res = parse_expr (); - die "expected end of directives, unexpected: @token" - if defined $token[0]; + eat ($eod); return @res; } sub parse_expr () { my @res = parse_term (); - while (defined $token[0] && $token[0] eq '|') + while ($token[0] eq '|') { - shift @token; + eat ('|'); # Alternation. push @res, parse_term (); } @@ -972,9 +983,9 @@ sub parse_expr () sub parse_term () { my @res = parse_fact (); - while (defined $token[0] && $token[0] eq '&') + while ($token[0] eq '&') { - shift @token; + eat ('&'); # Cartesian product. my @lhs = @res; @res = (); @@ -997,19 +1008,15 @@ sub parse_fact () if ($token[0] eq '(') { - shift @token; + eat ('('); @res = parse_expr (); - die "unexpected $token[0], expected )" - unless $token[0] eq ')'; - shift @token; + eat (')'); } elsif ($token[0] eq '[') { - shift @token; + eat ('['); @res = (parse_expr (), ''); - die "unexpected $token[0], expected ]" - unless $token[0] eq ']'; - shift @token; + eat (']'); } else { @@ -1025,9 +1032,17 @@ sub parse_dirs () unless defined $token[0]; if ($token[0] eq '#d') + { + eat ('#d'); + $token[0] =~ s/(.*?)=(.*)/$1 $2/; + @res = ("%code {\n#define $token[0]\n}"); + shift @token; + } + elsif ($token[0] eq '%d') { shift @token; - @res = ("%code {\n#define\n}"); + $token[0] =~ s/(.*?)=(.*)/$1 "$2"/; + @res = ("%define $token[0]"); shift @token; } elsif ($token[0] eq '%s')