summaryrefslogtreecommitdiff
path: root/etc
diff options
context:
space:
mode:
authorAkim Demaille <demaille@gostai.com>2008-08-18 20:21:13 +0200
committerAkim Demaille <demaille@gostai.com>2008-11-11 15:23:13 +0100
commitfce629c0efad342c9b1c538eb447b22731e031d0 (patch)
tree76888d0948b9841301244a1926a51d1fbbfa15a3 /etc
parentce6719605b81aa7b19c6f9615a78a4fd18bfdb42 (diff)
downloadbison-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-xetc/bench.pl.in65
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')