| # Process this -*- Autotest -*- file with autom4te. |
| |
| # Macros for the GNU Bison Test suite. |
| # Copyright (C) 2003, 2004, 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA |
| # 02110-1301, USA. |
| |
| # We want a recent Autotest. |
| m4_version_prereq([2.58]) |
| |
| |
| ## ------------------------------- ## |
| ## 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_CC_IF], |
| [m4_bmatch([$3], ["glr.cc"], [$1], [$2])]) |
| m4_pushdef([AT_SKEL_CC_IF], |
| [m4_bmatch([$3], ["\(glr\|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])]) |
| m4_pushdef([AT_NAME_PREFIX], |
| [m4_bmatch([$3], [%name-prefix=".*"], |
| [m4_bregexp([$3], [name-prefix="\([^"]*\)"], [\1])], |
| [yy])]) |
| # 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_SKEL_CC_IF([$1], [$2])])]) |
| |
| AT_PURE_LEX_IF( |
| [m4_pushdef([AT_LOC], [(*llocp)]) |
| m4_pushdef([AT_VAL], [(*lvalp)]) |
| m4_pushdef([AT_LEX_FORMALS], |
| [YYSTYPE *lvalp[]AT_LOCATION_IF([, YYLTYPE *llocp])]) |
| m4_pushdef([AT_LEX_ARGS], |
| [lvalp[]AT_LOCATION_IF([, llocp])]) |
| m4_pushdef([AT_USE_LEX_ARGS], |
| [(void) lvalp;AT_LOCATION_IF([(void) llocp])]) |
| 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_NAME_PREFIX]) |
| 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_SKEL_CC_IF]) |
| m4_popdef([AT_GLR_CC_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], |
| [[%{ |
| #ifdef HAVE_CONFIG_H |
| # include <config.h> |
| /* 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 ])-o $1 m4_default([$2], [$1.c])[]m4_bmatch([$1], [[.]], [], [ $LIBS])], |
| 0, [ignore], [ignore])]) |
| |
| # AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc]) |
| # -------------------------------------------- |
| # Compile SOURCES into OUTPUT. If OUTPUT does not contain '.', |
| # assume that we are linking too; this is a hack. |
| # If the C++ compiler does not work, ignore the test. |
| m4_define([AT_COMPILE_CXX], |
| [AT_KEYWORDS(c++) |
| AT_CHECK([$BISON_CXX_WORKS], 0, ignore, ignore) |
| AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.cc])[]m4_bmatch([$1], [[.]], [], [ $LIBS])], |
| 0, [ignore], [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])]) |
| |
| |
| |
| |
| ## ----------------------- ## |
| ## Launch the test suite. ## |
| ## ----------------------- ## |
| |
| AT_INIT |
| |
| AT_TESTED([bison]) |