[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
17-report-items.patch
From: |
Akim Demaille |
Subject: |
17-report-items.patch |
Date: |
Sun, 30 Jun 2002 19:27:49 +0200 |
Index: ChangeLog
from Akim Demaille <address@hidden>
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.
Index: src/gram.c
--- src/gram.c Sat, 29 Jun 2002 15:49:57 +0200 akim
+++ src/gram.c Sun, 30 Jun 2002 11:37:22 +0200 akim
@@ -47,6 +47,30 @@
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 @@
| (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);
}
Index: src/gram.h
--- src/gram.h Sat, 29 Jun 2002 15:49:57 +0200 akim
+++ src/gram.h Sun, 30 Jun 2002 11:35:01 +0200 akim
@@ -193,6 +193,11 @@
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));
Index: src/print.c
--- src/print.c Sun, 30 Jun 2002 11:11:28 +0200 akim
+++ src/print.c Sun, 30 Jun 2002 11:38:20 +0200 akim
@@ -58,6 +58,7 @@
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 @@
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);
}
Index: tests/conflicts.at
--- tests/conflicts.at Sun, 30 Jun 2002 11:11:28 +0200 akim
+++ tests/conflicts.at Sun, 30 Jun 2002 11:55:57 +0200 akim
@@ -174,9 +174,9 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
state 1
- exp -> NUM . (rule 2)
+ 2 exp: NUM .
$default reduce using rule 2 (exp)
@@ -194,8 +194,8 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
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: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
state 1
- exp -> NUM . (rule 2)
+ 2 exp: NUM .
$default reduce using rule 2 (exp)
@@ -307,8 +304,8 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
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 @@ exp: exp OP exp | NUM;
AT_CLEANUP
-
## -------------------------------- ##
## Defaulted Conflicted Reduction. ##
## -------------------------------- ##
@@ -430,11 +425,11 @@ num: '0';
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 @@ num: '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 @@ num: '0';
state 2
- $axiom -> exp . $ (rule 0)
+ 0 $axiom: exp . $
$ shift, and go to state 5
@@ -465,7 +460,7 @@ num: '0';
state 3
- exp -> num . (rule 1)
+ 1 exp: num .
$default reduce using rule 1 (exp)
@@ -473,7 +468,7 @@ num: '0';
state 4
- exp -> id . (rule 2)
+ 2 exp: id .
$default reduce using rule 2 (exp)
@@ -481,7 +476,7 @@ num: '0';
state 5
- $axiom -> exp $ . (rule 0)
+ 0 $axiom: exp $ .
$default accept
Index: tests/regression.at
--- tests/regression.at Sat, 15 Jun 2002 16:36:49 +0200 akim
+++ tests/regression.at Sun, 30 Jun 2002 11:58:19 +0200 akim
@@ -184,7 +184,7 @@ expr:
state 0
- $axiom -> . expr $ (rule 0)
+ 0 $axiom: . expr $
'a' shift, and go to state 1
@@ -197,7 +197,7 @@ expr:
state 1
- expr -> 'a' . @1 'b' (rule 2)
+ 2 expr: 'a' . @1 'b'
$default reduce using rule 1 (@1)
@@ -207,7 +207,7 @@ expr:
state 2
- $axiom -> expr . $ (rule 0)
+ 0 $axiom: expr . $
$ shift, and go to state 5
@@ -215,7 +215,7 @@ expr:
state 3
- expr -> @2 . 'c' (rule 4)
+ 4 expr: @2 . 'c'
'c' shift, and go to state 6
@@ -223,7 +223,7 @@ expr:
state 4
- expr -> 'a' @1 . 'b' (rule 2)
+ 2 expr: 'a' @1 . 'b'
'b' shift, and go to state 7
@@ -231,14 +231,14 @@ expr:
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 @@ expr:
state 7
- expr -> 'a' @1 'b' . (rule 2)
+ 2 expr: 'a' @1 'b' .
$default reduce using rule 2 (expr)
@@ -375,12 +375,11 @@ exp: "a";
{ } 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 @@ exp: "a";
@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 @@ else: "else" statement;
# 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,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- 17-report-items.patch,
Akim Demaille <=