mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-21 02:03:03 +00:00
bench: better error messages on invalid input
* etc/bench.pl.in: here.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user