[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] Propagate i18n changes into glr.c.,
Akim Demaille <=