From 67a25fed4cf5d7c93f6909f6a2a9fe23104eb0df Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 2 Mar 2003 11:14:07 +0000 Subject: [PATCH] Create tests/local.at for Bison generic testing macros. * tests/calc.at (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): Move to... * tests/local.at (AT_BISON_OPTION_PUSHDEFS, AT_BISON_OPTION_POPDEFS): This new file. * tests/calc.at (AT_CHECK_CALC): Adjust. * tests/testsuite.at (AT_DATA_GRAMMAR_PROLOGUE, AT_DATA_GRAMMAR) (AT_COMPILE, AT_COMPILE_CXX, AT_PARSER_CHECK): Move to... * tests/local.at: here. (AT_COMPILE_CXX): Tags the tests using it as c++. Ignore the test if CXX is not functional. --- ChangeLog | 14 ++++ tests/Makefile.am | 1 + tests/calc.at | 116 ++------------------------- tests/local.at | 192 +++++++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 57 ++------------ 5 files changed, 220 insertions(+), 160 deletions(-) create mode 100644 tests/local.at diff --git a/ChangeLog b/ChangeLog index e7f3e122..4126a953 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2003-03-02 Akim Demaille + + Create tests/local.at for Bison generic testing macros. + + * tests/calc.at (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): Move to... + * tests/local.at (AT_BISON_OPTION_PUSHDEFS, AT_BISON_OPTION_POPDEFS): + This new file. + * tests/calc.at (AT_CHECK_CALC): Adjust. + * tests/testsuite.at (AT_DATA_GRAMMAR_PROLOGUE, AT_DATA_GRAMMAR) + (AT_COMPILE, AT_COMPILE_CXX, AT_PARSER_CHECK): Move to... + * tests/local.at: here. + (AT_COMPILE_CXX): Tags the tests using it as c++. + Ignore the test if CXX is not functional. + 2003-03-01 Paul Eggert * src/scan-gram.l (code_start): Initialize it to scanner_cursor, diff --git a/tests/Makefile.am b/tests/Makefile.am index 85a853b1..ae91004e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -42,6 +42,7 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac ## ------------ ## TESTSUITE_AT = \ + local.at \ testsuite.at \ input.at \ output.at sets.at reduce.at \ diff --git a/tests/calc.at b/tests/calc.at index aade61cc..a6192142 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -54,8 +54,6 @@ typedef int value; static value global_result = 0; static int global_count = 0; - -]AT_LALR1_CC_IF([typedef yy::Location YYLTYPE;])[ %} /* Exercise %union. */ @@ -66,8 +64,8 @@ static int global_count = 0; %{ static int power (int base, int exponent); -]AT_LALR1_CC_IF([], [ -/* yyerror receives the location if: +]AT_LALR1_CC_IF([typedef yy::Location YYLTYPE;], +[/* yyerror receives the location if: - %location & %pure & %glr - %location & %pure & %yacc & %parse-param. */ static void yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ]) @@ -143,8 +141,7 @@ yy::Parser::error_ () int yyparse (void) { - yy::Parser parser = yy::Parser (!!YYDEBUG[]AT_LOCATION_IF([, - yy::Location::Location ()])); + yy::Parser parser (!!YYDEBUG[]AT_LOCATION_IF([, yy::Location::Location ()])); return parser.parse (); } ], @@ -426,100 +423,6 @@ AT_CHECK([cat stderr], 0, [expout]) ]) -# AT_CALC_PUSHDEFS($1, $2, [BISON-OPTIONS]) -# ----------------------------------------- -# This macro works around the impossibility to define macros -# inside macros, because issuing `[$1]' is not possible in M4 :(. -# This sucks hard, GNU M4 should really provide M5 like $$1. -m4_define([AT_CHECK_PUSHDEFS], -[m4_if([$1$2], $[1]$[2], [], - [m4_fatal([$0: Invalid arguments: $@])])dnl -m4_pushdef([AT_LALR1_CC_IF], -[m4_bmatch([$3], ["lalr1.cc"], [$1], [$2])]) -m4_pushdef([AT_GLR_IF], -[m4_bmatch([$3], [%glr-parser], [$1], [$2])]) -# Using yacc.c? -m4_pushdef([AT_YACC_IF], -[m4_bmatch([$3], [%glr-parser\|%skeleton], [$2], [$1])]) -m4_pushdef([AT_PARAM_IF], -[m4_bmatch([$3], [%parse-param], [$1], [$2])]) -m4_pushdef([AT_LOCATION_IF], -[m4_bmatch([$3], [%locations], [$1], [$2])]) -m4_pushdef([AT_PURE_IF], -[m4_bmatch([$3], [%pure-parser], [$1], [$2])]) -m4_pushdef([AT_PURE_AND_LOC_IF], -[m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations], - [$1], [$2])]) -m4_pushdef([AT_GLR_OR_PARAM_IF], -[m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])]) - -# yyerror receives the location if %location & %pure & (%glr or %parse-param). -m4_pushdef([AT_YYERROR_ARG_LOC_IF], -[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])], - [$2])]) -# yyerror always sees the locations (when activated), except if -# yacc & pure & !param. -m4_pushdef([AT_YYERROR_SEES_LOC_IF], -[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])], - [$1])], - [$1])], - [$2])]) - -# The interface is pure: either because %pure-parser, or because we -# are using the C++ parsers. -m4_pushdef([AT_PURE_LEX_IF], -[AT_PURE_IF([$1], - [AT_LALR1_CC_IF([$1], [$2])])]) - -AT_PURE_LEX_IF( -[m4_pushdef([AT_LOC], [(*yylloc)]) - m4_pushdef([AT_VAL], [(*yylval)]) - m4_pushdef([AT_LEX_FORMALS], - [YYSTYPE *yylval[]AT_LOCATION_IF([, YYLTYPE *yylloc])]) - m4_pushdef([AT_LEX_ARGS], - [yylval[]AT_LOCATION_IF([, yylloc])]) - m4_pushdef([AT_USE_LEX_ARGS], - [(void) yylval;AT_LOCATION_IF([(void) yylloc])]) - m4_pushdef([AT_LEX_PRE_FORMALS], - [AT_LEX_FORMALS, ]) - m4_pushdef([AT_LEX_PRE_ARGS], - [AT_LEX_ARGS, ]) -], -[m4_pushdef([AT_LOC], [(yylloc)]) - m4_pushdef([AT_VAL], [(yylval)]) - m4_pushdef([AT_LEX_FORMALS], [void]) - m4_pushdef([AT_LEX_ARGS], []) - m4_pushdef([AT_USE_LEX_ARGS], []) - m4_pushdef([AT_LEX_PRE_FORMALS], []) - m4_pushdef([AT_LEX_PRE_ARGS], []) -]) -])# AT_CALC_PUSHDEFS - - -# AT_CALC_POPDEFS -# --------------- -m4_define([AT_CHECK_POPDEFS], -[m4_popdef([AT_LEX_PRE_ARGS]) -m4_popdef([AT_LEX_PRE_FORMALS]) -m4_popdef([AT_USE_LEX_ARGS]) -m4_popdef([AT_LEX_ARGS]) -m4_popdef([AT_LEX_FORMALS]) -m4_popdef([AT_VAL]) -m4_popdef([AT_LOC]) -m4_popdef([AT_PURE_LEX_IF]) -m4_popdef([AT_YYERROR_SEES_LOC_IF]) -m4_popdef([AT_YYERROR_ARG_LOC_IF]) -m4_popdef([AT_GLR_OR_PARAM_IF]) -m4_popdef([AT_PURE_AND_LOC_IF]) -m4_popdef([AT_LOCATION_IF]) -m4_popdef([AT_PARAM_IF]) -m4_popdef([AT_YACC_IF]) -m4_popdef([AT_GLR_IF]) -m4_popdef([AT_LALR1_CC_IF]) -]) - - - # AT_CHECK_CALC([BISON-OPTIONS]) # ------------------------------ # Start a testing chunk which compiles `calc' grammar with @@ -528,18 +431,15 @@ m4_define([AT_CHECK_CALC], [# We use integers to avoid dependencies upon the precision of doubles. AT_SETUP([Calculator $1]) -AT_CHECK_PUSHDEFS($[1], $[2], [$1]) +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], - [0], [], []) +AT_CHECK([bison -o calc.c calc.y]) -AT_LALR1_CC_IF( -[AT_CHECK([$CXX --version || exit 77], 0, ignore, ignore) -AT_COMPILE_CXX([calc])], -[AT_COMPILE([calc])]) +AT_LALR1_CC_IF([AT_COMPILE_CXX([calc])], + [AT_COMPILE([calc])]) # Test the priorities. _AT_CHECK_CALC([$1], @@ -606,7 +506,7 @@ calc: error: 4444 != 1]) _AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [64], [1.9: syntax error, unexpected "number" calc: error: 2222 != 1]) -AT_CHECK_POPDEFS +AT_BISON_OPTION_POPDEFS AT_CLEANUP ])# AT_CHECK_CALC diff --git a/tests/local.at b/tests/local.at new file mode 100644 index 00000000..65ae073f --- /dev/null +++ b/tests/local.at @@ -0,0 +1,192 @@ +# Process this -*- Autotest -*- file with autom4te. + +# Macros for the GNU Bison Test suite. +# Copyright (C) 2003 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +## ------------------------------- ## +## Macros decoding Bison options. ## +## ------------------------------- ## + + +# AT_BISON_OPTION_PUSHDEFS([BISON-OPTIONS]) +# ----------------------------------------- +m4_define([AT_BISON_OPTION_PUSHDEFS], +[_AT_BISON_OPTION_PUSHDEFS($[1], $[2], [$1])]) + + +# _AT_BISON_OPTION_PUSHDEFS($1, $2, [BISON-OPTIONS]) +# -------------------------------------------------- +# This macro works around the impossibility to define macros +# inside macros, because issuing `[$1]' is not possible in M4 :(. +# This sucks hard, GNU M4 should really provide M5 like $$1. +m4_define([_AT_BISON_OPTION_PUSHDEFS], +[m4_if([$1$2], $[1]$[2], [], + [m4_fatal([$0: Invalid arguments: $@])])dnl +m4_pushdef([AT_LALR1_CC_IF], +[m4_bmatch([$3], ["lalr1.cc"], [$1], [$2])]) +m4_pushdef([AT_GLR_IF], +[m4_bmatch([$3], [%glr-parser], [$1], [$2])]) +# Using yacc.c? +m4_pushdef([AT_YACC_IF], +[m4_bmatch([$3], [%glr-parser\|%skeleton], [$2], [$1])]) +m4_pushdef([AT_PARAM_IF], +[m4_bmatch([$3], [%parse-param], [$1], [$2])]) +m4_pushdef([AT_LOCATION_IF], +[m4_bmatch([$3], [%locations], [$1], [$2])]) +m4_pushdef([AT_PURE_IF], +[m4_bmatch([$3], [%pure-parser], [$1], [$2])]) +m4_pushdef([AT_PURE_AND_LOC_IF], +[m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations], + [$1], [$2])]) +m4_pushdef([AT_GLR_OR_PARAM_IF], +[m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])]) + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). +m4_pushdef([AT_YYERROR_ARG_LOC_IF], +[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])], + [$2])]) +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. +m4_pushdef([AT_YYERROR_SEES_LOC_IF], +[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])], + [$1])], + [$1])], + [$2])]) + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. +m4_pushdef([AT_PURE_LEX_IF], +[AT_PURE_IF([$1], + [AT_LALR1_CC_IF([$1], [$2])])]) + +AT_PURE_LEX_IF( +[m4_pushdef([AT_LOC], [(*yylloc)]) + m4_pushdef([AT_VAL], [(*yylval)]) + m4_pushdef([AT_LEX_FORMALS], + [YYSTYPE *yylval[]AT_LOCATION_IF([, YYLTYPE *yylloc])]) + m4_pushdef([AT_LEX_ARGS], + [yylval[]AT_LOCATION_IF([, yylloc])]) + m4_pushdef([AT_USE_LEX_ARGS], + [(void) yylval;AT_LOCATION_IF([(void) yylloc])]) + m4_pushdef([AT_LEX_PRE_FORMALS], + [AT_LEX_FORMALS, ]) + m4_pushdef([AT_LEX_PRE_ARGS], + [AT_LEX_ARGS, ]) +], +[m4_pushdef([AT_LOC], [(yylloc)]) + m4_pushdef([AT_VAL], [(yylval)]) + m4_pushdef([AT_LEX_FORMALS], [void]) + m4_pushdef([AT_LEX_ARGS], []) + m4_pushdef([AT_USE_LEX_ARGS], []) + m4_pushdef([AT_LEX_PRE_FORMALS], []) + m4_pushdef([AT_LEX_PRE_ARGS], []) +]) +])# _AT_BISON_OPTION_PUSHDEFS + + +# AT_BISON_OPTION_POPDEFS +# ----------------------- +m4_define([AT_BISON_OPTION_POPDEFS], +[m4_popdef([AT_LEX_PRE_ARGS]) +m4_popdef([AT_LEX_PRE_FORMALS]) +m4_popdef([AT_USE_LEX_ARGS]) +m4_popdef([AT_LEX_ARGS]) +m4_popdef([AT_LEX_FORMALS]) +m4_popdef([AT_VAL]) +m4_popdef([AT_LOC]) +m4_popdef([AT_PURE_LEX_IF]) +m4_popdef([AT_YYERROR_SEES_LOC_IF]) +m4_popdef([AT_YYERROR_ARG_LOC_IF]) +m4_popdef([AT_GLR_OR_PARAM_IF]) +m4_popdef([AT_PURE_AND_LOC_IF]) +m4_popdef([AT_LOCATION_IF]) +m4_popdef([AT_PARAM_IF]) +m4_popdef([AT_YACC_IF]) +m4_popdef([AT_GLR_IF]) +m4_popdef([AT_LALR1_CC_IF]) +])# AT_BISON_OPTION_POPDEFS + + + +## -------------------------- ## +## Generating Grammar Files. ## +## -------------------------- ## + + +# AT_DATA_GRAMMAR_PROLOGUE +# ------------------------ +# The prologue that should be included in any grammar which parser is +# meant to be compiled. +m4_define([AT_DATA_GRAMMAR_PROLOGUE], +[[%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%}] +]) + + +# AT_DATA_GRAMMAR(NAME, CONTENT) +# ------------------------------ +# Generate the file NAME, which CONTENT is preceded by +# AT_DATA_GRAMMAR_PROLOGUE. +m4_define([AT_DATA_GRAMMAR], +[AT_DATA([$1], +[AT_DATA_GRAMMAR_PROLOGUE +$2]) +]) + + +## ------------------------ ## +## Compiling C, C++ Files. ## +## ------------------------ ## + + +# AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]) +# ---------------------------------------- +# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.', +# assume that we are linking too; this is a hack. +m4_define([AT_COMPILE], +[AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])m4_default([$2], [$1.c]) m4_bmatch([$1], [[.]], [], [$LIBS ])-o $1], + 0, [], [ignore])]) + +# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.c]) +# -------------------------------------------- +# If the C++ compiler is not defined, ignore the test. +m4_define([AT_COMPILE_CXX], +[AT_KEYWORDS(c++) +AT_CHECK([$CXX --version || exit 77], 0, ignore, ignore) +AT_CHECK([$CXX $CFLAGS $CPPFLAGS m4_default([$2], [$1.c]) -o $1], + 0, [], [ignore])]) + + + +## ---------------------------- ## +## Running a generated parser. ## +## ---------------------------- ## + +# AT_PARSER_CHECK(COMMAND, EXIT-STATUS, EXPOUT, EXPERR) +# ----------------------------------------------------- +# So that we can run `./testsuite PREPARSER='valgrind -q' for instance. +m4_define([AT_PARSER_CHECK], +[AT_CHECK([$PREPARSER $1], [$2], [$3], [$4])]) diff --git a/tests/testsuite.at b/tests/testsuite.at index 06063d6e..44cc8417 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -18,58 +18,11 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. -# We need a recent Autotest. -m4_version_prereq([2.52g]) - - -# AT_DATA_GRAMMAR_PROLOGUE -# ------------------------ -# The prologue that should be included in any grammar which parser is -# meant to be compiled. -m4_define([AT_DATA_GRAMMAR_PROLOGUE], -[[%{ -#if HAVE_CONFIG_H -# include - /* We don't need perfect functions for these tests. */ -# undef malloc -# undef memcmp -# undef realloc -#endif -%}] -]) - - -# AT_DATA_GRAMMAR(NAME, CONTENT) -# ------------------------------ -# Generate the file NAME, which CONTENT is preceded by -# AT_DATA_GRAMMAR_PROLOGUE. -m4_define([AT_DATA_GRAMMAR], -[AT_DATA([$1], -[AT_DATA_GRAMMAR_PROLOGUE -$2]) -]) - - -# AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]) -# ---------------------------------------- -# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.', -# assume that we are linking too; this is a hack. -m4_define([AT_COMPILE], -[AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])m4_default([$2], [$1.c]) m4_bmatch([$1], [[.]], [], [$LIBS ])-o $1], - 0, [], [ignore])]) - -# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.c]) -# -------------------------------------------- -m4_define([AT_COMPILE_CXX], -[AT_CHECK([$CXX $CFLAGS $CPPFLAGS m4_default([$2], [$1.c]) -o $1], 0, - [], [ignore])]) - - -# AT_PARSER_CHECK(COMMAND, EXIT-STATUS, EXPOUT, EXPERR) -# ----------------------------------------------------- -# So that we can run `./testsuite PREPARSER='valgrind -q' for instance. -m4_define([AT_PARSER_CHECK], -[AT_CHECK([$PREPARSER $1], [$2], [$3], [$4])]) +# We want a recent Autotest. +m4_version_prereq([2.57]) + +# Helping macros. +m4_include([local.at]) AT_INIT -- 2.45.2