bison-patches
[Top][All Lists]
Advanced

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

[FYI] skeleton-c++-error-reporting.patch


From: Robert Anisko
Subject: [FYI] skeleton-c++-error-reporting.patch
Date: Thu, 7 Feb 2002 12:43:39 +0100 (CET)

Index: ChangeLog
===================================================================
RCS file: /cvsroot/bison/bison/ChangeLog,v
retrieving revision 1.537
diff -u -r1.537 ChangeLog
--- ChangeLog   6 Feb 2002 15:17:57 -0000       1.537
+++ ChangeLog   7 Feb 2002 11:32:52 -0000
@@ -1,3 +1,9 @@
+2002-02-07  Robert Anisko  <address@hidden>
+
+       * data/bison.c++ (yy::b4_name::error_): New method, replaces yyerror in
+       C++ parsers.
+       (yy::b4_name::parse): Build verbose error messages, and use error_.
+
 2002-02-06  Robert Anisko  <address@hidden>
 
        * data/bison.c++: Fix m4 quoting in comments.
Index: data/bison.c++
===================================================================
RCS file: /cvsroot/bison/bison/data/bison.c++,v
retrieving revision 1.4
diff -u -r1.4 bison.c++
--- data/bison.c++      6 Feb 2002 15:17:57 -0000       1.4
+++ data/bison.c++      7 Feb 2002 11:32:52 -0000
@@ -80,11 +80,13 @@
 
   private:
 
+    virtual void error_ ();
+
     /* Call to lexical analyser.  */
-    virtual 
-    void 
-    lex () 
-    { 
+    virtual
+    void
+    lex ()
+    {
       looka = yylex (&value, &location);
     }
 
@@ -124,11 +126,14 @@
     int len;
     int debug_;
     int state;
-    
+
     /* Lookahead.  */
     int looka;
     int ilooka;
-    
+
+    /* Message.  */
+    std::string message;
+
     /* @$ and $$.  */
     SemanticType value;
     LocationType location;
@@ -169,6 +174,9 @@
 int
 yy::b4_name::parse ()
 {
+  int nerrs = 0;
+  int errstatus = 0;
+
   /* Initialize stack.  */
   state_stack = StateStack (0);
   semantic_stack = SemanticStack (1);
@@ -333,7 +341,39 @@
 
   /* Report and recover from errors.  This is very incomplete.  */
  yyerrlab:
-  std::cerr << "Parse error." << std::endl; // FIXME: Need something like 
yyerror?
+  /* If not already recovering from an error, report this error.  */
+  if (!errstatus)
+    {
+      ++nerrs;
+      
+      // FIXME: Should be #if YYERROR_VERBOSE from here...
+      n = pact_[[state]];
+      if (n > b4_flag && n < b4_last)
+       {
+         message = "parse error, unexpected ";
+         message += name_[[ilooka]];
+         {
+           int count = 0;
+           for (int x = (n < 0 ? -n : 0); x < b4_ntokens + b4_nnts; ++x)
+             if (check_[[x + n]] == x)
+               ++count;
+           if (count < 5)
+             {
+               count = 0;
+               for (int x = (n < 0 ? -n : 0); x < b4_ntokens + b4_nnts; ++x)
+                 if (check_[[x + n]] == x)
+                   {
+                     message += (!count++) ? ", expecting " : " or "; 
+                     message += name_[[x]];
+                   }
+             }
+         }
+       }
+      else
+      // FIXME: to there...
+       message = "parse error";
+    }
+  error_ ();
   return 1;
   
   /* Accept.  */



reply via email to

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