From 30757c8c9355d76b2875757261c1d78e630690f4 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 18 Jul 2005 22:10:15 +0000 Subject: [PATCH] Add i18n support to the GLR skeleton. Partially fix the C++ skeleton; a C++ expert needs to finish this. Remove debugging msgids; there's little point to having them translated, since they can be understood only by someone who can read the (English-language) source code. Generate runtime-po/bison-runtime.pot automatically, so that we don't have to worry about garbage getting in that file. We'll make sure after the next official release that old msgids don't get lost. See . * runtime-po/Makefile.in.in, runtime-po/bison-runtime.pot: Remove. Now auto-generated. * PACKAGING: Don't claim that Gawk, GCC, Perl use this method yet. Fix typos in explanations of the runtime file. * bootstrap: Change gettext keyword from YYI18N to YY_. Use standard Makefile.in.in in runtime-po, since we'll arrange for backward-compatible bison-runtime.po files in a different way. * data/glr.c (YY_): New macro, from yacc.c. (yyuserAction, yyreportAmbiguity, yyreportSyntaxError, yyparse): Translate messages intended for users. (yyreportSyntaxError): Change "virtual memory" to "memory" to match the wording in the other skeletons. We don't know that the memory is virtual. * data/lalr1.cc (YY_): Renamed from _. All uses changed. Use same method that yacc.c uses. Don't translate debugging messages. (yy::yyreport_syntax_error): Put in a FIXME for the i18n stuff; it doesn't work (yet), and requires C++ expertise to fix. * data/yacc.c (YY_): Renamed from YY18N. All uses changed. Move defn to a more logical place, to be consistent with other skeletons. Don't translate debugging messages. Don't assume line numbers fit in unsigned int; use unsigned long fmts. * doc/bison.texinfo: Mention . Change glibc cross reference to gettext cross reference. Add indexing terms. Mention YYENABLE_NLS. * runtime-po/POTFILES.in: Add data/glr.c, data/lalr1.cc. --- ChangeLog | 39 +++++ PACKAGING | 10 +- bootstrap | 4 +- data/c.m4 | 2 +- data/glr.c | 28 +++- data/lalr1.cc | 55 ++++--- data/yacc.c | 74 ++++----- doc/bison.texinfo | 16 +- runtime-po/Makefile.in.in | 356 ------------------------------------------- runtime-po/POTFILES.in | 2 + runtime-po/bison-runtime.pot | 105 ------------- 11 files changed, 153 insertions(+), 538 deletions(-) delete mode 100644 runtime-po/Makefile.in.in delete mode 100644 runtime-po/bison-runtime.pot diff --git a/ChangeLog b/ChangeLog index 82929e9..a9207dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,44 @@ 2005-07-18 Paul Eggert + Add i18n support to the GLR skeleton. Partially fix the C++ + skeleton; a C++ expert needs to finish this. Remove debugging + msgids; there's little point to having them translated, since they + can be understood only by someone who can read the + (English-language) source code. + + Generate runtime-po/bison-runtime.pot automatically, so that we + don't have to worry about garbage getting in that file. We'll + make sure after the next official release that old msgids don't + get lost. See + . + + * runtime-po/Makefile.in.in, runtime-po/bison-runtime.pot: Remove. + Now auto-generated. + * PACKAGING: Don't claim that Gawk, GCC, Perl use this method yet. + Fix typos in explanations of the runtime file. + * bootstrap: Change gettext keyword from YYI18N to YY_. + Use standard Makefile.in.in in runtime-po, since we'll arrange + for backward-compatible bison-runtime.po files in a different way. + * data/glr.c (YY_): New macro, from yacc.c. + (yyuserAction, yyreportAmbiguity, yyreportSyntaxError, yyparse): + Translate messages intended for users. + (yyreportSyntaxError): Change "virtual memory" to "memory" to match + the wording in the other skeletons. We don't know that the memory + is virtual. + * data/lalr1.cc (YY_): Renamed from _. All uses changed. + Use same method that yacc.c uses. + Don't translate debugging messages. + (yy::yyreport_syntax_error): Put in a FIXME for the i18n stuff; + it doesn't work (yet), and requires C++ expertise to fix. + * data/yacc.c (YY_): Renamed from YY18N. All uses changed. + Move defn to a more logical place, to be consistent with other + skeletons. + Don't translate debugging messages. + Don't assume line numbers fit in unsigned int; use unsigned long fmts. + * doc/bison.texinfo: Mention . Change glibc cross reference + to gettext cross reference. Add indexing terms. Mention YYENABLE_NLS. + * runtime-po/POTFILES.in: Add data/glr.c, data/lalr1.cc. + Fix yyerror / yylex test glitches noted by twlevo@xs4all.nl. * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Have yyerror return void, not int. diff --git a/PACKAGING b/PACKAGING index 2b7d08c..dd285c9 100644 --- a/PACKAGING +++ b/PACKAGING @@ -17,8 +17,8 @@ be split into two packages: The 'bison-runtime' binary package is much smaller than the 'bison' binary package. It should be included in any distribution that -contains programs that use the diagnostics contained in -Bison-generated parsers, e.g., Gawk, GCC, Perl. +contains localized programs that use the diagnostics contained in +Bison-generated parsers. If you want to install both packages at the same time, you simply do at the toplevel directory: @@ -27,12 +27,12 @@ at the toplevel directory: make make install -After installation, the files +After installation, the file $prefix/share/locale/*/LC_MESSAGES/bison-runtime.mo -belong to the bison-runtime package; all other installed files belong -to in the bison package. +belongs to the bison-runtime package; all other installed files belong +to the bison package. ----- diff --git a/bootstrap b/bootstrap index 1207d6b..d5ff496 100755 --- a/bootstrap +++ b/bootstrap @@ -246,11 +246,11 @@ sed '/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-bison@gnu.org/' po/Makevars.template >p sed ' s/^\(DOMAIN\) *=.*/\1 = bison-runtime/ s/^\(subdir\) *=.*/\1 = runtime-po/ - s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = --keyword=YYI18N/ + s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = --keyword=YY_/ ' runtime-po/Makevars # Copy identical files from po to runtime-po. -(cd po && cp -p *-quot *.header *.sed *.sin ../runtime-po) +(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po) # if src/parse-gram.[ch] are out of date, rebuild them. parse_gram_y=`find src/parse-gram.y \ diff --git a/data/c.m4 b/data/c.m4 index 581402e..e9f0c05 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -403,7 +403,7 @@ b4_location_if([ (void) yylocationp; YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); ]b4_location_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp); - fprintf (yyoutput, ": "); + YYFPRINTF (yyoutput, ": "); ])dnl [ # ifdef YYPRINT diff --git a/data/glr.c b/data/glr.c index 23f5669..c6fe4c3 100644 --- a/data/glr.c +++ b/data/glr.c @@ -218,6 +218,18 @@ b4_syncline([@oline@], [@ofile@]) #include #include +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + #ifndef YYFREE # define YYFREE free #endif @@ -771,7 +783,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, # define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal) # undef YYBACKUP # define YYBACKUP(Token, Value) \ - return yyerror (]b4_yyerror_args["syntax error: cannot back up"), \ + return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")), \ yyerrok, yyerr yylow = 1; @@ -1524,7 +1536,7 @@ yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1, yyreportTree (yyx1, 2); YYFPRINTF (stderr, "\n"); #endif - yyFail (yystack][]b4_pure_args[, "ambiguity detected"); + yyFail (yystack][]b4_pure_args[, YY_("ambiguity detected")); } @@ -1774,8 +1786,8 @@ yyreportSyntaxError (yyGLRStack* yystack, yyprefix = yyor; } - yyf = yyformat; - yysize1 = yysize + (yyfmt - yyformat); + yyf = YY_(yyformat); + yysize1 = yysize + strlen (yyf); yysize_overflow |= yysize1 < yysize; yysize = yysize1; @@ -1803,11 +1815,11 @@ yyreportSyntaxError (yyGLRStack* yystack, YYFREE (yymsg); } else - yyerror (]b4_lyyerror_args["syntax error; also virtual memory exhausted"); + yyerror (]b4_lyyerror_args[YY_("syntax error; also memory exhausted")); } else #endif /* YYERROR_VERBOSE */ - yyerror (]b4_lyyerror_args["syntax error"); + yyerror (]b4_lyyerror_args[YY_("syntax error")); yynerrs += 1; } } @@ -2068,7 +2080,7 @@ b4_syncline([@oline@], [@ofile@])])dnl { yyundeleteLastStack (&yystack); if (yystack.yytops.yysize == 0) - yyFail (&yystack][]b4_lpure_args[, "syntax error"); + yyFail (&yystack][]b4_lpure_args[, YY_("syntax error")); YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); ]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ @@ -2098,7 +2110,7 @@ b4_syncline([@oline@], [@ofile@])])dnl goto yyreturn; yyoverflowlab: - yyerror (]b4_lyyerror_args["parser stack overflow"); + yyerror (]b4_lyyerror_args[YY_("parser stack overflow")); yyresult = 2; /* Fall through. */ diff --git a/data/lalr1.cc b/data/lalr1.cc index ed311fd..e42a2e5 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -417,9 +417,16 @@ m4_if(b4_defines_flag, 0, [], [ #include @output_header_name@])[ -/* INFRINGES ON USER NAME SPACE */ -#ifndef _ -# define _(msgid) msgid +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* FIXME: INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif #endif /* A pseudo ostream that takes yydebug_ into account. */ @@ -551,7 +558,7 @@ yy::]b4_parser_class_name[::parse () { int yyresult_; - YYCDEBUG << _("Starting parse") << std::endl; + YYCDEBUG << "Starting parse" << std::endl; yynerrs_ = 0; yyerrstatus_ = 0; @@ -583,7 +590,7 @@ b4_syncline([@oline@], [@ofile@])])dnl /* New state. */ yynewstate: yystate_stack_.push (yystate_); - YYCDEBUG << _("Entering state ") << yystate_ << std::endl; + YYCDEBUG << "Entering state " << yystate_ << std::endl; goto yybackup; /* Backup. */ @@ -602,12 +609,12 @@ yybackup: if (yylooka_ <= yyeof_) { yylooka_ = yyilooka_ = yyeof_; - YYCDEBUG << _("Now at end of input.") << std::endl; + YYCDEBUG << "Now at end of input." << std::endl; } else { yyilooka_ = yytranslate_ (yylooka_); - YY_SYMBOL_PRINT (_("Next token is"), yyilooka_, &yylval, &yylloc); + YY_SYMBOL_PRINT ("Next token is", yyilooka_, &yylval, &yylloc); } /* If the proper action on seeing token ILOOKA_ is to reduce or to @@ -636,7 +643,7 @@ yybackup: goto yyacceptlab; /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT (_("Shifting"), yyilooka_, &yylval, &yylloc); + YY_SYMBOL_PRINT ("Shifting", yyilooka_, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yylooka_ != yyeof_) @@ -734,7 +741,7 @@ yyerrlab: yypop_ (); if (yystate_stack_.height () == 1) YYABORT; - yydestruct_ (_("Error: popping"), + yydestruct_ ("Error: popping", yystos_[yystate_stack_[0]], &yysemantic_stack_[0], &yylocation_stack_[0]); @@ -742,7 +749,7 @@ yyerrlab: } else { - yydestruct_ (_("Error: discarding"), yyilooka_, &yylval, &yylloc); + yydestruct_ ("Error: discarding", yyilooka_, &yylval, &yylloc); yylooka_ = yyempty_; } } @@ -793,7 +800,7 @@ yyerrlab1: YYABORT; yyerror_range_[0] = yylocation_stack_[0]; - yydestruct_ (_("Error: popping"), + yydestruct_ ("Error: popping", yystos_[yystate_], &yysemantic_stack_[0], &yylocation_stack_[0]); yypop_ (); @@ -812,7 +819,7 @@ yyerrlab1: yylocation_stack_.push (yyloc); /* Shift the error token. */ - YY_SYMBOL_PRINT (_("Shifting"), yystos_[yyn_], + YY_SYMBOL_PRINT ("Shifting", yystos_[yyn_], &yysemantic_stack_[0], &yylocation_stack_[0]); yystate_ = yyn_; @@ -830,14 +837,14 @@ yyabortlab: yyreturn: if (yylooka_ != yyeof_ && yylooka_ != yyempty_) - yydestruct_ (_("Error: discarding lookahead"), yyilooka_, &yylval, &yylloc); + yydestruct_ ("Error: discarding lookahead", yyilooka_, &yylval, &yylloc); return yyresult_; } void yy::]b4_parser_class_name[::yylex_ () { - YYCDEBUG << _("Reading a token: "); + YYCDEBUG << "Reading a token: "; yylooka_ = ]b4_c_function_call([yylex], [int], [[YYSTYPE*], [&yylval]][]dnl b4_location_if([, [[location*], [&yylloc]]])dnl @@ -869,7 +876,15 @@ yy::]b4_parser_class_name[::yyreport_syntax_error_ () if (yycheck_[x + yyn_] == x && x != yyterror_) ++count; - message = _("syntax error, unexpected "); + // FIXME: This method of building the message is not compatible + // with internationalization. It should work like yacc.c does it. + // That is, first build a string that looks like this: + // "syntax error, unexpected %s or %s or %s" + // Then, invoke YY_ on this string. + // Finally, use the string as a format to output + // yyname_[yyilooka_], etc. + // Until this gets fixed, this message appears in English only. + message = "syntax error, unexpected "; message += yyname_[yyilooka_]; if (count < 5) { @@ -877,14 +892,14 @@ yy::]b4_parser_class_name[::yyreport_syntax_error_ () for (int x = yyxbegin; x < yyxend; ++x) if (yycheck_[x + yyn_] == x && x != yyterror_) { - message += (!count++) ? _(", expecting ") : _(" or "); + message += (!count++) ? ", expecting " : " or "; message += yyname_[x]; } } } else #endif - message = _("syntax error"); + message = YY_("syntax error"); error (yylloc, message); } } @@ -1008,7 +1023,7 @@ yy::]b4_parser_class_name[::yyrline_[] = void yy::]b4_parser_class_name[::yystack_print_ () { - *yycdebug_ << _("Stack now"); + *yycdebug_ << "Stack now"; for (state_stack_type::const_iterator i = yystate_stack_.begin (); i != yystate_stack_.end (); ++i) *yycdebug_ << ' ' << *i; @@ -1021,8 +1036,8 @@ yy::]b4_parser_class_name[::yyreduce_print_ (int yyrule) { unsigned int yylno = yyrline_[yyrule]; /* Print the symbols being reduced, and their result. */ - *yycdebug_ << _("Reducing stack by rule ") << yyn_ - 1 - << " (" << _("line") << ' ' << yylno << "), "; + *yycdebug_ << "Reducing stack by rule " << yyn_ - 1 + << " (line " << yylno << "), "; for (]b4_int_type_for([b4_prhs])[ i = yyprhs_[yyn_]; 0 <= yyrhs_[i]; ++i) *yycdebug_ << yyname_[yyrhs_[i]] << ' '; diff --git a/data/yacc.c b/data/yacc.c index 7486841..1d54e3b 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -228,6 +228,18 @@ b4_syncline([@oline@], [@ofile@])[ # define YYSIZE_T unsigned int #endif +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + #if ! defined (yyoverflow) || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -412,18 +424,6 @@ static const char *const yytname[] = }; #endif -#ifndef YYI18N -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YYI18N(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YYI18N -# define YYI18N(msgid) msgid -# endif -#endif - # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ @@ -525,7 +525,7 @@ do \ } \ else \ { \ - yyerror (]b4_yyerror_args[YYI18N ("syntax error: cannot back up")); \ + yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) @@ -619,7 +619,7 @@ do { \ [[short int *bottom], [bottom]], [[short int *top], [top]])[ { - YYFPRINTF (stderr, YYI18N ("Stack now")); + YYFPRINTF (stderr, "Stack now"); for (/* Nothing. */; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); @@ -640,8 +640,8 @@ do { \ [[int yyrule], [yyrule]])[ { int yyi; - unsigned int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, YYI18N ("Reducing stack by rule %d (line %u), "), + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", yyrule - 1, yylno); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) @@ -911,7 +911,7 @@ m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc; 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 (YYI18N ("parser stack overflow"), + yyoverflow (YY_("parser stack overflow"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), ]b4_location_if([ &yyls1, yysize * sizeof (*yylsp),])[ @@ -951,14 +951,14 @@ m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc; yyvsp = yyvs + yysize - 1; ]b4_location_if([ yylsp = yyls + yysize - 1;])[ - YYDPRINTF ((stderr, YYI18N ("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, YYI18N ("Entering state %d\n"), yystate)); + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; @@ -982,19 +982,19 @@ yybackup: /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, YYI18N ("Reading a token: "))); + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, YYI18N ("Now at end of input.\n"))); + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT (YYI18N ("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 @@ -1015,7 +1015,7 @@ yybackup: YYACCEPT; /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT (YYI18N ("Shifting"), yytoken, &yylval, &yylloc); + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) @@ -1123,11 +1123,11 @@ yyerrlab: #if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ - YYI18N ("syntax error, unexpected %s"); - YYI18N ("syntax error, unexpected %s, expecting %s"); - YYI18N ("syntax error, unexpected %s, expecting %s or %s"); - YYI18N ("syntax error, unexpected %s, expecting %s or %s or %s"); - YYI18N ("syntax error, unexpected %s, expecting %s or %s or %s or %s"); + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); #endif char *yyfmt; char const *yyf; @@ -1170,7 +1170,7 @@ yyerrlab: yyprefix = yyor; } - yyf = YYI18N (yyformat); + yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= yysize1 < yysize; yysize = yysize1; @@ -1201,11 +1201,11 @@ yyerrlab: YYSTACK_FREE (yymsg); } else - yyerror (]b4_yyerror_args[YYI18N ("syntax error; also memory exhausted")); + yyerror (]b4_yyerror_args[YY_("syntax error; also memory exhausted")); } else #endif /* YYERROR_VERBOSE */ - yyerror (]b4_yyerror_args[YYI18N ("syntax error")); + yyerror (]b4_yyerror_args[YY_("syntax error")); } ]b4_location_if([[ yyerror_range[0] = yylloc;]])[ @@ -1224,7 +1224,7 @@ yyerrlab: } else { - yydestruct (YYI18N ("Error: discarding"), yytoken, &yylval]b4_location_if([, &yylloc])[); + yydestruct ("Error: discarding", yytoken, &yylval]b4_location_if([, &yylloc])[); yychar = YYEMPTY; } } @@ -1278,7 +1278,7 @@ yyerrlab1: YYABORT; ]b4_location_if([[ yyerror_range[0] = *yylsp;]])[ - yydestruct (YYI18N ("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); @@ -1296,7 +1296,7 @@ yyerrlab1: *++yylsp = yyloc;]])[ /* Shift the error token. */ - YY_SYMBOL_PRINT (YYI18N ("Shifting"), yystos[yyn], yyvsp, yylsp); + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; @@ -1321,14 +1321,14 @@ yyabortlab: | yyoverflowlab -- parser overflow comes here. | `----------------------------------------------*/ yyoverflowlab: - yyerror (]b4_yyerror_args[YYI18N ("parser stack overflow")); + yyerror (]b4_yyerror_args[YY_("parser stack overflow")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct (YYI18N ("Error: discarding lookahead"), + yydestruct ("Error: discarding lookahead", yytoken, &yylval]b4_location_if([, &yylloc])[); if (yyssp != yyss) for (;;) @@ -1337,7 +1337,7 @@ yyreturn: YYPOPSTACK; if (yyssp == yyss) break; - yydestruct (YYI18N ("Error: popping"), + yydestruct ("Error: popping", yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[); } #ifndef yyoverflow diff --git a/doc/bison.texinfo b/doc/bison.texinfo index a8c60bc..1d4097e 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -1203,7 +1203,9 @@ In some cases the Bison parser file includes system headers, and in those cases your code should respect the identifiers reserved by those headers. On some non-@acronym{GNU} hosts, @code{}, @code{}, and @code{} are included as needed to -declare memory allocators and related types. Other system headers may +declare memory allocators and related types. @code{} is +included if message translation is in use +(@pxref{Internationalization}). Other system headers may be included if you define @code{YYDEBUG} to a nonzero value (@pxref{Tracing, ,Tracing Your Parser}). @@ -4821,8 +4823,8 @@ A Bison-generated parser can print diagnostics, including error and tracing messages. By default, they appear in English. However, Bison also supports outputting diagnostics in the user's native language. To make this work, the user should set the usual environment -variables. @xref{Using gettextized software, , User influence on -@code{gettext}, libc, The GNU C Library Reference Manual}. For +variables. @xref{Users, , The User's View, gettext, GNU +@code{gettext} utilities}. For example, the shell command @samp{export LC_ALL=fr_CA.UTF-8} might set the user's locale to French Canadian using the @acronym{UTF}-8 encoding. The exact set of available locales depends on the user's @@ -4835,6 +4837,7 @@ steps. Here we assume a package that uses @acronym{GNU} Autoconf and @enumerate @item +@cindex bison-i18n.m4 Into the directory containing the @acronym{GNU} Autoconf macros used by the package---often called @file{m4}---copy the @file{bison-i18n.m4} file installed by Bison under @@ -4846,11 +4849,16 @@ cp /usr/local/share/aclocal/bison-i18n.m4 m4/bison-i18n.m4 @end example @item +@findex BISON_I18N +@vindex BISON_LOCALEDIR +@vindex YYENABLE_NLS In the top-level @file{configure.ac}, after the @code{AM_GNU_GETTEXT} invocation, add an invocation of @code{BISON_I18N}. This macro is defined in the file @file{bison-i18n.m4} that you copied earlier. It causes @samp{configure} to find the value of the -@code{BISON_LOCALEDIR} variable. +@code{BISON_LOCALEDIR} variable, and it defines the source-language +symbol @code{YYENABLE_NLS} to enable translations in the +Bison-generated parser. @item In the @code{main} function of your program, designate the directory diff --git a/runtime-po/Makefile.in.in b/runtime-po/Makefile.in.in deleted file mode 100644 index 2aee216..0000000 --- a/runtime-po/Makefile.in.in +++ /dev/null @@ -1,356 +0,0 @@ -# Makefile for PO directory in any package using GNU gettext. -# Copyright (C) 1995-1997, 2000-2003 by Ulrich Drepper -# -# This file can be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU General Public -# License but which still want to provide support for the GNU gettext -# functionality. -# Please note that the actual code of GNU gettext is covered by the GNU -# General Public License and is *not* in the public domain. - -PACKAGE = @PACKAGE@ -VERSION = @VERSION@ - -SHELL = /bin/sh -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -datadir = @datadir@ -localedir = $(datadir)/locale -gettextsrcdir = $(datadir)/gettext/po - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -MKINSTALLDIRS = @MKINSTALLDIRS@ -mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) - -GMSGFMT = @GMSGFMT@ -MSGFMT = @MSGFMT@ -XGETTEXT = @XGETTEXT@ -MSGMERGE = msgmerge -MSGMERGE_UPDATE = @MSGMERGE@ --update -MSGINIT = msginit -MSGCONV = msgconv -MSGFILTER = msgfilter - -POFILES = @POFILES@ -GMOFILES = @GMOFILES@ -UPDATEPOFILES = @UPDATEPOFILES@ -DUMMYPOFILES = @DUMMYPOFILES@ -DISTFILES.common = Makefile.in.in remove-potcdate.sin \ -$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) -DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \ -$(POFILES) $(GMOFILES) \ -$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) - -POTFILES = \ - -CATALOGS = @CATALOGS@ - -# Makevars gets inserted here. (Don't remove this line!) - -.SUFFIXES: -.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-update - -.po.mo: - @echo "$(MSGFMT) -c -o $@ $<"; \ - $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ - -.po.gmo: - @lang=`echo $* | sed -e 's,.*/,,'`; \ - test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ - cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo - -.sin.sed: - sed -e '/^#/d' $< > t-$@ - mv t-$@ $@ - - -all: all-@USE_NLS@ - -all-yes: stamp-po -all-no: - -# stamp-po is a timestamp denoting the last time at which the CATALOGS have -# been loosely updated. Its purpose is that when a developer or translator -# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, -# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent -# invocations of "make" will do nothing. This timestamp would not be necessary -# if updating the $(CATALOGS) would always touch them; however, the rule for -# $(POFILES) has been designed to not touch files that don't need to be -# changed. -stamp-po: $(srcdir)/$(DOMAIN).pot - test -z "$(CATALOGS)" || $(MAKE) $(CATALOGS) - @echo "touch stamp-po" - @echo timestamp > stamp-poT - @mv stamp-poT stamp-po - -# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', -# otherwise packages like GCC can not be built if only parts of the source -# have been downloaded. - -# This target rebuilds $(DOMAIN).pot; it is an expensive operation. -# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. -$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed - $(XGETTEXT) -o $(DOMAIN).old.pot --no-location $(DOMAIN).pot && \ - $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ - --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ - --files-from=$(srcdir)/POTFILES.in $(subdir)/$(DOMAIN).old.pot \ - --copyright-holder='$(COPYRIGHT_HOLDER)' \ - --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' - rm -f $(DOMAIN).old.pot - test ! -f $(DOMAIN).po || { \ - if test -f $(srcdir)/$(DOMAIN).pot; then \ - sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ - sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ - if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ - rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ - else \ - rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ - mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ - fi; \ - else \ - mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ - fi; \ - } - -# This rule has no dependencies: we don't need to update $(DOMAIN).pot at -# every "make" invocation, only create it when it is missing. -# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. -$(srcdir)/$(DOMAIN).pot: - $(MAKE) $(DOMAIN).pot-update - -# This target rebuilds a PO file if $(DOMAIN).pot has changed. -# Note that a PO file is not touched if it doesn't need to be changed. -$(POFILES): $(srcdir)/$(DOMAIN).pot - @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ - test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ - cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot - - -install: install-exec install-data -install-exec: -install-data: install-data-@USE_NLS@ - if test "$(PACKAGE)" = "gettext-tools"; then \ - $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ - for file in $(DISTFILES.common) Makevars.template; do \ - $(INSTALL_DATA) $(srcdir)/$$file \ - $(DESTDIR)$(gettextsrcdir)/$$file; \ - done; \ - for file in Makevars; do \ - rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ - done; \ - else \ - : ; \ - fi -install-data-no: all -install-data-yes: all - $(mkinstalldirs) $(DESTDIR)$(datadir) - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ - dir=$(localedir)/$$lang/LC_MESSAGES; \ - $(mkinstalldirs) $(DESTDIR)$$dir; \ - if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ - $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ - echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ - for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ - if test -n "$$lc"; then \ - if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ - link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ - mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ - for file in *; do \ - if test -f $$file; then \ - ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ - fi; \ - done); \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - else \ - if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ - :; \ - else \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - fi; \ - fi; \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ - ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ - ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ - cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ - echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ - fi; \ - done; \ - done - -install-strip: install - -installdirs: installdirs-exec installdirs-data -installdirs-exec: -installdirs-data: installdirs-data-@USE_NLS@ - if test "$(PACKAGE)" = "gettext-tools"; then \ - $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ - else \ - : ; \ - fi -installdirs-data-no: -installdirs-data-yes: - $(mkinstalldirs) $(DESTDIR)$(datadir) - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ - dir=$(localedir)/$$lang/LC_MESSAGES; \ - $(mkinstalldirs) $(DESTDIR)$$dir; \ - for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ - if test -n "$$lc"; then \ - if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ - link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ - mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ - for file in *; do \ - if test -f $$file; then \ - ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ - fi; \ - done); \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - else \ - if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ - :; \ - else \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - fi; \ - fi; \ - fi; \ - done; \ - done - -# Define this as empty until I found a useful application. -installcheck: - -uninstall: uninstall-exec uninstall-data -uninstall-exec: -uninstall-data: uninstall-data-@USE_NLS@ - if test "$(PACKAGE)" = "gettext-tools"; then \ - for file in $(DISTFILES.common) Makevars.template; do \ - rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ - done; \ - else \ - : ; \ - fi -uninstall-data-no: -uninstall-data-yes: - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ - for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ - done; \ - done - -check: all - -info dvi ps pdf html tags TAGS ctags CTAGS ID: - -mostlyclean: - rm -f remove-potcdate.sed - rm -f stamp-poT - rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po - rm -f *.old.pot - rm -fr *.o - -clean: mostlyclean - -distclean: clean - rm -f Makefile Makefile.in POTFILES *.mo - -maintainer-clean: distclean - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - rm -f stamp-po $(GMOFILES) - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) -dist distdir: - $(MAKE) update-po - @$(MAKE) dist2 -# This is a separate target because 'update-po' must be executed before. -dist2: $(DISTFILES) - dists="$(DISTFILES)"; \ - if test "$(PACKAGE)" = "gettext-tools"; then \ - dists="$$dists Makevars.template"; \ - fi; \ - if test -f $(srcdir)/ChangeLog; then \ - dists="$$dists ChangeLog"; \ - fi; \ - for i in 0 1 2 3 4 5 6 7 8 9; do \ - if test -f $(srcdir)/ChangeLog.$$i; then \ - dists="$$dists ChangeLog.$$i"; \ - fi; \ - done; \ - if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ - for file in $$dists; do \ - if test -f $$file; then \ - cp -p $$file $(distdir); \ - else \ - cp -p $(srcdir)/$$file $(distdir); \ - fi; \ - done - -update-po: Makefile - $(MAKE) $(DOMAIN).pot-update - test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) - $(MAKE) update-gmo - -# General rule for updating PO files. - -.nop.po-update: - @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ - if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ - tmpdir=`pwd`; \ - echo "$$lang:"; \ - test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ - cd $(srcdir); \ - if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ - if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ - rm -f $$tmpdir/$$lang.new.po; \ - else \ - if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ - :; \ - else \ - echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ - exit 1; \ - fi; \ - fi; \ - else \ - echo "msgmerge for $$lang.po failed!" 1>&2; \ - rm -f $$tmpdir/$$lang.new.po; \ - fi - -$(DUMMYPOFILES): - -update-gmo: Makefile $(GMOFILES) - @: - -Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@ - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ - $(SHELL) ./config.status - -force: - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/runtime-po/POTFILES.in b/runtime-po/POTFILES.in index ca81b5e..7e73063 100644 --- a/runtime-po/POTFILES.in +++ b/runtime-po/POTFILES.in @@ -1 +1,3 @@ +data/glr.c +data/lalr1.cc data/yacc.c diff --git a/runtime-po/bison-runtime.pot b/runtime-po/bison-runtime.pot deleted file mode 100644 index ed1b6bb..0000000 --- a/runtime-po/bison-runtime.pot +++ /dev/null @@ -1,105 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" -"POT-Creation-Date: 2005-06-27 00:48+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: data/yacc.c:520 -msgid "syntax error: cannot back up" -msgstr "" - -#: data/yacc.c:614 -msgid "Stack now" -msgstr "" - -#: data/yacc.c:636 -#, c-format -msgid "Reducing stack by rule %d (line %u), " -msgstr "" - -#: data/yacc.c:905 data/yacc.c:1315 -msgid "parser stack overflow" -msgstr "" - -#: data/yacc.c:945 -#, c-format -msgid "Stack size increased to %lu\n" -msgstr "" - -#: data/yacc.c:952 -#, c-format -msgid "Entering state %d\n" -msgstr "" - -#: data/yacc.c:976 -msgid "Reading a token: " -msgstr "" - -#: data/yacc.c:983 -msgid "Now at end of input.\n" -msgstr "" - -#: data/yacc.c:988 -msgid "Next token is" -msgstr "" - -#: data/yacc.c:1009 data/yacc.c:1290 -msgid "Shifting" -msgstr "" - -#: data/yacc.c:1117 -#, c-format -msgid "syntax error, unexpected %s" -msgstr "" - -#: data/yacc.c:1118 -#, c-format -msgid "syntax error, unexpected %s, expecting %s" -msgstr "" - -#: data/yacc.c:1119 -#, c-format -msgid "syntax error, unexpected %s, expecting %s or %s" -msgstr "" - -#: data/yacc.c:1120 -#, c-format -msgid "syntax error, unexpected %s, expecting %s or %s or %s" -msgstr "" - -#: data/yacc.c:1121 -#, c-format -msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s" -msgstr "" - -#: data/yacc.c:1195 -msgid "syntax error; also memory exhausted" -msgstr "" - -#: data/yacc.c:1199 -msgid "syntax error" -msgstr "" - -#: data/yacc.c:1218 -msgid "Error: discarding" -msgstr "" - -#: data/yacc.c:1272 data/yacc.c:1331 -msgid "Error: popping" -msgstr "" - -#: data/yacc.c:1322 -msgid "Error: discarding lookahead" -msgstr "" -- 2.7.4