mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
* data/skeletons/yacc.c (yyparse): When the scanner returns YYERRCODE, go directly to error recovery (yyerrlab1). However, don't keep the error token as lookahead, that token is too special. * data/skeletons/lalr1.cc: Likewise. * examples/c/bistromathic/parse.y (yylex): Use that feature to report nicely invalid characters. * examples/c/bistromathic/bistromathic.test: Check that. * examples/test: Neutralize gratuitous differences such as rule position. * tests/calc.at: Check that case in C only. The other case seem to be working, but that's an illusion that the next commit will address (in fact, they can enter endless loops, and report the error several times anyway).
146 lines
3.3 KiB
Bash
Executable File
146 lines
3.3 KiB
Bash
Executable File
#! /bin/sh
|
|
|
|
# Copyright (C) 2005-2015, 2018-2020 Free Software Foundation, Inc.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
SHELL=/bin/sh
|
|
export SHELL
|
|
|
|
me=$(basename "$1" .test)
|
|
medir=$(dirname "$1" | sed -e 's,.*examples/,,')
|
|
|
|
# Number of the current test.
|
|
number=1
|
|
|
|
# Exit status of this script.
|
|
exit=true
|
|
|
|
# top_builddir.
|
|
cwd=$(pwd)
|
|
|
|
# Whether to strip '> ...' lines from the expected output.
|
|
# See bistromathic.test.
|
|
strip_prompt=false
|
|
|
|
# The exercised program.
|
|
abs_medir=$cwd/examples/$medir
|
|
if test -x "$abs_medir/$me"; then
|
|
prog ()
|
|
{
|
|
"$abs_medir/$me" "$@"
|
|
}
|
|
elif test -f "$abs_medir/$me.class"; then
|
|
prog ()
|
|
{
|
|
"$SHELL" "$cwd/javaexec.sh" -cp "$abs_medir" "$me" "$@"
|
|
}
|
|
else
|
|
echo "$me: ERROR: cannot find program to exercise in:"
|
|
echo "$me: ERROR: $cwd/examples/$medir/$me"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
# cleanup
|
|
# -------
|
|
cleanup ()
|
|
{
|
|
status=$?
|
|
if test -z "$DEBUG"; then
|
|
cd "$cwd"
|
|
rm -rf $$.dir
|
|
fi
|
|
exit $status
|
|
}
|
|
trap cleanup 0 1 2 13 15
|
|
mkdir $$.dir
|
|
cd $$.dir
|
|
|
|
# run [-noerr, -n] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
|
|
# ----------------------------------------------------------------------
|
|
# -noerr: ignore stderr, otherwise merge it into effective output.
|
|
# -n: not final end-of-line in expected-output
|
|
run ()
|
|
{
|
|
noerr=false
|
|
echo=echo
|
|
while true; do
|
|
case $1 in
|
|
(-noerr) noerr=true; shift;;
|
|
(-n) echo=printf; shift;;
|
|
(*) break;;
|
|
esac
|
|
done
|
|
|
|
# Expected exit status.
|
|
sta_exp=$1
|
|
shift
|
|
|
|
# Expected output.
|
|
$echo "$1" |
|
|
sed -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' |
|
|
if $strip_prompt; then
|
|
sed -e '/^> /d'
|
|
else
|
|
cat
|
|
fi >exp
|
|
shift
|
|
|
|
# Effective exit status.
|
|
sta_eff=0
|
|
|
|
prog "$@" - <input >out_eff 2>err_eff || sta_eff=$?
|
|
|
|
# Combine effective output and error streams.
|
|
{
|
|
cat out_eff
|
|
if ! $noerr; then
|
|
sed -e 's/^/err: /g' \
|
|
-e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' \
|
|
err_eff
|
|
fi
|
|
} >eff
|
|
|
|
if test $sta_eff -eq $sta_exp; then
|
|
if cmp eff exp 2>/dev/null; then
|
|
echo "$me: PASS: $number"
|
|
else
|
|
echo "$me: FAIL: $number"
|
|
echo "$me: input:"
|
|
sed -e 's/^/ /' input
|
|
echo "$me: expected output:"
|
|
sed -e 's/^/ /' exp
|
|
echo "$me: effective output:"
|
|
sed -e 's/^/ /' eff
|
|
echo "$me: diff:"
|
|
diff -u exp eff | sed -e 's/^/ /'
|
|
exit=false
|
|
fi
|
|
else
|
|
echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)"
|
|
cat err_eff
|
|
exit=false
|
|
fi
|
|
number=$(expr $number + 1)
|
|
}
|
|
|
|
# We have cd'd one level deeper.
|
|
case $1 in
|
|
/*) . "$1";;
|
|
*) . "../$1";;
|
|
esac
|
|
|
|
$exit
|