bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/4] bench: better error messages on invalid input


From: Akim Demaille
Subject: [PATCH 3/4] bench: better error messages on invalid input
Date: Sat, 21 Mar 2020 18:39:19 +0100

* etc/bench.pl.in: here.
---
 etc/bench.pl.in | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]