diff options
author | Akim Demaille <demaille@gostai.com> | 2008-08-18 20:21:13 +0200 |
---|---|---|
committer | Akim Demaille <demaille@gostai.com> | 2008-11-11 15:23:13 +0100 |
commit | fce629c0efad342c9b1c538eb447b22731e031d0 (patch) | |
tree | 76888d0948b9841301244a1926a51d1fbbfa15a3 /etc | |
parent | ce6719605b81aa7b19c6f9615a78a4fd18bfdb42 (diff) | |
download | bison-fce629c0efad342c9b1c538eb447b22731e031d0.tar.gz |
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.
Diffstat (limited to 'etc')
-rwxr-xr-x | etc/bench.pl.in | 65 |
1 files changed, 40 insertions, 25 deletions
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 & 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 { @@ -1026,8 +1033,16 @@ sub parse_dirs () 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') |