bison-patches
[Top][All Lists]
Advanced

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

[PATCH] Propagate i18n changes into glr.c.


From: Akim Demaille
Subject: [PATCH] Propagate i18n changes into glr.c.
Date: Thu, 11 Dec 2008 09:37:40 +0100

        * TODO: Update.
        * data/glr.c (yyreportSyntaxError): Use "switch" instead of
        building the error message format dynamically.
        * data/lalr1.java: Formatting changes.
---
 ChangeLog       |    8 ++++++++
 TODO            |    4 ++--
 data/glr.c      |   51 ++++++++++++++++++++++++++++-----------------------
 data/lalr1.java |    2 +-
 4 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index dd650df..6edfdab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-12-11  Akim Demaille  <address@hidden>
 
+       Propagate i18n changes into glr.c.
+       * TODO: Update.
+       * data/glr.c (yyreportSyntaxError): Use "switch" instead of
+       building the error message format dynamically.
+       * data/lalr1.java: Formatting changes.
+
+2008-12-11  Akim Demaille  <address@hidden>
+
        Use testsuite -C.
        * tests/local.mk: Replace "cd && testsuite" by "testsuite -C".
        Solves problems when top_srcdir is an absolute path.
diff --git a/TODO b/TODO
index a9ec308..b12a039 100644
--- a/TODO
+++ b/TODO
@@ -161,8 +161,8 @@ In lalr1.cc we invoke it with the translated lookahead 
(yytoken), and
 yacc.c uses yychar.  I don't see why.
 
 ** yysyntax_error
-The use of switch to select yyfmt in lalr1.cc seems simpler than
-what's done in yacc.c.
+The code bw glr.c and yacc.c is really alike, we can certainly factor
+some parts.
 
 * Header guards
 
diff --git a/data/glr.c b/data/glr.c
index 9998612..6fd561e 100644
--- a/data/glr.c
+++ b/data/glr.c
@@ -2043,18 +2043,10 @@ yyreportSyntaxError (yyGLRStack* 
yystackp]b4_user_formals[)
          yybool yysize_overflow = yyfalse;
          char* yymsg = NULL;
          enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+          /* Internationalized format string. */
+          const char *yyformat = 0;
+          /* Arguments of yyformat. */
          char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-         int yyx;
-         char *yyfmt;
-         char const *yyf;
-         static char const yyunexpected[] = "syntax error, unexpected %s";
-         static char const yyexpecting[] = ", expecting %s";
-         static char const yyor[] = " or %s";
-         char yyformat[sizeof yyunexpected
-                       + sizeof yyexpecting - 1
-                       + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-                          * (sizeof yyor - 1))];
-         char const *yyprefix = yyexpecting;
 
          /* Start YYX at -YYN if negative to avoid negative indexes in
             YYCHECK.  */
@@ -2063,10 +2055,13 @@ yyreportSyntaxError (yyGLRStack* 
yystackp]b4_user_formals[)
          /* Stay within bounds of both yycheck and yytname.  */
          int yychecklim = YYLAST - yyn + 1;
          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-         int yycount = 1;
 
-         yyarg[0] = yytokenName (yytoken);
-         yyfmt = yystpcpy (yyformat, yyunexpected);
+          /* Number of reported tokens (one for the "unexpected", one per
+             "expected"). */
+          int yycount = 0;
+          int yyx;
+
+         yyarg[yycount++] = yytokenName (yytoken);
 
          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
@@ -2075,19 +2070,29 @@ yyreportSyntaxError (yyGLRStack* 
yystackp]b4_user_formals[)
                  {
                    yycount = 1;
                    yysize = yysize0;
-                   yyformat[sizeof yyunexpected - 1] = '\0';
                    break;
                  }
                yyarg[yycount++] = yytokenName (yyx);
                yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx));
                yysize_overflow |= yysize1 < yysize;
                yysize = yysize1;
-               yyfmt = yystpcpy (yyfmt, yyprefix);
-               yyprefix = yyor;
              }
 
-         yyf = YY_(yyformat);
-         yysize1 = yysize + strlen (yyf);
+          switch (yycount)
+            {
+#define YYCASE_(N, S)                           \
+              case N:                           \
+                yyformat = S;                   \
+              break
+              YYCASE_(1, YY_("syntax error, unexpected %s"));
+              YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+              YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or 
%s"));
+              YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s 
or %s"));
+              YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s 
or %s or %s"));
+#undef YYCASE_
+            }
+
+         yysize1 = yysize + strlen (yyformat);
          yysize_overflow |= yysize1 < yysize;
          yysize = yysize1;
 
@@ -2098,17 +2103,17 @@ yyreportSyntaxError (yyGLRStack* 
yystackp]b4_user_formals[)
            {
              char *yyp = yymsg;
              int yyi = 0;
-             while ((*yyp = *yyf))
+             while ((*yyp = *yyformat))
                {
-                 if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+                 if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
                    {
                      yyp += yytnamerr (yyp, yyarg[yyi++]);
-                     yyf += 2;
+                     yyformat += 2;
                    }
                  else
                    {
                      yyp++;
-                     yyf++;
+                     yyformat++;
                    }
                }
              yyerror (]b4_lyyerror_args[yymsg);
diff --git a/data/lalr1.java b/data/lalr1.java
index af3cd12..b89a423 100644
--- a/data/lalr1.java
+++ b/data/lalr1.java
@@ -757,7 +757,7 @@ m4_popdef([b4_at_dollar])])dnl
                       res.append (yytnamerr_ (yytname_[x]));
                     }
               }
-        return res.toString ();
+            return res.toString ();
           }
       }
 ]])[
-- 
1.6.0.4.790.gaa14a





reply via email to

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