From: Akim Demaille Date: Sat, 22 Dec 2001 14:42:36 +0000 (+0000) Subject: Reductions in web2c.y are improperly reported. X-Git-Tag: before-m4-back-end~104 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/776209d6c747eaf2efd87d818464f82fb14448b1 Reductions in web2c.y are improperly reported. Reported by Mike Castle. * src/conflicts.c (print_reductions): Fix. * tests/regression.at (Web2c): New. --- diff --git a/ChangeLog b/ChangeLog index 8ba8b790..a10936f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2001-12-22 Akim Demaille + + Reductions in web2c.y are improperly reported. + Reported by Mike Castle. + + * src/conflicts.c (print_reductions): Fix. + * tests/regression.at (Web2c): New. + 2001-12-18 Akim Demaille Some host fail on `assert (!"foo")', which expands to @@ -29,24 +37,24 @@ * src/lalr.h (nlookaheads): Remove this orphan declaration. * src/lalr.c (initialize_lookaheads): Set nlookaheads for each state. - + 2001-12-17 Akim Demaille * src/files.h, src/files.c (open_files, close_files): Remove. * src/main.c (main): Don't open/close files, nor invoke lex_free, let... * src/reader.c (reader): Do it. - + 2001-12-17 Akim Demaille * src/conflicts.c (print_reductions): Formatting changes. - + 2001-12-17 Akim Demaille * src/conflicts.c (flush_shift): Also adjust lookaheadset. (flush_reduce): New. (resolve_sr_conflict): Adjust. - + 2001-12-17 Akim Demaille * src/output.c (output_obstack): Be static and rename as... @@ -64,7 +72,7 @@ 2001-12-17 Akim Demaille * src/output.c: Various formatting changes. - + 2001-12-17 Akim Demaille * src/files.c (output_files): Free the output_obstack. @@ -83,7 +91,7 @@ * src/bison.simple: Remove a useless #line directive. s/#line %%line %%skeleton/#line %%line "%%parser-file-name"/'. * src/output.c (get_lines_number): New. - (output_parser): Adjust, now takes care about the lines of a + (output_parser): Adjust, now takes care about the lines of a output muscles. Fix line numbering. (actions_output): Computes the number of lines taken by actions. diff --git a/THANKS b/THANKS index 638e9d40..3bf90c06 100644 --- a/THANKS +++ b/THANKS @@ -18,6 +18,7 @@ Juan Manuel Guerrero ST001906@HRZ1.HRZ.TU-Darmstadt.De Keith Browne kbrowne@legato.com Laurent Mascherpa laurent.mascherpa@epita.fr Marc Autret autret_m@epita.fr +Mike Castle dalgoda@ix.netcom.com Neil Booth NeilB@earthling.net Nelson H. F. Beebe beebe@math.utah.edu Noah Friedman friedman@gnu.org diff --git a/src/conflicts.c b/src/conflicts.c index 3954cc31..bb2daecb 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -413,7 +413,6 @@ void print_reductions (FILE *out, int state) { int i; - int j; int m = state_table[state]->lookaheadsp; int n = state_table[state + 1]->lookaheadsp; shifts *shiftp = state_table[state]->shifts; @@ -457,8 +456,6 @@ print_reductions (FILE *out, int state) } else if (n - m >= 1) { - int k; - int cmax = 0; int default_LA = -1; int default_rule = 0; @@ -467,6 +464,7 @@ print_reductions (FILE *out, int state) for (i = m; i < n; i++) { int count = 0; + int j, k; for (k = 0; k < tokensetsize; ++k) lookaheadset[k] = LA (i)[k] & ~shiftset[k]; @@ -495,12 +493,13 @@ print_reductions (FILE *out, int state) for (i = 0; i < ntokens; i++) { + int j; int defaulted = 0; int count = BITISSET (shiftset, i); for (j = m; j < n; j++) { - if (BITISSET (LA (m), j)) + if (BITISSET (LA (j), i)) { if (count == 0) { diff --git a/tests/regression.at b/tests/regression.at index e7a1dbfe..2f10d066 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -605,3 +605,106 @@ AT_CLEANUP AT_TEST_CPP_GUARD_H([input/input]) AT_TEST_CPP_GUARD_H([9foo]) + + + +## ------- ## +## Web2c. ## +## ------- ## + +# The generation of the reduction was once wrong in Bison, and made it +# miss some reductions. In the following test case, the reduction on +# `undef_id_tok' in state 1 was missing. This is stripped down from +# the actual web2c.y. + +AT_SETUP([Web2c]) + +AT_DATA([input.y], +[[%token undef_id_tok const_id_tok + +%start CONST_DEC_PART + +%% +CONST_DEC_PART: + CONST_DEC_LIST + ; + +CONST_DEC_LIST: + CONST_DEC + | CONST_DEC_LIST CONST_DEC + ; + +CONST_DEC: + { } undef_id_tok '=' const_id_tok ';' + ; +%% + +]]) + +AT_CHECK([bison -v input.y]) + +AT_CHECK([sed -n 's/ *$//;/^$/!p' input.output], 0, +[[Grammar + Number, Line, Rule + 1 6 CONST_DEC_PART -> CONST_DEC_LIST + 2 10 CONST_DEC_LIST -> CONST_DEC + 3 12 CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC + 4 15 @1 -> /* empty */ + 5 15 CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' +Terminals, with rules where they appear +$ (-1) +';' (59) 5 +'=' (61) 5 +error (256) +undef_id_tok (257) 5 +const_id_tok (258) 5 +Nonterminals, with rules where they appear +CONST_DEC_PART (7) + on left: 1 +CONST_DEC_LIST (8) + on left: 2 3, on right: 1 3 +CONST_DEC (9) + on left: 5, on right: 2 3 +@1 (10) + on left: 4, on right: 5 +state 0 + $default reduce using rule 4 (@1) + CONST_DEC_PART go to state 9 + CONST_DEC_LIST go to state 1 + CONST_DEC go to state 2 + @1 go to state 3 +state 1 + CONST_DEC_PART -> CONST_DEC_LIST . (rule 1) + CONST_DEC_LIST -> CONST_DEC_LIST . CONST_DEC (rule 3) + undef_id_tok reduce using rule 4 (@1) + $default reduce using rule 1 (CONST_DEC_PART) + CONST_DEC go to state 4 + @1 go to state 3 +state 2 + CONST_DEC_LIST -> CONST_DEC . (rule 2) + $default reduce using rule 2 (CONST_DEC_LIST) +state 3 + CONST_DEC -> @1 . undef_id_tok '=' const_id_tok ';' (rule 5) + undef_id_tok shift, and go to state 5 +state 4 + CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC . (rule 3) + $default reduce using rule 3 (CONST_DEC_LIST) +state 5 + CONST_DEC -> @1 undef_id_tok . '=' const_id_tok ';' (rule 5) + '=' shift, and go to state 6 +state 6 + CONST_DEC -> @1 undef_id_tok '=' . const_id_tok ';' (rule 5) + const_id_tok shift, and go to state 7 +state 7 + CONST_DEC -> @1 undef_id_tok '=' const_id_tok . ';' (rule 5) + ';' shift, and go to state 8 +state 8 + CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' . (rule 5) + $default reduce using rule 5 (CONST_DEC) +state 9 + $ shift, and go to state 10 +state 10 + $default accept +]]) + +AT_CLEANUP