From ce4ccb4b11bb3d19681055cc2b732493603d3508 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 30 Jun 2002 17:33:08 +0000 Subject: [PATCH] Display items as we display rules. * src/gram.h, src/gram.c (rule_lhs_print): New. * src/gram.c (grammar_rules_partial_print): Use it. * src/print.c (print_core): Likewise. * tests/conflicts.at (Defaulted Conflicted Reduction), (Unresolved SR Conflicts): Adjust. (Unresolved SR Conflicts): Adjust and rename as... (Resolved SR Conflicts): this, as was meant. * tests/regression.at (Web2c Report): Adjust. --- ChangeLog | 13 ++++++++ src/gram.c | 49 ++++++++++++++++------------ src/gram.h | 5 +++ src/print.c | 48 +++++++++++++-------------- tests/conflicts.at | 93 +++++++++++++++++++++++++---------------------------- tests/regression.at | 49 ++++++++++++++-------------- 6 files changed, 139 insertions(+), 118 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42008b9..0ee7b2a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2002-06-30 Akim Demaille + Display items as we display rules. + + * src/gram.h, src/gram.c (rule_lhs_print): New. + * src/gram.c (grammar_rules_partial_print): Use it. + * src/print.c (print_core): Likewise. + * tests/conflicts.at (Defaulted Conflicted Reduction), + (Unresolved SR Conflicts): Adjust. + (Unresolved SR Conflicts): Adjust and rename as... + (Resolved SR Conflicts): this, as was meant. + * tests/regression.at (Web2c Report): Adjust. + +2002-06-30 Akim Demaille + * src/print.c (state_default_rule_compute): New, extracted from... (print_reductions): here. Pessimize, but clarify the code. diff --git a/src/gram.c b/src/gram.c index 708922d..72086e3 100644 --- a/src/gram.c +++ b/src/gram.c @@ -47,6 +47,30 @@ int glr_parser = 0; int pure_parser = 0; +/*----------------------------------------------------------------. +| Print this RULE's number and lhs on OUT. If a PREVIOUS_LHS was | +| already displayed (by a previous call for another rule), avoid | +| useless repetitions. | +`----------------------------------------------------------------*/ + +void +rule_lhs_print (rule_t *rule, symbol_t *previous_lhs, FILE *out) +{ + fprintf (out, " %3d ", rule->number - 1); + if (previous_lhs != rule->lhs) + { + fprintf (out, "%s:", symbol_tag_get (rule->lhs)); + } + else + { + int n; + for (n = strlen (symbol_tag_get (previous_lhs)); n > 0; --n) + fputc (' ', out); + fputc ('|', out); + } +} + + /*--------------------------------------. | Return the number of symbols in RHS. | `--------------------------------------*/ @@ -139,39 +163,22 @@ ritem_longest_rhs (void) | (exclusive) on OUT under TITLE. | `----------------------------------------------------------------*/ -static inline void -blanks_print (unsigned n, FILE *out) -{ - for (/* Nothing*/; n > 0; --n) - fputc (' ', out); -} - void grammar_rules_partial_print (FILE *out, const char *title, rule_number_t begin, rule_number_t end) { int r; - symbol_t *last_lhs = NULL; + symbol_t *previous_lhs = NULL; /* rule # : LHS -> RHS */ fprintf (out, "%s\n\n", title); for (r = begin; r < end; r++) { - if (last_lhs && last_lhs != rules[r].lhs) + if (previous_lhs && previous_lhs != rules[r].lhs) fputc ('\n', out); - - fprintf (out, " %3d ", r - 1); - if (last_lhs != rules[r].lhs) - { - last_lhs = rules[r].lhs; - fprintf (out, "%s:", symbol_tag_get (last_lhs)); - } - else - { - blanks_print (strlen (symbol_tag_get (last_lhs)), out); - fputc ('|', out); - } + rule_lhs_print (&rules[r], previous_lhs, out); rule_rhs_print (&rules[r], out); + previous_lhs = rules[r].lhs; } fputs ("\n\n", out); } diff --git a/src/gram.h b/src/gram.h index 1aa5cd7..71191a5 100644 --- a/src/gram.h +++ b/src/gram.h @@ -193,6 +193,11 @@ extern int glr_parser; extern int pure_parser; +/* Print this RULE's number and lhs on OUT. If a PREVIOUS_LHS was + already displayed (by a previous call for another rule), avoid + useless repetitions. */ +void rule_lhs_print PARAMS ((rule_t *rule, symbol_t *previous_lhs, FILE *out)); + /* Return the length of the RHS. */ int rule_rhs_length PARAMS ((rule_t *rule)); diff --git a/src/print.c b/src/print.c index 9ed6919..76e5f74 100644 --- a/src/print.c +++ b/src/print.c @@ -58,6 +58,7 @@ print_core (FILE *out, state_t *state) int i; item_number_t *sitems = state->items; int snritems = state->nitems; + symbol_t *previous_lhs = NULL; /* Output all the items of a state, not only its kernel. */ if (report_flag & report_itemsets) @@ -67,40 +68,39 @@ print_core (FILE *out, state_t *state) snritems = nritemset; } - if (snritems) - { - for (i = 0; i < snritems; i++) - { - item_number_t *sp; - item_number_t *sp1; - int rule; - - sp1 = sp = ritem + sitems[i]; + if (!snritems) + return; - while (*sp >= 0) - sp++; + for (i = 0; i < snritems; i++) + { + item_number_t *sp; + item_number_t *sp1; + int rule; - rule = -(*sp); - fprintf (out, " %s -> ", symbol_tag_get (rules[rule].lhs)); + sp1 = sp = ritem + sitems[i]; - for (sp = rules[rule].rhs; sp < sp1; sp++) - fprintf (out, "%s ", symbol_tag_get (symbols[*sp])); + while (*sp >= 0) + sp++; - fputc ('.', out); + rule = -(*sp); - for (/* Nothing */; *sp >= 0; ++sp) - fprintf (out, " %s", symbol_tag_get (symbols[*sp])); + rule_lhs_print (&rules[rule], previous_lhs, out); + previous_lhs = rules[rule].lhs; - /* Display the lookaheads? */ - if (report_flag & report_lookaheads) - state_rule_lookaheads_print (state, &rules[rule], out); + for (sp = rules[rule].rhs; sp < sp1; sp++) + fprintf (out, " %s", symbol_tag_get (symbols[*sp])); + fputs (" .", out); + for (/* Nothing */; *sp >= 0; ++sp) + fprintf (out, " %s", symbol_tag_get (symbols[*sp])); - fprintf (out, _(" (rule %d)"), rule - 1); - fputc ('\n', out); - } + /* Display the lookaheads? */ + if (report_flag & report_lookaheads) + state_rule_lookaheads_print (state, &rules[rule], out); fputc ('\n', out); } + + fputc ('\n', out); } diff --git a/tests/conflicts.at b/tests/conflicts.at index 38f8f0e..63e494d 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -174,9 +174,9 @@ exp (6) state 0 - $axiom -> . exp $ (rule 0) - exp -> . exp OP exp (rule 1) - exp -> . NUM (rule 2) + 0 $axiom: . exp $ + 1 exp: . exp OP exp + 2 | . NUM NUM shift, and go to state 1 @@ -186,7 +186,7 @@ state 0 state 1 - exp -> NUM . (rule 2) + 2 exp: NUM . $default reduce using rule 2 (exp) @@ -194,8 +194,8 @@ state 1 state 2 - $axiom -> exp . $ (rule 0) - exp -> exp . OP exp (rule 1) + 0 $axiom: exp . $ + 1 exp: exp . OP exp $ shift, and go to state 3 OP shift, and go to state 4 @@ -204,16 +204,16 @@ state 2 state 3 - $axiom -> exp $ . (rule 0) + 0 $axiom: exp $ . $default accept state 4 - exp -> . exp OP exp (rule 1) - exp -> exp OP . exp (rule 1) - exp -> . NUM (rule 2) + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM NUM shift, and go to state 1 @@ -223,8 +223,8 @@ state 4 state 5 - exp -> exp . OP exp [$, OP] (rule 1) - exp -> exp OP exp . [$, OP] (rule 1) + 1 exp: exp . OP exp [$, OP] + 1 | exp OP exp . [$, OP] OP shift, and go to state 4 @@ -238,30 +238,27 @@ state 5 AT_CLEANUP -## ------------------------- ## -## Unresolved SR Conflicts. ## -## ------------------------- ## -AT_SETUP([Unresolved SR Conflicts]) +## ----------------------- ## +## Resolved SR Conflicts. ## +## ----------------------- ## + +AT_SETUP([Resolved SR Conflicts]) AT_KEYWORDS([report]) AT_DATA([input.y], [[%token NUM OP +%left OP %% exp: exp OP exp | NUM; ]]) -AT_CHECK([bison input.y -o input.c --report=all], 0, [], -[input.y contains 1 shift/reduce conflict. -]) +AT_CHECK([bison input.y -o input.c --report=all]) # Check the contents of the report. AT_CHECK([cat input.output], [], -[[State 5 contains 1 shift/reduce conflict. - - -Grammar +[[Grammar 0 $axiom: exp $ @@ -287,9 +284,9 @@ exp (6) state 0 - $axiom -> . exp $ (rule 0) - exp -> . exp OP exp (rule 1) - exp -> . NUM (rule 2) + 0 $axiom: . exp $ + 1 exp: . exp OP exp + 2 | . NUM NUM shift, and go to state 1 @@ -299,7 +296,7 @@ state 0 state 1 - exp -> NUM . (rule 2) + 2 exp: NUM . $default reduce using rule 2 (exp) @@ -307,8 +304,8 @@ state 1 state 2 - $axiom -> exp . $ (rule 0) - exp -> exp . OP exp (rule 1) + 0 $axiom: exp . $ + 1 exp: exp . OP exp $ shift, and go to state 3 OP shift, and go to state 4 @@ -317,16 +314,16 @@ state 2 state 3 - $axiom -> exp $ . (rule 0) + 0 $axiom: exp $ . $default accept state 4 - exp -> . exp OP exp (rule 1) - exp -> exp OP . exp (rule 1) - exp -> . NUM (rule 2) + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM NUM shift, and go to state 1 @@ -336,14 +333,13 @@ state 4 state 5 - exp -> exp . OP exp [$, OP] (rule 1) - exp -> exp OP exp . [$, OP] (rule 1) + 1 exp: exp . OP exp [$, OP] + 1 | exp OP exp . [$, OP] - OP shift, and go to state 4 - OP [reduce using rule 1 (exp)] $default reduce using rule 1 (exp) + Conflict between rule 2 and token OP resolved as shift (%left OP). ]]) @@ -351,7 +347,6 @@ state 5 AT_CLEANUP - ## -------------------------------- ## ## Defaulted Conflicted Reduction. ## ## -------------------------------- ## @@ -430,11 +425,11 @@ id (7) state 0 - $axiom -> . exp $ (rule 0) - exp -> . num (rule 1) - exp -> . id (rule 2) - num -> . '0' (rule 3) - id -> . '0' (rule 4) + 0 $axiom: . exp $ + 1 exp: . num + 2 | . id + 3 num: . '0' + 4 id: . '0' '0' shift, and go to state 1 @@ -446,8 +441,8 @@ state 0 state 1 - num -> '0' . [$] (rule 3) - id -> '0' . [$] (rule 4) + 3 num: '0' . [$] + 4 id: '0' . [$] $ reduce using rule 3 (num) $ [reduce using rule 4 (id)] @@ -457,7 +452,7 @@ state 1 state 2 - $axiom -> exp . $ (rule 0) + 0 $axiom: exp . $ $ shift, and go to state 5 @@ -465,7 +460,7 @@ state 2 state 3 - exp -> num . (rule 1) + 1 exp: num . $default reduce using rule 1 (exp) @@ -473,7 +468,7 @@ state 3 state 4 - exp -> id . (rule 2) + 2 exp: id . $default reduce using rule 2 (exp) @@ -481,7 +476,7 @@ state 4 state 5 - $axiom -> exp $ . (rule 0) + 0 $axiom: exp $ . $default accept diff --git a/tests/regression.at b/tests/regression.at index 3620200..456f5a8 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -184,7 +184,7 @@ expr (7) state 0 - $axiom -> . expr $ (rule 0) + 0 $axiom: . expr $ 'a' shift, and go to state 1 @@ -197,7 +197,7 @@ state 0 state 1 - expr -> 'a' . @1 'b' (rule 2) + 2 expr: 'a' . @1 'b' $default reduce using rule 1 (@1) @@ -207,7 +207,7 @@ state 1 state 2 - $axiom -> expr . $ (rule 0) + 0 $axiom: expr . $ $ shift, and go to state 5 @@ -215,7 +215,7 @@ state 2 state 3 - expr -> @2 . 'c' (rule 4) + 4 expr: @2 . 'c' 'c' shift, and go to state 6 @@ -223,7 +223,7 @@ state 3 state 4 - expr -> 'a' @1 . 'b' (rule 2) + 2 expr: 'a' @1 . 'b' 'b' shift, and go to state 7 @@ -231,14 +231,14 @@ state 4 state 5 - $axiom -> expr $ . (rule 0) + 0 $axiom: expr $ . $default accept state 6 - expr -> @2 'c' . (rule 4) + 4 expr: @2 'c' . $default reduce using rule 4 (expr) @@ -246,7 +246,7 @@ state 6 state 7 - expr -> 'a' @1 'b' . (rule 2) + 2 expr: 'a' @1 'b' . $default reduce using rule 2 (expr) @@ -375,12 +375,11 @@ CONST_DEC: { } undef_id_tok '=' const_id_tok ';' ; %% - ]]) AT_CHECK([bison -v input.y]) - -AT_CHECK([sed -n 's/ *$//;/^$/!p' input.output], 0, +sed -n 's/ *$//;/^$/!p' input.output >input.report +AT_CHECK([cat input.report], 0, [[Grammar 0 $axiom: CONST_DEC_PART $ 1 CONST_DEC_PART: CONST_DEC_LIST @@ -407,45 +406,45 @@ CONST_DEC (10) @1 (11) on left: 4, on right: 5 state 0 - $axiom -> . CONST_DEC_PART $ (rule 0) + 0 $axiom: . CONST_DEC_PART $ $default reduce using rule 4 (@1) CONST_DEC_PART go to state 1 CONST_DEC_LIST go to state 2 CONST_DEC go to state 3 @1 go to state 4 state 1 - $axiom -> CONST_DEC_PART . $ (rule 0) + 0 $axiom: CONST_DEC_PART . $ $ shift, and go to state 5 state 2 - CONST_DEC_PART -> CONST_DEC_LIST . (rule 1) - CONST_DEC_LIST -> CONST_DEC_LIST . CONST_DEC (rule 3) + 1 CONST_DEC_PART: CONST_DEC_LIST . + 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC undef_id_tok reduce using rule 4 (@1) $default reduce using rule 1 (CONST_DEC_PART) CONST_DEC go to state 6 @1 go to state 4 state 3 - CONST_DEC_LIST -> CONST_DEC . (rule 2) + 2 CONST_DEC_LIST: CONST_DEC . $default reduce using rule 2 (CONST_DEC_LIST) state 4 - CONST_DEC -> @1 . undef_id_tok '=' const_id_tok ';' (rule 5) + 5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';' undef_id_tok shift, and go to state 7 state 5 - $axiom -> CONST_DEC_PART $ . (rule 0) + 0 $axiom: CONST_DEC_PART $ . $default accept state 6 - CONST_DEC_LIST -> CONST_DEC_LIST CONST_DEC . (rule 3) + 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC . $default reduce using rule 3 (CONST_DEC_LIST) state 7 - CONST_DEC -> @1 undef_id_tok . '=' const_id_tok ';' (rule 5) + 5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';' '=' shift, and go to state 8 state 8 - CONST_DEC -> @1 undef_id_tok '=' . const_id_tok ';' (rule 5) + 5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';' const_id_tok shift, and go to state 9 state 9 - CONST_DEC -> @1 undef_id_tok '=' const_id_tok . ';' (rule 5) + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';' ';' shift, and go to state 10 state 10 - CONST_DEC -> @1 undef_id_tok '=' const_id_tok ';' . (rule 5) + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' . $default reduce using rule 5 (CONST_DEC) ]]) @@ -491,7 +490,9 @@ AT_CHECK([bison -v input.y -o input.c]) # Check only the tables. We don't use --no-parser, because it is # still to be implemented in the experimental branch of Bison. -AT_CHECK([[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c]], 0, +[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c] + +AT_CHECK([[cat tables.c]], 0, [[static const unsigned char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2.7.4