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.
+2005-04-13 Paul Eggert <eggert@cs.ucla.edu>
+
+ * 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.
+
2005-04-12 Paul Eggert <eggert@cs.ucla.edu>
* src/symtab.c (symbol_make_alias): Call symbol_type_set,
2005-04-12 Paul Eggert <eggert@cs.ucla.edu>
* src/symtab.c (symbol_make_alias): Call symbol_type_set,
+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
Changes in version 2.0, 2004-12-25:
* Possibly-incompatible changes
-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.
Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
+/* INFRINGES ON USER NAME SPACE */
+#ifndef _
+# define _(msgid) msgid
+#endif
+
# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
token YYLEX-NUM. */
# ifdef YYPRINT
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
token YYLEX-NUM. */
- yyerror (]b4_yyerror_args["syntax error: cannot back up");\
+ yyerror (]b4_yyerror_args[_("syntax error: cannot back up")); \
[[short int *bottom], [bottom]],
[[short int *top], [top]])[
{
[[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");
for (/* Nothing. */; bottom <= top; ++bottom)
YYFPRINTF (stderr, " %d", *bottom);
YYFPRINTF (stderr, "\n");
{
int yyi;
unsigned int yylno = yyrline[yyrule];
{
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++)
yyrule - 1, yylno);
/* Print the symbols being reduced, and their result. */
for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
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. */
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),])[
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
]b4_location_if([ &yyls1, yysize * sizeof (*yylsp),])[
yyvsp = yyvs + yysize - 1;
]b4_location_if([ yylsp = yyls + yysize - 1;])[
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;
}
(unsigned long int) yystacksize));
if (yyss + yystacksize - 1 <= yyssp)
YYABORT;
}
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YYDPRINTF ((stderr, _("Entering state %d\n"), yystate));
/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
if (yychar == YYEMPTY)
{
/* 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;
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);
}
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
}
/* If the proper action on seeing token YYTOKEN is to reduce or to
YYACCEPT;
/* Shift the look-ahead token. */
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)
/* Discard the token being shifted unless it is eof. */
if (yychar != YYEOF)
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yycount = 0;
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)
{
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
- 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)
{
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)
{
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]);
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
yyp = yystpcpy (yyp, yyprefix);
yyp = yystpcpy (yyp, yytname[yyx]);
}
}
yyerror (]b4_yyerror_args[yymsg);
YYSTACK_FREE (yymsg);
}
else
}
}
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 */
}
else
#endif /* YYERROR_VERBOSE */
- yyerror (]b4_yyerror_args["syntax error");
+ yyerror (]b4_yyerror_args[_("syntax error"));
}
]b4_location_if([[ yyerror_range[0] = yylloc;]])[
}
]b4_location_if([[ yyerror_range[0] = yylloc;]])[
YYPOPSTACK;
if (yyssp == yyss)
YYABORT;
YYPOPSTACK;
if (yyssp == yyss)
YYABORT;
- yydestruct ("Error: popping",
+ yydestruct (_("Error: popping"),
yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[);
}
}
else
{
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])[);
YYABORT;
]b4_location_if([[ yyerror_range[0] = *yylsp;]])[
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);
YYPOPSTACK;
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
*++yylsp = yyloc;]])[
/* Shift the error token. */
*++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;
yystate = yyn;
goto yynewstate;
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
- yydestruct ("Error: discarding lookahead",
+ yydestruct (_("Error: discarding lookahead"),
yytoken, &yylval]b4_location_if([, &yylloc])[);
yychar = YYEMPTY;
yyresult = 1;
yytoken, &yylval]b4_location_if([, &yylloc])[);
yychar = YYEMPTY;
yyresult = 1;
| yyoverflowlab -- parser overflow comes here. |
`----------------------------------------------*/
yyoverflowlab:
| 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
yyresult = 2;
/* Fall through. */
#endif
arrange for it to call @code{yyparse} or the parser will never run.
@xref{Interface, ,Parser C-Language Interface}.
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
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
src/getargs.c
src/gram.c
src/main.c
src/getargs.c
src/gram.c
src/main.c
src/parse-gram.y
src/print.c
src/reader.c
src/parse-gram.y
src/print.c
src/reader.c