From: Akim Demaille Date: Thu, 6 Feb 2003 10:04:29 +0000 (+0000) Subject: * configure.ac (GXX): Rename as... X-Git-Tag: BISON-2_0~400 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/7548fed236e50c5ba9933c373a537f1a1dd15224 * configure.ac (GXX): Rename as... (CXX): this, to keep the original Autoconf semantics. Require 2.57. * data/lalr1.cc: Fix b4_copyright invocations. If YYDEBUG is not defined, don't depend upon name_ being defined. (location.hh): Include string and iostream. (Position::filename): New member. (Position::Position ()): New. (operator<< (Position)): New. (operator- (Position, int)): New. (Location::first, Location::last): Rename as... (Location::begin, Location::end): these, to mock the conventional iterator names. (operator<< (Location)): New. * tests/atlocal.in (CXX): New. * tests/testsuite.at (AT_COMPILE_CXX): New. * tests/calc.at (_AT_DATA_CALC_Y): Adjust yyerror to report the locations in a more synthetic way. (AT_CHECK_PUSHDEFS): AT_YYERROR_SEES_LOC_IF is positive if lalr1.cc is used. Adjust the C locations to match those from Emacs: first column is column 0. Change all the expected results. Conform to the GCS: simplify the locations when applicable. (LOC, VAL, YYLLOC_FORMAL, YYLLOC_ARG, USE_YYLLOC, LEX_FORMALS) (LEX_ARGS, USE_LEX_ARGS, LEX_PRE_FORMALS, LEX_PRE_ARGS): Replace these CPP macros with the m4 macros new defined by... (AT_CHECK_PUSHDEFS): this, i.e.: (AT_LALR1_CC_IF, AT_PURE_LEX_IF, AT_LOC, AT_VAL, AT_LEX_FORMALS) (AT_LEX_ARGS, AT_USE_LEX_ARGS, AT_LEX_PRE_FORMALSm AT_LEX_PRE_ARGS) New macros. (AT_CHECK_POPDEFS): Undefine them. (AT_CHECK_CALC_LALR1_CC): New. Use it for the first lalr1.cc test. --- diff --git a/ChangeLog b/ChangeLog index f3ac0153..9af12367 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,40 @@ +2003-02-06 Akim Demaille + + * configure.ac (GXX): Rename as... + (CXX): this, to keep the original Autoconf semantics. + Require 2.57. + * data/lalr1.cc: Fix b4_copyright invocations. + If YYDEBUG is not defined, don't depend upon name_ being defined. + (location.hh): Include string and iostream. + (Position::filename): New member. + (Position::Position ()): New. + (operator<< (Position)): New. + (operator- (Position, int)): New. + (Location::first, Location::last): Rename as... + (Location::begin, Location::end): these, to mock the conventional + iterator names. + (operator<< (Location)): New. + * tests/atlocal.in (CXX): New. + * tests/testsuite.at (AT_COMPILE_CXX): New. + * tests/calc.at (_AT_DATA_CALC_Y): Adjust yyerror to report the + locations in a more synthetic way. + (AT_CHECK_PUSHDEFS): AT_YYERROR_SEES_LOC_IF is positive if + lalr1.cc is used. + Adjust the C locations to match those from Emacs: first column is + column 0. + Change all the expected results. + Conform to the GCS: simplify the locations when applicable. + (LOC, VAL, YYLLOC_FORMAL, YYLLOC_ARG, USE_YYLLOC, LEX_FORMALS) + (LEX_ARGS, USE_LEX_ARGS, LEX_PRE_FORMALS, LEX_PRE_ARGS): Replace + these CPP macros with the m4 macros new defined by... + (AT_CHECK_PUSHDEFS): this, i.e.: + (AT_LALR1_CC_IF, AT_PURE_LEX_IF, AT_LOC, AT_VAL, AT_LEX_FORMALS) + (AT_LEX_ARGS, AT_USE_LEX_ARGS, AT_LEX_PRE_FORMALSm AT_LEX_PRE_ARGS) + New macros. + (AT_CHECK_POPDEFS): Undefine them. + (AT_CHECK_CALC_LALR1_CC): New. + Use it for the first lalr1.cc test. + 2003-02-04 Akim Demaille * data/lalr1.cc (YYLLOC_DEFAULT): Fix its definition: be based on diff --git a/configure.ac b/configure.ac index 19ff73b7..d93303ba 100644 --- a/configure.ac +++ b/configure.ac @@ -18,7 +18,7 @@ # 02111-1307 USA # We need a recent Autoconf to run a recent Autotest. -AC_PREREQ(2.56) +AC_PREREQ(2.57) AC_INIT([GNU Bison], [1.875b], [bug-bison@gnu.org]) AC_CONFIG_AUX_DIR(config) @@ -125,7 +125,7 @@ AC_CONFIG_TESTDIR(tests) AC_CONFIG_FILES([tests/Makefile tests/atlocal]) AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison]) AC_CHECK_PROGS([VALGRIND], [valgrind]) -AC_CHECK_PROGS([GXX], [g++]) +AC_CHECK_PROGS([CXX], [g++]) AM_MISSING_PROG([AUTOM4TE], [autom4te]) # Needed by tests/atlocal.in. AC_SUBST([GCC]) diff --git a/data/lalr1.cc b/data/lalr1.cc index eb4376c0..670b68e1 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -140,7 +140,7 @@ b4_syncline([@oline@], [@ofile@])], b4_syncline([@oline@], [@ofile@])[ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ - Current.last = Rhs[N].last; + Current.end = Rhs[N].end; #endif namespace yy @@ -525,8 +525,10 @@ b4_syncline([@oline@], [@ofile@])[ /* Return failure if at end of input. */ if (looka_ == eof_) goto yyabortlab; +#if YYDEBUG YYCDEBUG << "Discarding token " << looka_ - << " (" << name_[ilooka_] << ")." << std::endl; + << " (" << name_[ilooka_] << ")." << std::endl; +#endif looka_ = empty_; } @@ -768,7 +770,7 @@ const yy::]b4_parser_class_name[::TokenNumberType yy::]b4_parser_class_name[::un ]b4_epilogue dnl @output stack.hh -b4_copyright([2002, 2003])[ +b4_copyright([Stack handling for Bison C++ parsers], [2002, 2003])[ #ifndef BISON_STACK_HH # define BISON_STACK_HH @@ -865,24 +867,69 @@ namespace yy #endif // not BISON_STACK_HH] dnl @output location.hh -b4_copyright([2002, 2003])[ +b4_copyright([Location class for Bison C++ parsers], [2002, 2003])[ #ifndef BISON_LOCATION_HH # define BISON_LOCATION_HH +# include +# include + namespace yy { - struct Position + class Position { + public: + Position () + : filename (), line (1), column (0) + {} + + std::string filename; int line; int column; }; - struct Location + inline std::ostream& + operator<< (std::ostream& ostr, const Position& pos) + { + if (pos.filename != "") + ostr << pos.filename << ':'; + ostr << pos.line << '.' << pos.column; + return ostr; + } + + inline Position + operator- (const Position& pos, int col) + { + Position res (pos); + res.column -= col; + return res; + } + + + class Location { - Position first; - Position last; + public: + Position begin; + Position end; }; + + /* Don't issue twice the line number when the location is on a single + line. */ + + inline std::ostream& + operator<< (std::ostream& ostr, const Location& pos) + { + ostr << pos.begin; + if (pos.begin.filename != pos.end.filename) + ostr << '-' << pos.end - 1; + else if (pos.begin.line != pos.end.line) + ostr << '-' << pos.end.line << '.' << pos.end.column - 1; + else if (pos.begin.column != pos.end.column - 1) + ostr << '-' << pos.end.column - 1; + return ostr; + } + } #endif // not BISON_LOCATION_HH] diff --git a/tests/atlocal.in b/tests/atlocal.in index 9046abb5..3270192a 100644 --- a/tests/atlocal.in +++ b/tests/atlocal.in @@ -1,6 +1,6 @@ # @configure_input@ -*- shell-script -*- # Configurable variable values for Bison test suite. -# Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. +# Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. # We need a C compiler. CC='@CC@' @@ -13,3 +13,6 @@ CPPFLAGS="-DHAVE_CONFIG_H=1 -I$abs_top_builddir @CPPFLAGS@" # Is the compiler GCC? GCC='@GCC@' + +# The GCC C++ compiler. +CXX='@CXX@' diff --git a/tests/calc.at b/tests/calc.at index 7cf12d39..a5e64efe 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -1,5 +1,5 @@ # Checking the output filenames. -*- Autotest -*- -# Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. +# Copyright (C) 2000, 2001, 2002, 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 @@ -55,6 +55,7 @@ typedef int value; static value global_result = 0; static int global_count = 0; +]AT_LALR1_CC_IF([typedef yy::Location YYLTYPE;])[ %} /* Exercise %union. */ @@ -64,32 +65,6 @@ static int global_count = 0; }; %{ -#if YYPURE -# define LOC (*yylloc) -# define VAL (*yylval) -#else -# define LOC (yylloc) -# define VAL (yylval) -#endif - -#define YYLLOC_FORMAL ]AT_LOCATION_IF([, YYLTYPE *yylloc])[ -#define YYLLOC_ARG ]AT_LOCATION_IF([, yylloc])[ -#define USE_YYLLOC ]AT_LOCATION_IF([(void) yylloc;])[ - -#if YYPURE -# define LEX_FORMALS YYSTYPE *yylval YYLLOC_FORMAL -# define LEX_ARGS yylval YYLLOC_ARG -# define USE_LEX_ARGS (void) yylval; USE_YYLLOC -# define LEX_PRE_FORMALS LEX_FORMALS, -# define LEX_PRE_ARGS LEX_ARGS, -#else -# define LEX_FORMALS void -# define LEX_PRE_FORMALS -# define LEX_ARGS -# define LEX_PRE_ARGS -# define USE_LEX_ARGS -#endif - static int power (int base, int exponent); /* yyerror receives the location if: - %location & %pure & %glr @@ -98,9 +73,9 @@ static void yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ])[ ]AT_PARAM_IF([value *result, int *count, ])[ const char *s ); -static int yylex (LEX_FORMALS); -static int yygetc (LEX_FORMALS); -static void yyungetc (LEX_PRE_FORMALS int c); +static int yylex (]AT_LEX_FORMALS[); +static int yygetc (]AT_LEX_FORMALS[); +static void yyungetc (]AT_LEX_PRE_FORMALS[ int c); %} /* Bison Declarations */ @@ -147,76 +122,108 @@ exp: /* The input. */ static FILE *yyin; -static void -yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ])[ - ]AT_PARAM_IF([value *result, int *count, ])[ - const char *s - ) +]AT_LALR1_CC_IF( +[/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () { -]AT_PARAM_IF([(void) result; (void) count; ])[ -]AT_YYERROR_SEES_LOC_IF([ - fprintf (stderr, "%d.%d-%d.%d: ", - LOC.first_line, LOC.first_column, - LOC.last_line, LOC.last_column); -])[ - fprintf (stderr, "%s\n", s); + std::cerr << location; } +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << location << ": " << message << std::endl; +} + +int +yyparse (void) +{ + yy::Parser parser = yy::Parser (!!YYDEBUG[]AT_LOCATION_IF([, + yy::Location::Location ()])); + return parser.parse (); +} +], +[static void +yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ]) + AT_PARAM_IF([value *result, int *count, ]) + const char *s) +{ +AT_PARAM_IF([(void) result; (void) count;]) +AT_YYERROR_SEES_LOC_IF([ + fprintf (stderr, "%d.%d", + AT_LOC.first_line, AT_LOC.first_column); + if (AT_LOC.first_line != AT_LOC.last_line) + fprintf (stderr, "-%d.%d", + AT_LOC.last_line, AT_LOC.last_column - 1); + else if (AT_LOC.first_column != AT_LOC.last_column - 1) + fprintf (stderr, "-%d", + AT_LOC.last_column - 1); + fprintf (stderr, ": ");]) + fprintf (stderr, "%s\n", s); +}])[ + ]AT_LOCATION_IF([ static YYLTYPE last_yylloc; ])[ static int -yygetc (LEX_FORMALS) +yygetc (]AT_LEX_FORMALS[) { int res = getc (yyin); - USE_LEX_ARGS; + ]AT_USE_LEX_ARGS[; ]AT_LOCATION_IF([ - last_yylloc = LOC; + last_yylloc = AT_LOC; if (res == '\n') { - LOC.last_line++; - LOC.last_column = 1; +AT_LALR1_CC_IF( +[ AT_LOC.end.line++; + AT_LOC.end.column = 0;], +[ AT_LOC.last_line++; + AT_LOC.last_column = 0;]) } else - LOC.last_column++; +AT_LALR1_CC_IF( +[ AT_LOC.end.column++;], +[ AT_LOC.last_column++;]) ])[ return res; } static void -yyungetc (LEX_PRE_FORMALS int c) +yyungetc (]AT_LEX_PRE_FORMALS[ int c) { - USE_LEX_ARGS; + ]AT_USE_LEX_ARGS[; ]AT_LOCATION_IF([ /* Wrong when C == `\n'. */ - LOC = last_yylloc; + AT_LOC = last_yylloc; ])[ ungetc (c, yyin); } static int -read_signed_integer (LEX_FORMALS) +read_signed_integer (]AT_LEX_FORMALS[) { - int c = yygetc (LEX_ARGS); + int c = yygetc (]AT_LEX_ARGS[); int sign = 1; int n = 0; - USE_LEX_ARGS; + ]AT_USE_LEX_ARGS[; if (c == '-') { - c = yygetc (LEX_ARGS); + c = yygetc (]AT_LEX_ARGS[); sign = -1; } while (isdigit (c)) { n = 10 * n + (c - '0'); - c = yygetc (LEX_ARGS); + c = yygetc (]AT_LEX_ARGS[); } - yyungetc (LEX_PRE_ARGS c); + yyungetc (]AT_LEX_PRE_ARGS[ c); return sign * n; } @@ -230,7 +237,7 @@ read_signed_integer (LEX_FORMALS) `---------------------------------------------------------------*/ static int -yylex (LEX_FORMALS) +yylex (]AT_LEX_FORMALS[) { static int init = 1; int c; @@ -238,31 +245,36 @@ yylex (LEX_FORMALS) if (init) { init = 0; -]AT_LOCATION_IF([ - LOC.last_column = 1; - LOC.last_line = 1; -])[ +]AT_LALR1_CC_IF([], +[AT_LOCATION_IF([ + AT_LOC.last_column = 0; + AT_LOC.last_line = 1; +])])[ } -]AT_LOCATION_IF([ - LOC.first_column = LOC.last_column; - LOC.first_line = LOC.last_line; -])[ +]AT_LALR1_CC_IF( +[ AT_LOC.begin = AT_LOC.end;], +[AT_LOCATION_IF([ + AT_LOC.first_column = AT_LOC.last_column; + AT_LOC.first_line = AT_LOC.last_line; +])])[ /* Skip white space. */ - while ((c = yygetc (LEX_ARGS)) == ' ' || c == '\t') + while ((c = yygetc (]AT_LEX_ARGS[)) == ' ' || c == '\t') { -]AT_LOCATION_IF([ - LOC.first_column = LOC.last_column; - LOC.first_line = LOC.last_line; -])[ +]AT_LALR1_CC_IF( +[ AT_LOC.begin = AT_LOC.end;], +[AT_LOCATION_IF([ + AT_LOC.first_column = AT_LOC.last_column; + AT_LOC.first_line = AT_LOC.last_line; +])])[ } /* process numbers */ if (c == '.' || isdigit (c)) { - yyungetc (LEX_PRE_ARGS c); - VAL.ival = read_signed_integer (LEX_ARGS); + yyungetc (]AT_LEX_PRE_ARGS[ c); + ]AT_VAL[.ival = read_signed_integer (]AT_LEX_ARGS[); return NUM; } @@ -285,6 +297,7 @@ power (int base, int exponent) return res; } + int main (int argc, const char **argv) { @@ -421,14 +434,16 @@ AT_CHECK([cat stderr], 0, [expout]) 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])]) 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_GLR_IF], -[m4_bmatch([$3], [%glr-parser], [$1], [$2])]) m4_pushdef([AT_PURE_AND_LOC_IF], [m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations], [$1], [$2])]) @@ -441,23 +456,63 @@ m4_pushdef([AT_YYERROR_ARG_LOC_IF], [$2])]) # yyerror cannot see the locations if !glr & pure & !param. m4_pushdef([AT_YYERROR_SEES_LOC_IF], -[AT_LOCATION_IF([AT_GLR_IF([$1], - [AT_PURE_IF([AT_PARAM_IF([$1], [$2])], - [$1])])], - [$2])]) +[AT_LALR1_CC_IF([$1], + [AT_LOCATION_IF([AT_GLR_IF([$1], + [AT_PURE_IF([AT_PARAM_IF([$1], + [$2])], + [$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_YYERROR_SEES_LOC_IF]) +[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_GLR_IF]) m4_popdef([AT_LOCATION_IF]) m4_popdef([AT_PARAM_IF]) +m4_popdef([AT_GLR_IF]) +m4_popdef([AT_LALR1_CC_IF]) ]) @@ -478,7 +533,10 @@ AT_DATA_CALC_Y([$1]) AT_CHECK([bison -o calc.c calc.y], [0], [], []) -AT_COMPILE([calc]) +AT_LALR1_CC_IF( +[AT_CHECK([$CXX --version || exit 77], 0, ignore, ignore) +AT_COMPILE_CXX([calc])], +[AT_COMPILE([calc])]) # Test the priorities. _AT_CHECK_CALC([$1], @@ -499,28 +557,28 @@ _AT_CHECK_CALC([$1], # Some syntax errors. _AT_CHECK_CALC_ERROR([$1], [1], [0 0], [11], - [1.3-1.4: syntax error, unexpected "number"]) + [1.2: syntax error, unexpected "number"]) _AT_CHECK_CALC_ERROR([$1], [1], [1//2], [15], - [1.3-1.4: syntax error, unexpected '/', expecting "number" or '-' or '(']) + [1.2: syntax error, unexpected '/', expecting "number" or '-' or '(']) _AT_CHECK_CALC_ERROR([$1], [1], [error], [4], - [1.1-1.2: syntax error, unexpected $undefined, expecting "number" or '-' or '\n' or '(']) + [1.0: syntax error, unexpected $undefined, expecting "number" or '-' or '\n' or '(']) _AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [22], - [1.7-1.8: syntax error, unexpected '=']) + [1.6: syntax error, unexpected '=']) _AT_CHECK_CALC_ERROR([$1], [1], [ +1], [14], - [2.1-2.2: syntax error, unexpected '+']) + [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.1-1.2: syntax error, unexpected "end of input", expecting "number" or '-' or '\n' or '(']) + [1.0: syntax error, unexpected "end of input", expecting "number" or '-' or '\n' or '(']) # Exercise the error token: without it, we die at the first error, # hence be sure i. to have several errors, ii. to test the action # associated to `error'. _AT_CHECK_CALC_ERROR([$1], [0], [(1 ++ 2) + (0 0) = 1], [82], -[1.5-1.6: syntax error, unexpected '+', expecting "number" or '-' or '(' -1.15-1.16: syntax error, unexpected "number" +[1.4: syntax error, unexpected '+', expecting "number" or '-' or '(' +1.14: syntax error, unexpected "number" calc: error: 0 != 1]) AT_CHECK_POPDEFS @@ -598,3 +656,38 @@ 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}]) + + +# ----------------------------- # +# Simple LALR1 C++ Calculator. # +# ----------------------------- # + +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. +m4_define([AT_CHECK_CALC_LALR1_CC], +[AT_CHECK_CALC([%skeleton "lalr1.cc"] $@)]) + +# AT_CHECK_CALC_LALR1_CC() + +AT_CHECK_CALC_LALR1_CC([%defines %pure-parser %locations]) +# AT_CHECK_CALC_LALR1_CC([%defines]) +# AT_CHECK_CALC_LALR1_CC([%locations]) +# AT_CHECK_CALC_LALR1_CC([%name-prefix="calc"]) +# AT_CHECK_CALC_LALR1_CC([%verbose]) +# AT_CHECK_CALC_LALR1_CC([%yacc]) +# AT_CHECK_CALC_LALR1_CC([%error-verbose]) + +# AT_CHECK_CALC_LALR1_CC([%error-verbose %locations]) + +# AT_CHECK_CALC_LALR1_CC([%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc]) + +# AT_CHECK_CALC_LALR1_CC([%debug]) +# AT_CHECK_CALC_LALR1_CC([%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]) + +# 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}]) diff --git a/tests/testsuite.at b/tests/testsuite.at index dd21fb54..870207a4 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -52,12 +52,18 @@ $2]) # AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]) # ---------------------------------------- -# m4_define([AT_COMPILE], [AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_default([$2], [$1.c]) -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.