[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: i18n for yacc backend messages
From: |
Paul Eggert |
Subject: |
Re: i18n for yacc backend messages |
Date: |
Wed, 13 Apr 2005 17:11:23 -0700 |
User-agent: |
Gnus/5.1006 (Gnus v5.10.6) Emacs/21.4 (gnu/linux) |
Jan Nieuwenhuizen <address@hidden> writes:
> I'll see if I can come up with something better, how's the patch below?
On further thought I'm leery of translating the token names, as they
are part of the input, and are not really English-language strings.
I installed the following more-conservative patch, as it is some
progress anyway.
Can you please explain why the token names should be translated? It's
possible that this should be an option, rather than being an
unconditional translation.
2005-04-13 Paul Eggert <address@hidden>
* NEWS: Bison-generated C parsers now use the _ macro to
translate strings.
* data/yacc.c (_) [!defined _]: New macro.
All English strings wrapped inside this macro.
* doc/bison.texinfo (Bison Parser): Document _.
* po/POTFILES.in: Include src/parse-gram.c, since it now
includes translateable strings that parse-gram.y doesn't.
Index: NEWS
===================================================================
RCS file: /cvsroot/bison/bison/NEWS,v
retrieving revision 1.110
diff -p -u -r1.110 NEWS
--- NEWS 26 Dec 2004 05:49:52 -0000 1.110
+++ NEWS 14 Apr 2005 00:07:46 -0000
@@ -1,6 +1,12 @@
Bison News
----------
+Changes in version 2.0a, ????-??-??:
+
+* Bison-generated C parsers use the _ macro to translate strings from
+ English to the user's language, e.g., _("syntax error"). By default,
+ _ is defined to be a no-op macro so the strings are not translated.
+
Changes in version 2.0, 2004-12-25:
* Possibly-incompatible changes
@@ -593,7 +599,7 @@ End:
-----
-Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Index: data/yacc.c
===================================================================
RCS file: /cvsroot/bison/bison/data/yacc.c,v
retrieving revision 1.83
diff -p -u -r1.83 yacc.c
--- data/yacc.c 17 Mar 2005 19:19:44 -0000 1.83
+++ data/yacc.c 14 Apr 2005 00:07:46 -0000
@@ -375,6 +375,11 @@ static const char *const yytname[] =
};
#endif
+/* INFRINGES ON USER NAME SPACE */
+#ifndef _
+# define _(msgid) msgid
+#endif
+
# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
token YYLEX-NUM. */
@@ -492,7 +497,7 @@ do
\
} \
else \
{ \
- yyerror (]b4_yyerror_args["syntax error: cannot back up");\
+ yyerror (]b4_yyerror_args[_("syntax error: cannot back up")); \
YYERROR; \
} \
while (0)
@@ -586,7 +591,7 @@ do {
\
[[short int *bottom], [bottom]],
[[short int *top], [top]])[
{
- YYFPRINTF (stderr, "Stack now");
+ YYFPRINTF (stderr, _("Stack now"));
for (/* Nothing. */; bottom <= top; ++bottom)
YYFPRINTF (stderr, " %d", *bottom);
YYFPRINTF (stderr, "\n");
@@ -608,7 +613,7 @@ do {
\
{
int yyi;
unsigned int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+ YYFPRINTF (stderr, _("Reducing stack by rule %d (line %u), "),
yyrule - 1, yylno);
/* Print the symbols being reduced, and their result. */
for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
@@ -877,7 +882,7 @@ b4_syncline(address@hidden@], address@hidden@])])dnl
data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might
be undefined if yyoverflow is a macro. */
- yyoverflow ("parser stack overflow",
+ yyoverflow (_("parser stack overflow"),
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
]b4_location_if([ &yyls1, yysize * sizeof (*yylsp),])[
@@ -917,14 +922,14 @@ b4_syncline(address@hidden@], address@hidden@])])dnl
yyvsp = yyvs + yysize - 1;
]b4_location_if([ yylsp = yyls + yysize - 1;])[
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ YYDPRINTF ((stderr, _("Stack size increased to %lu\n"),
(unsigned long int) yystacksize));
if (yyss + yystacksize - 1 <= yyssp)
YYABORT;
}
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YYDPRINTF ((stderr, _("Entering state %d\n"), yystate));
goto yybackup;
@@ -948,19 +953,19 @@ yybackup:
/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
if (yychar == YYEMPTY)
{
- YYDPRINTF ((stderr, "Reading a token: "));
+ YYDPRINTF ((stderr, _("Reading a token: ")));
yychar = YYLEX;
}
if (yychar <= YYEOF)
{
yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
+ YYDPRINTF ((stderr, _("Now at end of input.\n")));
}
else
{
yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ YY_SYMBOL_PRINT (_("Next token is"), yytoken, &yylval, &yylloc);
}
/* If the proper action on seeing token YYTOKEN is to reduce or to
@@ -981,7 +986,7 @@ yybackup:
YYACCEPT;
/* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ YY_SYMBOL_PRINT (_("Shifting"), yytoken, &yylval, &yylloc);
/* Discard the token being shifted unless it is eof. */
if (yychar != YYEOF)
@@ -1091,7 +1096,7 @@ yyerrlab:
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yycount = 0;
- yyprefix = ", expecting ";
+ yyprefix = _(", expecting ");
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
@@ -1103,34 +1108,34 @@ yyerrlab:
break;
}
}
- yysize += (sizeof ("syntax error, unexpected ")
- + yystrlen (yytname[yytype]));
+ yysize += (strlen (_("syntax error, unexpected "))
+ + yystrlen (yytname[yytype]) + 1);
yymsg = (char *) YYSTACK_ALLOC (yysize);
if (yymsg != 0)
{
- char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+ char *yyp = yystpcpy (yymsg, _("syntax error, unexpected "));
yyp = yystpcpy (yyp, yytname[yytype]);
if (yycount < 5)
{
- yyprefix = ", expecting ";
+ yyprefix = _(", expecting ");
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
yyp = yystpcpy (yyp, yyprefix);
yyp = yystpcpy (yyp, yytname[yyx]);
- yyprefix = " or ";
+ yyprefix = _(" or ");
}
}
yyerror (]b4_yyerror_args[yymsg);
YYSTACK_FREE (yymsg);
}
else
- yyerror (]b4_yyerror_args["syntax error; also virtual memory
exhausted");
+ yyerror (]b4_yyerror_args[_("syntax error; also virtual memory
exhausted"));
}
else
#endif /* YYERROR_VERBOSE */
- yyerror (]b4_yyerror_args["syntax error");
+ yyerror (]b4_yyerror_args[_("syntax error"));
}
]b4_location_if([[ yyerror_range[0] = yylloc;]])[
@@ -1151,13 +1156,13 @@ yyerrlab:
YYPOPSTACK;
if (yyssp == yyss)
YYABORT;
- yydestruct ("Error: popping",
+ yydestruct (_("Error: popping"),
yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[);
}
}
else
{
- yydestruct ("Error: discarding", yytoken, &yylval]b4_location_if([,
&yylloc])[);
+ yydestruct (_("Error: discarding"), yytoken,
&yylval]b4_location_if([, &yylloc])[);
yychar = YYEMPTY;
}
}
@@ -1211,7 +1216,7 @@ yyerrlab1:
YYABORT;
]b4_location_if([[ yyerror_range[0] = *yylsp;]])[
- yydestruct ("Error: popping", yystos[yystate], yyvsp]b4_location_if([,
yylsp])[);
+ yydestruct (_("Error: popping"), yystos[yystate],
yyvsp]b4_location_if([, yylsp])[);
YYPOPSTACK;
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
@@ -1229,7 +1234,7 @@ yyerrlab1:
*++yylsp = yyloc;]])[
/* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+ YY_SYMBOL_PRINT (_("Shifting"), yystos[yyn], yyvsp, yylsp);
yystate = yyn;
goto yynewstate;
@@ -1246,7 +1251,7 @@ yyacceptlab:
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
- yydestruct ("Error: discarding lookahead",
+ yydestruct (_("Error: discarding lookahead"),
yytoken, &yylval]b4_location_if([, &yylloc])[);
yychar = YYEMPTY;
yyresult = 1;
@@ -1257,7 +1262,7 @@ yyabortlab:
| yyoverflowlab -- parser overflow comes here. |
`----------------------------------------------*/
yyoverflowlab:
- yyerror (]b4_yyerror_args["parser stack overflow");
+ yyerror (]b4_yyerror_args[_("parser stack overflow"));
yyresult = 2;
/* Fall through. */
#endif
Index: doc/bison.texinfo
===================================================================
RCS file: /cvsroot/bison/bison/doc/bison.texinfo,v
retrieving revision 1.142
diff -p -u -r1.142 bison.texinfo
--- doc/bison.texinfo 1 Mar 2005 00:41:33 -0000 1.142
+++ doc/bison.texinfo 14 Apr 2005 00:07:47 -0000
@@ -1166,7 +1166,14 @@ start with a function called @code{main}
arrange for it to call @code{yyparse} or the parser will never run.
@xref{Interface, ,Parser C-Language Interface}.
-Aside from the token type names and the symbols in the actions you
+If your code defines a C preprocessor macro @code{_} (a single
+underscore), Bison assumes that it can be used to translate
+English-language strings to the user's preferred language using a
+function-like syntax, e.g., @code{_("syntax error")}. Otherwise,
+Bison defines a no-op macro by that name that merely returns its
+argument, so strings are not translated.
+
+Aside from @code{_} and the token type names and the symbols in the actions you
write, all symbols defined in the Bison parser file itself
begin with @samp{yy} or @samp{YY}. This includes interface functions
such as the lexical analyzer function @code{yylex}, the error reporting
Index: po/POTFILES.in
===================================================================
RCS file: /cvsroot/bison/bison/po/POTFILES.in,v
retrieving revision 1.19
diff -p -u -r1.19 POTFILES.in
--- po/POTFILES.in 13 Nov 2002 06:40:06 -0000 1.19
+++ po/POTFILES.in 14 Apr 2005 00:07:47 -0000
@@ -4,6 +4,7 @@ src/files.c
src/getargs.c
src/gram.c
src/main.c
+src/parse-gram.c
src/parse-gram.y
src/print.c
src/reader.c
- i18n for yacc backend messages, Jan Nieuwenhuizen, 2005/04/13
- Re: i18n for yacc backend messages, Paul Eggert, 2005/04/13
- Re: i18n for yacc backend messages, Jan Nieuwenhuizen, 2005/04/13
- Re: i18n for yacc backend messages,
Paul Eggert <=
- Re: i18n for yacc backend messages, Jan Nieuwenhuizen, 2005/04/14
- Re: i18n for yacc backend messages, Paul Eggert, 2005/04/14
- Re: i18n for yacc backend messages, Jan Nieuwenhuizen, 2005/04/14
- Re: i18n for yacc backend messages, Paul Eggert, 2005/04/16
- Re: i18n for yacc backend messages, Jan Nieuwenhuizen, 2005/04/16
- Re: i18n for yacc backend messages, Hans Aberg, 2005/04/16
- Re: i18n for yacc backend messages, Akim Demaille, 2005/04/18
- Re: i18n for yacc backend messages, Hans Aberg, 2005/04/18
- Re: i18n for yacc backend messages, Akim Demaille, 2005/04/18
- Re: i18n for yacc backend messages, Hans Aberg, 2005/04/18