[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Bench: syntactic sugar for %define/#define.
From: |
Akim Demaille |
Subject: |
[PATCH] Bench: syntactic sugar for %define/#define. |
Date: |
Tue, 11 Nov 2008 14:26:19 -0000 |
* 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.
---
ChangeLog | 8 ++++++
etc/bench.pl.in | 65 +++++++++++++++++++++++++++++++++---------------------
2 files changed, 48 insertions(+), 25 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 811d6fa..17023e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2008-11-11 Akim Demaille <address@hidden>
+ 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 <address@hidden>
+
Less memory pressure on the "list" bench.
* etc/bench.pl.in (generate_grammar_list): Do not accumulate all
the values, to limit memory pressure.
diff --git a/etc/bench.pl.in b/etc/bench.pl.in
index d365d65..0e53629 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')
--
1.6.0.2.588.g3102
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] Bench: syntactic sugar for %define/#define.,
Akim Demaille <=