bench: better error messages on invalid input

* etc/bench.pl.in: here.
This commit is contained in:
Akim Demaille
2020-03-21 16:47:22 +01:00
parent 56414791e9
commit 788b1a6858

View File

@@ -470,7 +470,6 @@ get_char (void)
return getc (input); return getc (input);
} }
static void static void
unget_char ( int c) unget_char ( int c)
{ {
@@ -952,8 +951,9 @@ my @token;
sub eat ($) sub eat ($)
{ {
my ($expected) = @_; my ($expected) = @_;
die "expected $expected, unexpected: $token[0] (@token)\n" my $unexpected = $token[0];
unless $token[0] eq $expected; die "expected $expected, unexpected: $unexpected (@token)\n"
unless $token[0] && $token[0] eq $expected;
shift @token; shift @token;
} }
@@ -974,7 +974,7 @@ sub parse (@)
sub parse_expr () sub parse_expr ()
{ {
my @res = parse_term (); my @res = parse_term ();
while ($token[0] eq '|') while ($token[0] && $token[0] eq '|')
{ {
eat ('|'); eat ('|');
# Alternation. # Alternation.
@@ -986,7 +986,7 @@ sub parse_expr ()
sub parse_term () sub parse_term ()
{ {
my @res = parse_fact (); my @res = parse_fact ();
while ($token[0] eq '&') while ($token[0] && $token[0] eq '&')
{ {
eat ('&'); eat ('&');
# Cartesian product. # Cartesian product.
@@ -1009,13 +1009,13 @@ sub parse_fact ()
die "unexpected end of expression" die "unexpected end of expression"
unless defined $token[0]; unless defined $token[0];
if ($token[0] eq '(') if ($token[0] && $token[0] eq '(')
{ {
eat ('('); eat ('(');
@res = parse_expr (); @res = parse_expr ();
eat (')'); eat (')');
} }
elsif ($token[0] eq '[') elsif ($token[0] && $token[0] eq '[')
{ {
eat ('['); eat ('[');
@res = (parse_expr (), ''); @res = (parse_expr (), '');
@@ -1032,39 +1032,35 @@ sub parse_dir ()
{ {
my @res; my @res;
die "unexpected end of expression" die "unexpected end of expression"
unless defined $token[0]; unless defined $token[0] && $token[0] ne $eod;
if ($token[0] eq '#d') if ($token[0] eq '#d')
{ {
eat ('#d'); eat ('#d');
$token[0] =~ s/(.*?)=(.*)/$1 $2/; $token[0] =~ s/(.*?)=(.*)/$1 $2/;
@res = ("%code {\n#define $token[0]\n}"); @res = ("%code {\n#define $token[0]\n}");
shift @token;
} }
elsif ($token[0] eq '%d') elsif ($token[0] eq '%d')
{ {
shift @token; shift @token;
$token[0] =~ s/(.*?)=(.*)/$1 $2/; $token[0] =~ s/(.*?)=(.*)/$1 $2/;
@res = ("%define $token[0]"); @res = ("%define $token[0]");
shift @token;
} }
elsif ($token[0] eq '%s') elsif ($token[0] eq '%s')
{ {
shift @token; shift @token;
@res = ("%skeleton \"$token[0]\""); @res = ("%skeleton \"$token[0]\"");
shift @token;
} }
elsif ($token[0] eq '%b') elsif ($token[0] eq '%b')
{ {
shift @token; shift @token;
@res = ("/*\n%bison \"$token[0]\"\\\n*/"); @res = ("/*\n%bison \"$token[0]\"\\\n*/");
shift @token;
} }
else else
{ {
@res = $token[0]; @res = $token[0];
shift @token;
} }
shift @token;
return @res; return @res;
} }