mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
warnings: use the regular interface for s/r and r/r conflicts
The current routines used to display s/r and r/r conflicts are both
inconvenient from the programmer point of view (they do not use the
warning infrastructure) and for the user (the messages are rather
terse, not necessarily pleasant to read, and because they don't use
the same routines, they look different).
It was due to the belief (dating back to the initial checked-in
version of Bison) that, at some point, POSIX Yacc mandated the format
for these messages. Today, the Open Group's manual page for Yacc,
<http://pubs.opengroup.org/onlinepubs/009695399/utilities/yacc.html>,
explicitly states that the format of these messages is unspecified.
See commit be7280480c and
<http://lists.gnu.org/archive/html/bison-patches/2002-12/msg00027.html>.
For a discussion on the chosen warning format, see
http://lists.gnu.org/archive/html/bison-patches/2012-09/msg00039.html
In an effort to factor the handling of errors and warnings, use the
Bison warning routines to report these messages.
* src/conflicts.c (conflicts_print): Rewrite with clearer sections
about S/R and then R/R conflicts.
(conflict_report): Remove, inlined in its sole
caller...
(conflicts_output): here.
* tests/conflicts.at, tests/existing.at, tests/glr-regression.at,
* tests/reduce.at, tests/regression.at: Adjust the expected results.
* NEWS: Update.
This commit is contained in:
@@ -498,7 +498,7 @@ AT_BISON_OPTION_POPDEFS
|
||||
# Show canonical LR's failure.
|
||||
AT_BISON_CHECK([[-Dlr.type=canonical-lr -o input.c input.y]],
|
||||
[[0]], [[]],
|
||||
[[input.y: conflicts: 2 shift/reduce
|
||||
[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
|
||||
]])
|
||||
AT_COMPILE([[input]])
|
||||
AT_PARSER_CHECK([[./input]], [[1]], [[]],
|
||||
@@ -508,7 +508,7 @@ AT_PARSER_CHECK([[./input]], [[1]], [[]],
|
||||
# It's corrected by LAC.
|
||||
AT_BISON_CHECK([[-Dlr.type=canonical-lr -Dparse.lac=full \
|
||||
-o input.c input.y]], [[0]], [[]],
|
||||
[[input.y: conflicts: 2 shift/reduce
|
||||
[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
|
||||
]])
|
||||
AT_COMPILE([[input]])
|
||||
AT_PARSER_CHECK([[./input]], [[1]], [[]],
|
||||
@@ -518,7 +518,7 @@ AT_PARSER_CHECK([[./input]], [[1]], [[]],
|
||||
# IELR is sufficient when LAC is used.
|
||||
AT_BISON_CHECK([[-Dlr.type=ielr -Dparse.lac=full -o input.c input.y]],
|
||||
[[0]], [[]],
|
||||
[[input.y: conflicts: 2 shift/reduce
|
||||
[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
|
||||
]])
|
||||
AT_COMPILE([[input]])
|
||||
AT_PARSER_CHECK([[./input]], [[1]], [[]],
|
||||
@@ -542,8 +542,8 @@ exp: exp OP exp | NUM;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c --report=all input.y], 0, [],
|
||||
[input.y: conflicts: 1 shift/reduce
|
||||
])
|
||||
[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
|
||||
]])
|
||||
|
||||
# Check the contents of the report.
|
||||
AT_CHECK([cat input.output], [],
|
||||
@@ -784,7 +784,7 @@ cond:
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c input.y], 0, [],
|
||||
[[input.y: conflicts: 1 shift/reduce
|
||||
[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
|
||||
input.y:12.3-18: warning: rule useless in parser due to conflicts: cond: cond "then" cond [-Wother]
|
||||
]])
|
||||
|
||||
@@ -828,7 +828,7 @@ id : '0';
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c --report=all input.y], 0, [],
|
||||
[[input.y: conflicts: 1 reduce/reduce
|
||||
[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
|
||||
input.y:4.6-8: warning: rule useless in parser due to conflicts: id: '0' [-Wother]
|
||||
]])
|
||||
|
||||
@@ -945,9 +945,8 @@ exp: exp OP exp | NUM;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c input.y], 1, [],
|
||||
[input.y: conflicts: 1 shift/reduce
|
||||
input.y: expected 0 shift/reduce conflicts
|
||||
])
|
||||
[[input.y: shift/reduce conflicts: 1 found, 0 expected
|
||||
]])
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
@@ -982,9 +981,8 @@ exp: exp OP exp | NUM;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c input.y], 1, [],
|
||||
[input.y: conflicts: 1 shift/reduce
|
||||
input.y: expected 2 shift/reduce conflicts
|
||||
])
|
||||
[[input.y: shift/reduce conflicts: 1 found, 2 expected
|
||||
]])
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
@@ -1002,9 +1000,8 @@ a: 'a';
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c input.y], 1, [],
|
||||
[input.y: conflicts: 1 reduce/reduce
|
||||
input.y: expected 0 reduce/reduce conflicts
|
||||
])
|
||||
[[input.y: reduce/reduce conflicts: 1 found, 0 expected
|
||||
]])
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
@@ -1046,7 +1043,7 @@ e: e '+' e
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-o input.c input.y], 0, [],
|
||||
[[input.y: conflicts: 4 shift/reduce
|
||||
[[input.y: warning: 4 shift/reduce conflicts [-Wconflicts-sr]
|
||||
]])
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -1148,7 +1145,8 @@ reported_conflicts:
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[--report=all input.y]], 0, [],
|
||||
[[input.y: conflicts: 1 shift/reduce, 1 reduce/reduce
|
||||
[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
|
||||
input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
|
||||
input.y:12.5-20: warning: rule useless in parser due to conflicts: resolved_conflict: 'a' unreachable1 [-Wother]
|
||||
input.y:20.5-20: warning: rule useless in parser due to conflicts: unreachable1: 'a' unreachable2 [-Wother]
|
||||
input.y:21.4: warning: rule useless in parser due to conflicts: unreachable1: /* empty */ [-Wother]
|
||||
@@ -1300,7 +1298,8 @@ AT_DATA([[input-keep.y]],
|
||||
AT_CHECK([[cat input.y >> input-keep.y]])
|
||||
|
||||
AT_BISON_CHECK([[input-keep.y]], 0, [],
|
||||
[[input-keep.y: conflicts: 2 shift/reduce, 2 reduce/reduce
|
||||
[[input-keep.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
|
||||
input-keep.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
|
||||
input-keep.y:22.4: warning: rule useless in parser due to conflicts: unreachable1: /* empty */ [-Wother]
|
||||
input-keep.y:26.16: warning: rule useless in parser due to conflicts: unreachable2: /* empty */ [-Wother]
|
||||
input-keep.y:32.5-7: warning: rule useless in parser due to conflicts: reported_conflicts: 'a' [-Wother]
|
||||
@@ -1483,7 +1482,7 @@ exp: 'a' | 'a';
|
||||
|
||||
AT_BISON_CHECK([[2.y]], [[0]], [],
|
||||
[[2.y: warning: %expect-rr applies only to GLR parsers [-Wother]
|
||||
2.y: conflicts: 1 reduce/reduce
|
||||
2.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
|
||||
2.y:3.12-14: warning: rule useless in parser due to conflicts: exp: 'a' [-Wother]
|
||||
]])
|
||||
|
||||
@@ -1518,17 +1517,27 @@ B: ;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[sr-rr.y]], [[0]], [[]],
|
||||
[[sr-rr.y: conflicts: 1 shift/reduce, 1 reduce/reduce
|
||||
[[sr-rr.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
|
||||
sr-rr.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
|
||||
]])
|
||||
AT_BISON_CHECK([[-Wno-conflicts-sr sr-rr.y]], [[0]], [[]],
|
||||
[[sr-rr.y: conflicts: 1 reduce/reduce
|
||||
[[sr-rr.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
|
||||
]])
|
||||
AT_BISON_CHECK([[-Wno-conflicts-rr sr-rr.y]], [[0]], [[]],
|
||||
[[sr-rr.y: conflicts: 1 shift/reduce
|
||||
[[sr-rr.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
|
||||
]])
|
||||
|
||||
[for gram in sr-rr sr rr; do
|
||||
[
|
||||
# This is piece of code is rather complex for a simple task: try every
|
||||
# combinaison of (0 or 1 real SR) x (0 or 1 real RR) x (don't %expect
|
||||
# or %expect 0, 1, or 2 SR) x (don't %expect-rr or %expect-rr 0, 1, or 2
|
||||
# RR).
|
||||
|
||||
# Number and types of genuine conflicts in the grammar.
|
||||
for gram in sr-rr sr rr; do
|
||||
# Number of expected s/r conflicts.
|
||||
for sr_exp_i in '' 0 1 2; do
|
||||
# Number of expected r/r conflicts.
|
||||
for rr_exp_i in '' 0 1 2; do
|
||||
test -z "$sr_exp_i" && test -z "$rr_exp_i" && continue
|
||||
|
||||
@@ -1551,36 +1560,38 @@ AT_BISON_CHECK([[-Wno-conflicts-rr sr-rr.y]], [[0]], [[]],
|
||||
echo "$directives" > $file
|
||||
cat $gram.y >> $file
|
||||
|
||||
# Count actual conflicts.
|
||||
conflicts=
|
||||
sr_count=0
|
||||
rr_count=0
|
||||
if test $gram = sr || test $gram = sr-rr; then
|
||||
conflicts="1 shift/reduce"
|
||||
sr_count=1
|
||||
fi
|
||||
if test $gram = rr || test $gram = sr-rr; then
|
||||
if test -n "$conflicts"; then
|
||||
conflicts="$conflicts, "
|
||||
fi
|
||||
conflicts="${conflicts}1 reduce/reduce"
|
||||
rr_count=1
|
||||
fi
|
||||
# Number of found conflicts.
|
||||
case $gram in
|
||||
(sr) sr_count=1; rr_count=0;;
|
||||
(rr) sr_count=0; rr_count=1;;
|
||||
(sr-rr) sr_count=1; rr_count=1;;
|
||||
esac
|
||||
|
||||
# Update number of expected conflicts: if %expect is given then
|
||||
# %expect-rr defaults to 0, and vice-versa. Leave empty if
|
||||
# nothing expected.
|
||||
case $sr_exp_i:$rr_exp_i in
|
||||
?:) rr_exp_i=0;;
|
||||
:?) sr_exp_i=0;;
|
||||
esac
|
||||
|
||||
# Run tests.
|
||||
if test $sr_count -eq $sr_exp && test $rr_count -eq $rr_exp; then
|
||||
]AT_BISON_CHECK([[-Wnone $file]])[
|
||||
]AT_BISON_CHECK([[-Werror $file]])[
|
||||
else
|
||||
echo "$file: conflicts: $conflicts" > experr
|
||||
if test $sr_count -ne $sr_exp; then
|
||||
if test $sr_exp -ne 1; then s=s; else s= ; fi
|
||||
echo "$file: expected $sr_exp shift/reduce conflict$s" >> experr
|
||||
fi
|
||||
if test $rr_count -ne $rr_exp; then
|
||||
if test $rr_exp -ne 1; then s=s; else s= ; fi
|
||||
echo "$file: expected $rr_exp reduce/reduce conflict$s" >> experr
|
||||
fi
|
||||
{
|
||||
if test -z "$sr_exp_i" && test "$sr_count" -ne 0; then
|
||||
echo "warning: $sr_count shift/reduce conflicts"
|
||||
elif test "$sr_exp_i" -ne "$sr_count"; then
|
||||
echo "shift/reduce conflicts: $sr_count found, $sr_exp_i expected"
|
||||
fi
|
||||
if test -z "$rr_exp_i" && test "$rr_count" -ne 0; then
|
||||
echo "warning: $rr_count reduce/reduce conflicts"
|
||||
elif test "$rr_exp_i" -ne "$rr_count"; then
|
||||
echo "reduce/reduce conflicts: $rr_count found, $rr_exp_i expected"
|
||||
fi
|
||||
} | sed -e "s/^/$file: /" > experr
|
||||
]AT_BISON_CHECK([[-Wnone $file]], [[1]], [[]], [[experr]])[
|
||||
]AT_BISON_CHECK([[-Werror $file]], [[1]], [[]], [[experr]])[
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user