[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Untranslatable messages
From: |
Akim Demaille |
Subject: |
Re: Untranslatable messages |
Date: |
10 Nov 2001 20:49:57 +0100 |
User-agent: |
Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Artificial Intelligence) |
>>>>> "Göran" == Göran Uddeborg <address@hidden> writes:
Göran> I'm working on the translation of bison 1.30a. In src/reduce.c
Göran> there are a number of instances where you assume "s" is a
Göran> universal plural ending:
It's funny that you refer to this, because I precisely have a patch in
the queue that addresses this issue. Well, partly.
Index: ChangeLog
from Akim Demaille <address@hidden>
%expext was not functioning at all.
* src/conflicts.c (expected_conflicts): Set to -1.
(conflict_report): Use ngettext.
(conflicts_print): Check %expect and make its violation an error.
* doc/bison.texinfo (Expect Decl): Adjust.
* configure.in (AM_GNU_GETTEXT): Ask for ngettext.
* tests/regression.at (%expect not enough, %expect right)
(%expect too much): New.
Index: NEWS
--- NEWS Sun, 04 Nov 2001 17:13:49 +0100 akim
+++ NEWS Sat, 10 Nov 2001 15:59:07 +0100 akim
@@ -3,6 +3,21 @@
Changes in version 1.30a:
+* Fixed parser memory leaks.
+ When the generated parser was using malloc to extend its stacks, the
+ previous allocations were not freed.
+
+* Fixed verbose output file.
+ Some newlines were missing.
+ Some conflicts in state descriptions were missing.
+
+* Fixed conflict report.
+ Option -v was needed to get the result.
+
+* %expect
+ Was not used.
+ Mismatches are errors, not warnings.
+
* Fixed incorrect processing of some invalid input.
* Fixed CPP guards: 9foo.h uses BISON_9FOO_H instead of 9FOO_H.
Index: configure.in
--- configure.in Fri, 02 Nov 2001 19:28:01 +0100 akim
+++ configure.in Sat, 10 Nov 2001 14:59:00 +0100 akim
@@ -90,7 +90,7 @@
AM_WITH_DMALLOC
ALL_LINGUAS="de es et fr ja nl tr ru"
-AM_GNU_GETTEXT
+AM_GNU_GETTEXT(, need-ngettext)
# This is necessary so that .o files in LIBOBJS are also built via
# the ANSI2KNR-filtering rules.
Index: doc/bison.texinfo
--- doc/bison.texinfo Sun, 04 Nov 2001 23:29:11 +0100 akim
+++ doc/bison.texinfo Sat, 10 Nov 2001 15:54:15 +0100 akim
@@ -3070,11 +3070,11 @@ @node Expect Decl
@findex %expect
Bison normally warns if there are any conflicts in the grammar
-(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars have
harmless shift/reduce
-conflicts which are resolved in a predictable way and would be difficult to
-eliminate. It is desirable to suppress the warning about these conflicts
-unless the number of conflicts changes. You can do this with the
address@hidden declaration.
+(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars
+have harmless shift/reduce conflicts which are resolved in a predictable
+way and would be difficult to eliminate. It is desirable to suppress
+the warning about these conflicts unless the number of conflicts
+changes. You can do this with the @code{%expect} declaration.
The declaration looks like this:
@@ -3082,10 +3082,11 @@ @node Expect Decl
%expect @var{n}
@end example
-Here @var{n} is a decimal integer. The declaration says there should be no
-warning if there are @var{n} shift/reduce conflicts and no reduce/reduce
-conflicts. The usual warning is given if there are either more or fewer
-conflicts, or if there are any reduce/reduce conflicts.
+Here @var{n} is a decimal integer. The declaration says there should be
+no warning if there are @var{n} shift/reduce conflicts and no
+reduce/reduce conflicts. An error, instead of the usual warning, is
+given if there are either more or fewer conflicts, or if there are any
+reduce/reduce conflicts.
In general, using @code{%expect} involves these steps:
Index: src/conflicts.c
--- src/conflicts.c Sat, 10 Nov 2001 13:45:46 +0100 akim
+++ src/conflicts.c Sat, 10 Nov 2001 15:50:56 +0100 akim
@@ -19,6 +19,7 @@
02111-1307, USA. */
#include "system.h"
+#include "complain.h"
#include "getargs.h"
#include "files.h"
#include "gram.h"
@@ -29,7 +30,8 @@
#include "LR0.h"
errs **err_table = NULL;
-int expected_conflicts;
+/* -1 stands for not specified. */
+int expected_conflicts = -1;
static char *conflicts = NULL;
static unsigned *shiftset = NULL;
@@ -404,31 +406,23 @@
static char res[4096];
char *cp = res;
- if (src_num == 1)
+ if (src_num >= 1)
{
- sprintf (cp, _(" 1 shift/reduce conflict"));
- cp += strlen (cp);
- }
- else if (src_num > 1)
- {
- sprintf (cp, _(" %d shift/reduce conflicts"), src_num);
+ sprintf (cp, ngettext ("%d shift/reduce conflict",
+ "%d shift/reduce conflicts", src_num), src_num);
cp += strlen (cp);
}
if (src_num > 0 && rrc_num > 0)
{
- sprintf (cp, _(" and"));
+ sprintf (cp, " %s ", _("and"));
cp += strlen (cp);
}
- if (rrc_num == 1)
+ if (rrc_num >= 1)
{
- sprintf (cp, _(" 1 reduce/reduce conflict"));
- cp += strlen (cp);
- }
- else if (rrc_num > 1)
- {
- sprintf (cp, _(" %d reduce/reduce conflicts"), rrc_num);
+ sprintf (cp, ngettext ("%d reduce/reduce conflict",
+ "%d reduce/reduce conflicts", rrc_num), rrc_num);
cp += strlen (cp);
}
@@ -451,7 +445,7 @@
for (i = 0; i < nstates; i++)
if (conflicts[i])
{
- fprintf (out, _("State %d contains"), i);
+ fprintf (out, _("State %d contains "), i);
fputs (conflict_report (count_sr_conflicts (i),
count_rr_conflicts (i)), out);
}
@@ -495,9 +489,19 @@
}
else
{
- fprintf (stderr, _("%s contains"), infile);
+ fprintf (stderr, _("%s contains "), infile);
fputs (conflict_report (src_total, rrc_total), stderr);
}
+
+ if (expected_conflicts != -1
+ && src_total != expected_conflicts)
+ {
+ complain_message_count++;
+ fprintf (stderr, ngettext ("expected %d shift/reduce conflict",
+ "expected %d shift/reduce conflicts",
+ expected_conflicts),
+ expected_conflicts);
+ }
}
Index: src/main.c
--- src/main.c Sat, 10 Nov 2001 14:09:09 +0100 akim
+++ src/main.c Sat, 10 Nov 2001 15:48:21 +0100 akim
@@ -62,15 +62,16 @@
if (complain_message_count)
exit (1);
- /* find useless nonterminals and productions and reduce the grammar. In
- file reduce.c */
+ /* Find useless nonterminals and productions and reduce the grammar.
+ In file reduce.c. */
reduce_grammar ();
- /* record other info about the grammar. In files derives and nullable. */
+ /* Record other info about the grammar. In files derives and
+ nullable. */
set_derives ();
set_nullable ();
- /* convert to nondeterministic finite state machine. In file LR0.
+ /* Convert to nondeterministic finite state machine. In file LR0.
See state.h for more info. */
generate_states ();
@@ -101,13 +102,13 @@
/* Output the tables and the parser to ftable. In file output. */
output ();
+ /* Close the input files. */
+ close_files ();
+
/* Free the symbol table data structure. */
free_symtab ();
lex_free ();
-
- /* Close the input files. */
- close_files ();
reduce_free ();
free_conflicts ();
Index: tests/regression.at
--- tests/regression.at Sat, 10 Nov 2001 14:21:33 +0100 akim
+++ tests/regression.at Sat, 10 Nov 2001 15:53:25 +0100 akim
@@ -239,6 +239,66 @@ exp: exp OP exp | NUM;
AT_CLEANUP(input.c input.output)
+
+## -------------------- ##
+## %expect not enough. ##
+## -------------------- ##
+
+AT_SETUP([%expect not enough])
+
+AT_DATA([input.y],
+[[%token NUM OP
+%expect 0
+%%
+exp: exp OP exp | NUM;
+]])
+
+AT_CHECK([bison input.y -o input.c], 1, [],
+[input.y contains 1 shift/reduce conflict.
+expected 0 shift/reduce conflicts
+])
+AT_CLEANUP(input.c)
+
+
+## --------------- ##
+## %expect right. ##
+## --------------- ##
+
+AT_SETUP([%expect right])
+
+AT_DATA([input.y],
+[[%token NUM OP
+%expect 1
+%%
+exp: exp OP exp | NUM;
+]])
+
+AT_CHECK([bison input.y -o input.c], 0, [],
+[input.y contains 1 shift/reduce conflict.
+])
+AT_CLEANUP(input.c)
+
+
+## ------------------ ##
+## %expect too much. ##
+## ------------------ ##
+
+AT_SETUP([%expect too much])
+
+AT_DATA([input.y],
+[[%token NUM OP
+%expect 2
+%%
+exp: exp OP exp | NUM;
+]])
+
+AT_CHECK([bison input.y -o input.c], 1, [],
+[input.y contains 1 shift/reduce conflict.
+expected 2 shift/reduce conflicts
+])
+AT_CLEANUP(input.c)
+
+
## ---------------------- ##
## Mixing %token styles. ##
## ---------------------- ##