From 414c76a461489167b0ba3f699f1d996a499efb8c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 18 Jul 2008 10:20:31 +0200 Subject: [PATCH] Fail on parse error in calc++. * doc/bison.texinfo (calc++.cc): Propagate failures to the exit status. * examples/calc++/test ($me, $number, $exit, run): New. Use them to propagate errors to the exit status. --- ChangeLog | 8 ++++++++ doc/bison.texinfo | 4 ++++ examples/calc++/test | 37 +++++++++++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 63d66944..c8bb3016 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-11-03 Akim Demaille + + Fail on parse error in calc++. + * doc/bison.texinfo (calc++.cc): Propagate failures to the exit + status. + * examples/calc++/test ($me, $number, $exit, run): New. + Use them to propagate errors to the exit status. + 2008-11-03 Akim Demaille Don't specify the skeleton twice in the example. diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 71e9a16a..6570c0cd 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -8713,6 +8713,7 @@ The top level file, @file{calc++.cc}, poses no problem. int main (int argc, char *argv[]) @{ + int res = 0; calcxx_driver driver; for (++argv; argv[0]; ++argv) if (*argv == std::string ("-p")) @@ -8721,6 +8722,9 @@ main (int argc, char *argv[]) driver.trace_scanning = true; else if (!driver.parse (*argv)) std::cout << driver.result << std::endl; + else + res = 1; + return res; @} @end example diff --git a/examples/calc++/test b/examples/calc++/test index 2f8a0454..b6f0942c 100755 --- a/examples/calc++/test +++ b/examples/calc++/test @@ -5,6 +5,33 @@ test -z "$VERBOSE" && { set -x } +me=`basename $0` + +# Number of the current test. +number=1 + +# Exit status of this script. +exit=true + +# run EXPECTED-EXIT-STATUS [PARSER-OPTIONS] +# ----------------------------------------- +run () +{ + # Effective and expected exit status. + local sta_exp=$1 + shift + ./calc++ "$@" input + local sta_eff=$? + if test $sta_eff -eq $sta_exp; then + printf "$me: PASS: %2d\n" $number + else + printf "$me: FAIL: %2d (expected status: %d, effective: %d\n" \ + $number $sta_exp $sta_eff + exit=false + fi + number=`expr $number + 1` +} + cat >input <input <input <