From 2b008529edd233bac07a58d557869ae902be1818 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 11 Dec 2008 09:37:40 +0100 Subject: [PATCH] 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. --- 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 dd650dfe..6edfdab7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-12-11 Akim Demaille + + 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 Use testsuite -C. diff --git a/TODO b/TODO index a9ec3083..b12a039a 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 9998612b..6fd561e4 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 af3cd12e..b89a4233 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 (); } } ]])[ -- 2.45.2