X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/211074caca8d7990cefa5e9a3dfcf4397385d372..e757bb10bc149bd325ff935f8fb7454bd4c7a02a:/tests/calc.at diff --git a/tests/calc.at b/tests/calc.at index 81af81c3..71d35f07 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -1,5 +1,5 @@ -# Checking the output filenames. -*- Autotest -*- -# Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +# Simple calculator. -*- Autotest -*- +# Copyright (C) 2000, 2001, 2002, 2003, 2004 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 @@ -41,25 +41,27 @@ AT_DATA_GRAMMAR([calc.y], %{ #include -#if STDC_HEADERS -# include -# include +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ #endif #include -extern void perror (const char *s); - /* Exercise pre-prologue dependency to %union. */ -typedef int value; +typedef int semantic_value; -static value global_result = 0; +static semantic_value global_result = 0; static int global_count = 0; %} /* Exercise %union. */ %union { - value ival; + semantic_value ival; }; %{ @@ -69,7 +71,7 @@ static int power (int base, int exponent); - %location & %pure & %glr - %location & %pure & %yacc & %parse-param. */ static void yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ]) - AT_PARAM_IF([value *result, int *count, ]) + AT_PARAM_IF([semantic_value *result, int *count, ]) const char *s );])[ static int yylex (]AT_LEX_FORMALS[); @@ -117,6 +119,7 @@ exp: | '(' exp ')' { $$ = $2; } | '(' error ')' { $$ = 1111; } | '!' { YYERROR; } +| '-' error { YYERROR; } ; %% /* The input. */ @@ -139,15 +142,15 @@ yy::Parser::error_ () } int -yyparse (void) +yyparse (AT_PARAM_IF([semantic_value *result, int *count])) { - yy::Parser parser (!!YYDEBUG[]AT_LOCATION_IF([, yy::Location::Location ()])); + yy::Parser parser (!!YYDEBUG[]AT_LOCATION_IF([, yy::Location ()])AT_PARAM_IF([, result, count])); return parser.parse (); } ], [static void yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ]) - AT_PARAM_IF([value *result, int *count, ]) + AT_PARAM_IF([semantic_value *result, int *count, ]) const char *s) { AT_PARAM_IF([(void) result; (void) count;]) @@ -299,10 +302,11 @@ power (int base, int exponent) int main (int argc, const char **argv) { - value result = 0; + semantic_value result = 0; int count = 0; int status; + alarm (10); if (argc == 2) yyin = fopen (argv[1], "r"); else @@ -423,23 +427,26 @@ AT_CHECK([cat stderr], 0, [expout]) ]) -# AT_CHECK_CALC([BISON-OPTIONS]) +# AT_CHECK_CALC([BISON-OPTIONS [, EXPECTED-TO-FAIL]]) # ------------------------------ # Start a testing chunk which compiles `calc' grammar with # BISON-OPTIONS, and performs several tests over the parser. +# However, if EXPECTED-TO-FAIL is nonempty, this test is expected to fail. m4_define([AT_CHECK_CALC], [# We use integers to avoid dependencies upon the precision of doubles. AT_SETUP([Calculator $1]) +m4_ifval([$2], [AT_CHECK([exit 77])]) + 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], @@ -459,21 +466,21 @@ _AT_CHECK_CALC([$1], [486]) # Some syntax errors. -_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [11], +_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [12], [1.2: syntax error, unexpected "number"]) -_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [15], +_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [16], [1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!']) -_AT_CHECK_CALC_ERROR([$1], [1], [error], [4], +_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], [23], [1.6: syntax error, unexpected '=']) _AT_CHECK_CALC_ERROR([$1], [1], [ +1], - [14], + [15], [2.0: syntax error, unexpected '+']) # Exercise error messages with EOF: work on an empty file. -_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4], +_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [5], [1.0: syntax error, unexpected "end of input"]) # Exercise the error token: without it, we die at the first error, @@ -487,8 +494,8 @@ _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. # @@ -502,10 +509,14 @@ _AT_CHECK_CALC_ERROR([$1], [0], 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], [64], +# POSIX says the look-ahead causing the error should not be discarded. +_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [62], [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" +calc: error: 2222 != 1]) AT_BISON_OPTION_POPDEFS AT_CLEANUP @@ -546,7 +557,7 @@ AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix="calc AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) -AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {value *result} %parse-param {int *count}]) +AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}]) # ----------------------- # @@ -582,7 +593,7 @@ AT_CHECK_CALC_GLR([%error-verbose %debug %locations %defines %name-prefix="calc" AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) -AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {value *result} %parse-param {int *count}]) +AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}]) # ----------------------------- # @@ -594,7 +605,7 @@ AT_BANNER([[Simple LALR1 C++ Calculator.]]) # AT_CHECK_CALC_LALR1_CC([BISON-OPTIONS]) # --------------------------------------- # Start a testing chunk which compiles `calc' grammar with -# BISON-OPTIONS and %glr-parser, and performs several tests over the parser. +# the C++ skeleton, and performs several tests over the parser. m4_define([AT_CHECK_CALC_LALR1_CC], [AT_CHECK_CALC([%skeleton "lalr1.cc"] $@)]) @@ -619,4 +630,4 @@ AT_CHECK_CALC_LALR1_CC([%error-verbose %debug %locations %defines %name-prefix=" AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) -# AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {value *result} %parse-param {int *count}]) +AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])