]> git.saurik.com Git - bison.git/commitdiff
* data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to
authorAkim Demaille <akim@epita.fr>
Sun, 2 Mar 2003 13:39:44 +0000 (13:39 +0000)
committerAkim Demaille <akim@epita.fr>
Sun, 2 Mar 2003 13:39:44 +0000 (13:39 +0000)
generate verbose error messages.
Use the number of tokens as an upper bound in yytname, as it
cannot be a non terminal.

ChangeLog
data/glr.c
data/lalr1.cc
data/yacc.c

index 7b5df644946094410bb561daa6c1b0164080e24a..67ab551d5ef41d0e771f497bb6075e2eda5ba2dd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2003-03-02  Akim Demaille  <akim@epita.fr>
+
+       * data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to
+       generate verbose error messages.
+       Use the number of tokens as an upper bound in yytname, as it
+       cannot be a non terminal.
+
 2003-03-02  Akim Demaille  <akim@epita.fr>
 
        * tests/regression.at (_AT_DATA_DANCER_Y): Fix the expected error
index d2cdd77b5180059073c4894b2071dfa538438259..86a6fd0e5ef72c6fea8b3709dce1e4435989082a 100644 (file)
@@ -613,14 +613,14 @@ yytokenName (yySymbol yytoken)
 
 /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
  *  at YYVSP[YYLOW0].yystate.yypred.  Leaves YYVSP[YYLOW1].yystate.yypred
- *  containing the pointer to the next state in the chain. Assumes 
+ *  containing the pointer to the next state in the chain. Assumes
  *  YYLOW1 < YYLOW0.  For convenience, returns YYLOW1. */
 static int
-yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1) 
+yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1)
 {
   yyGLRState* s;
   int i;
-  s = yyvsp[yylow0].yystate.yypred; 
+  s = yyvsp[yylow0].yystate.yypred;
   for (i = yylow0-1; i >= yylow1; i -= 1)
     {
       if (! s->yyresolved)
@@ -1022,7 +1022,7 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn,
 }
 
 /** Shift stack #K of YYSTACK, to a new state corresponding to LR
- *  state YYLRSTATE, at input position YYPOSN, with the (unresolved) 
+ *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
  *  semantic value of YYRHS under the action for YYRULE. */
 static inline void
 yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState,
@@ -1597,29 +1597,28 @@ yyreportSyntaxError (yyGLRStack* yystack,
 #if YYERROR_VERBOSE
       yySymbol* const yytokenp = yystack->yytokenp;
       int yyn;
-      const char* yyprefix;
       yyn = yypact[yystack->yytops.yystates[0]->yylrState];
       if (YYPACT_NINF < yyn && yyn < YYLAST)
        {
          size_t yysize = 0;
+         const char* yyprefix;
          char* yymsg;
          int yyx;
 
          /* Start YYX at -YYN if negative to avoid negative indexes in
             YYCHECK.  */
-         int yyxbase = yyn < 0 ? -yyn : 0;
+         int yyxbegin = yyn < 0 ? -yyn : 0;
 
          /* Stay within bounds of both yycheck and yytname.  */
          int yychecklim = YYLAST - yyn;
-         int yynsyms = sizeof (yytname) / sizeof (yytname[0]);
-         int yyxlim = yychecklim < yynsyms ? yychecklim : yynsyms;
+         int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
          int yycount = 0;
 
          yyprefix = ", expecting ";
-         for (yyx = yyxbase; yyx < yyxlim && yycount < 5; yyx += 1)
+         for (yyx = yyxbegin; yyx < yyxend; ++yyx)
            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
              {
-               yysize += strlen (yytokenName (yyx)) + strlen (yyprefix);
+               yysize += strlen (yyprefix) + strlen (yytokenName (yyx));
                yycount += 1;
                if (yycount == 5)
                  {
@@ -1640,7 +1639,7 @@ yyreportSyntaxError (yyGLRStack* yystack,
              if (yycount < 5)
                {
                  yyprefix = ", expecting ";
-                 for (yyx = yyxbase; yyx < yyxlim; yyx += 1)
+                 for (yyx = yyxbegin; yyx < yyxend; ++yyx)
                    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
                      {
                        sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx));
index 1d1b9cff16912aeb3756da36ab17050f0ec8cd06..34398cc1211dd8e569c555d91f8da8386c81df2d 100644 (file)
@@ -498,13 +498,19 @@ b4_syncline([@oline@], [@ofile@])[
          message += name_[ilooka_];
          {
            int count = 0;
-           for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x)
+            /* Start YYX at -YYN if negative to avoid negative indexes in
+               YYCHECK.  */
+           int xbegin = n_ < 0 ? -n_ : 0;
+           /* Stay within bounds of both yycheck and yytname.  */
+           int checklim = last_ - n_;
+           int xend = checklim < ntokens_ ? checklim : ntokens_;
+           for (int x = xbegin; x < xend; ++x)
              if (check_[x + n_] == x && x != terror_)
                ++count;
            if (count < 5)
              {
                count = 0;
-               for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x)
+               for (int x = xbegin; x < xend; ++x)
                  if (check_[x + n_] == x && x != terror_)
                    {
                      message += (!count++) ? ", expecting " : " or ";
index fca98e54dedad90de93483964425510456e68841..eb0b7b303f7c304625b2d2d8fc58c2ba38f02ab9 100644 (file)
@@ -1038,32 +1038,30 @@ yyerrlab:
        {
          YYSIZE_T yysize = 0;
          int yytype = YYTRANSLATE (yychar);
+         const char* yyprefix;
          char *yymsg;
          int yyx;
 
          /* Start YYX at -YYN if negative to avoid negative indexes in
             YYCHECK.  */
-         int yyxbase = yyn < 0 ? -yyn : 0;
+         int yyxbegin = yyn < 0 ? -yyn : 0;
 
          /* Stay within bounds of both yycheck and yytname.  */
          int yychecklim = YYLAST - yyn;
-         int yynsyms = sizeof (yytname) / sizeof (yytname[0]);
-         int yyxlim = yychecklim < yynsyms ? yychecklim : yynsyms;
+         int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
          int yycount = 0;
 
-         for (yyx = yyxbase; yyx < yyxlim; yyx++)
+         yyprefix = ", expecting ";
+         for (yyx = yyxbegin; yyx < yyxend; ++yyx)
            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
              {
-               yysize += (! yycount
-                          ? sizeof (", expecting ") - 1
-                          : sizeof (" or ") - 1);
-               yysize += yystrlen (yytname[yyx]);
-               yycount++;
+               yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+               yycount += 1;
                if (yycount == 5)
                  {
                    yysize = 0;
                    break;
-                 }             
+                 }
              }
          yysize += (sizeof ("syntax error, unexpected ")
                     + yystrlen (yytname[yytype]));
@@ -1075,14 +1073,13 @@ yyerrlab:
 
              if (yycount < 5)
                {
-                 yycount = 0;
-                 for (yyx = yyxbase; yyx < yyxlim; yyx++)
+                 yyprefix = ", expecting ";
+                 for (yyx = yyxbegin; yyx < yyxend; ++yyx)
                    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
                      {
-                       const char *yyq = ! yycount ? ", expecting " : " or ";
-                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yyprefix);
                        yyp = yystpcpy (yyp, yytname[yyx]);
-                       yycount++;
+                       yyprefix = " or ";
                      }
                }
              yyerror (]b4_yyerror_args[yymsg);