X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/907e3bc851a08a6cfe32c4145fb837ca03cc6a39..0ffda363409da33824a5bfc52b8f65008a04438e:/tests/calc.at diff --git a/tests/calc.at b/tests/calc.at index 8c68dfd7..69b91964 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -1,5 +1,7 @@ # Simple calculator. -*- Autotest -*- -# Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 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 @@ -13,8 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. ## ---------------------------------------------------- ## ## Compile the grammar described in the documentation. ## @@ -41,10 +43,8 @@ AT_DATA_GRAMMAR([calc.y], %{ #include -#if STDC_HEADERS -# include -# include -#endif +#include +#include #if HAVE_UNISTD_H # include #else @@ -53,8 +53,6 @@ AT_DATA_GRAMMAR([calc.y], #endif #include -extern void perror (const char *s); - /* Exercise pre-prologue dependency to %union. */ typedef int semantic_value; @@ -70,7 +68,7 @@ static int global_count = 0; %{ static int power (int base, int exponent); -]AT_LALR1_CC_IF([typedef yy::Location YYLTYPE;], +]AT_LALR1_CC_IF([typedef yy::location YYLTYPE;], [/* yyerror receives the location if: - %location & %pure & %glr - %location & %pure & %yacc & %parse-param. */ @@ -130,25 +128,19 @@ exp: static FILE *yyin; ]AT_LALR1_CC_IF( -[/* Currently, print_ is required in C++. */ -void -yy::Parser::print_ () -{ -AT_LOCATION_IF([ - std::cerr << location;]) -} - -/* A C++ error reporting function. */ +[/* A C++ error reporting function. */ void -yy::Parser::error_ () +yy::parser::error (const location& l, const std::string& m) { - std::cerr << AT_LOCATION_IF([location << ": " << ])message << std::endl; + (void) l; + std::cerr << AT_LOCATION_IF([l << ": " << ])m << std::endl; } int yyparse (AT_PARAM_IF([semantic_value *result, int *count])) { - yy::Parser parser (!!YYDEBUG[]AT_LOCATION_IF([, yy::Location::Location ()])AT_PARAM_IF([, result, count])); + yy::parser parser[]AT_PARAM_IF([ (result, count)]); + parser.set_debug_level (!!YYDEBUG); return parser.parse (); } ], @@ -296,7 +288,7 @@ power (int base, int exponent) { int res = 1; if (exponent < 0) - exit (1); + exit (3); for (/* Niente */; exponent; --exponent) res *= base; return res; @@ -310,7 +302,11 @@ main (int argc, const char **argv) int count = 0; int status; - alarm (10); + /* This used to be alarm (10), but that isn't enough time for + a July 1995 vintage DEC Alphastation 200 4/100 system, + according to Nelson H. F. Beebe. 100 seconds is enough. */ + alarm (100); + if (argc == 2) yyin = fopen (argv[1], "r"); else @@ -319,7 +315,7 @@ main (int argc, const char **argv) if (!yyin) { perror (argv[1]); - exit (1); + return 3; } ]AT_LALR1_CC_IF([], [m4_bmatch([$4], [%debug], @@ -446,11 +442,11 @@ AT_BISON_OPTION_PUSHDEFS([$1]) AT_DATA_CALC_Y([$1]) -# Specify the output files to avoid problems on different file systems. -AT_CHECK([bison -o calc.c calc.y]) - -AT_LALR1_CC_IF([AT_COMPILE_CXX([calc])], - [AT_COMPILE([calc])]) +AT_LALR1_CC_IF( + [AT_CHECK([bison -o calc.cc calc.y]) + AT_COMPILE_CXX([calc])], + [AT_CHECK([bison -o calc.c calc.y]) + AT_COMPILE([calc])]) # Test the priorities. _AT_CHECK_CALC([$1], @@ -467,25 +463,25 @@ _AT_CHECK_CALC([$1], 2^2^3 = 256 (2^2)^3 = 64], - [486]) + [571]) # Some syntax errors. -_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [11], - [1.2: syntax error, unexpected "number"]) -_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [15], - [1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!']) -_AT_CHECK_CALC_ERROR([$1], [1], [error], [4], +_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [13], + [1.2: syntax error, unexpected number]) +_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [18], + [1.2: syntax error, unexpected '/', expecting number or '-' or '(' or '!']) +_AT_CHECK_CALC_ERROR([$1], [1], [error], [5], [1.0: syntax error, unexpected $undefined]) -_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [22], +_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [26], [1.6: syntax error, unexpected '=']) _AT_CHECK_CALC_ERROR([$1], [1], [ +1], - [14], + [16], [2.0: syntax error, unexpected '+']) # Exercise error messages with EOF: work on an empty file. _AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4], - [1.0: syntax error, unexpected "end of input"]) + [1.0: syntax error, unexpected end of input]) # Exercise the error token: without it, we die at the first error, # hence be sure to @@ -498,28 +494,28 @@ _AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4], # # - test the action associated to `error' # -# - check the lookahead that triggers an error is not discarded -# when we enter error recovery. Below, the lookahead causing the +# - check the look-ahead that triggers an error is not discarded +# when we enter error recovery. Below, the look-ahead causing the # first error is ")", which is needed to recover from the error and # produce the "0" that triggers the "0 != 1" error. # _AT_CHECK_CALC_ERROR([$1], [0], [() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1], - [156], -[1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' -1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' -1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' -1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' + [189], +[1.1: syntax error, unexpected ')', expecting number or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting number or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting number or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting number or '-' or '(' or '!' calc: error: 4444 != 1]) # The same, but this time exercising explicitly triggered syntax errors. -# POSIX says the lookahead causing the error should not be discarded. -_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [62], -[1.9: syntax error, unexpected "number" +# POSIX says the look-ahead causing the error should not be discarded. +_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [76], +[1.9: syntax error, unexpected number calc: error: 2222 != 1]) -_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (0 0) = 1], [70], -[1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' -1.11: syntax error, unexpected "number" +_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (0 0) = 1], [86], +[1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!' +1.11: syntax error, unexpected number calc: error: 2222 != 1]) AT_BISON_OPTION_POPDEFS @@ -611,7 +607,7 @@ AT_BANNER([[Simple LALR1 C++ Calculator.]]) # Start a testing chunk which compiles `calc' grammar with # the C++ skeleton, and performs several tests over the parser. m4_define([AT_CHECK_CALC_LALR1_CC], -[AT_CHECK_CALC([%skeleton "lalr1.cc"] $@, [expected to fail])]) +[AT_CHECK_CALC([%skeleton "lalr1.cc"] $@)]) # AT_CHECK_CALC_LALR1_CC()