From 6112cb1802254af7678f4754ff6059b0500667e9 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 4 Feb 2013 16:13:02 +0100 Subject: [PATCH] tests: improve the language independance layer * tests/local.at (_AT_LANG_DISPATCH): New, shamelessly stolen from Autoconf's _AT_LANG_DISPATCH. (AT_LANG_DISPATCH): New. (AT_YYERROR_FORMALS, AT_YYERROR_PROTOTYPE, AT_YYERROR_DECLARE_EXTERN) (AT_YYERROR_DECLARE, AT_YYERROR_DEFINE, AT_MAIN_DEFINE, AT_COMPILE) (AT_FULL_COMPILE): Use AT_LANG_DISPATCH instead of an ad hoc m4_case. --- tests/local.at | 210 ++++++++++++++++++++++++++++++------------------- 1 file changed, 128 insertions(+), 82 deletions(-) diff --git a/tests/local.at b/tests/local.at index c1aedf39..39689c7e 100644 --- a/tests/local.at +++ b/tests/local.at @@ -317,6 +317,25 @@ AT_LOC_POPDEF])dnl ## Generating Grammar Files. ## ## -------------------------- ## +# _AT_LANG_DISPATCH(LANG, MACRO, ARGS) +# ------------------------------------ +# Call the specialization of MACRO for LANG with ARGS. Complain if +# unavailable. +m4_define([_AT_LANG_DISPATCH], +[m4_ifdef([$2($1)], + [m4_indir([$2($1)], m4_shift2($@))], + [m4_fatal([$2: unknown language: $1])])]) + + +# AT_LANG_DISPATCH(MACRO, ARGS) +# ----------------------------- +# Call the specialization of MACRO for AT_LANG with ARGS. Complain if +# unavailable. +m4_define([AT_LANG_DISPATCH], +[_AT_LANG_DISPATCH(AT_LANG, $@)]) + + + # AT_DATA_SOURCE_PROLOGUE # ------------------------ # The prologue that should be included in any source code that is @@ -406,24 +425,33 @@ static # AT_YYERROR_DEFINE # ------------------------- # Must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS pair. -m4_define([AT_YYERROR_FORMALS], -[m4_case(AT_LANG, -[c], [AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE const * const llocp, ])AT_PARSE_PARAMS [const char *msg]])[]dnl -]) +m4_define([AT_YYERROR_FORMALS], [AT_LANG_DISPATCH([$0], $@)]) +m4_define([AT_YYERROR_PROTOTYPE],[AT_LANG_DISPATCH([$0], $@)]) +m4_define([AT_YYERROR_DECLARE_EXTERN], [AT_LANG_DISPATCH([$0], $@)]) +m4_define([AT_YYERROR_DECLARE], [AT_LANG_DISPATCH([$0], $@)]) +m4_define([AT_YYERROR_DEFINE], [AT_LANG_DISPATCH([$0], $@)]) -m4_define([AT_YYERROR_PROTOTYPE], -[m4_case(AT_LANG, -[c], [[void ]AT_NAME_PREFIX[error (]AT_YYERROR_FORMALS[)]])[]dnl -]) +# AT_MAIN_DEFINE +# -------------- +m4_define([AT_MAIN_DEFINE], [AT_LANG_DISPATCH([$0], $@)]) -m4_define([AT_YYERROR_DECLARE_EXTERN], -[m4_case(AT_LANG, -[c], [AT_YYERROR_PROTOTYPE;])[]dnl -]) -m4_define([AT_YYERROR_DECLARE], -[m4_case(AT_LANG, -[c], [#include + +## --- ## +## C. ## +## --- ## + +m4_define([AT_YYERROR_FORMALS(c)], +[AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE const * const llocp, ])AT_PARSE_PARAMS [const char *msg]]) + +m4_define([AT_YYERROR_PROTOTYPE(c)], +[[void ]AT_NAME_PREFIX[error (]AT_YYERROR_FORMALS[)]]) + +m4_define([AT_YYERROR_DECLARE_EXTERN(c)], +[AT_YYERROR_PROTOTYPE;]) + +m4_define([AT_YYERROR_DECLARE(c)], +[#include ]AT_LOCATION_IF([[ #if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL static unsigned location_print (FILE *yyo, ]AT_YYLTYPE[ const * const yylocp); @@ -432,12 +460,11 @@ static unsigned location_print (FILE *yyo, ]AT_YYLTYPE[ const * const yylocp); # endif #endif ]])[ -static AT_YYERROR_DECLARE_EXTERN])[]dnl -]) +static AT_YYERROR_DECLARE_EXTERN]) + -m4_define([AT_YYERROR_DEFINE], -[m4_case(AT_LANG, -[c], [[ +m4_define([AT_YYERROR_DEFINE(c)], +[[ ]AT_LOCATION_IF([[ # if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL /* Print *YYLOCP on YYO. */ @@ -478,34 +505,10 @@ AT_YYERROR_SEES_LOC_IF([[ LOCATION_PRINT (stderr, ]AT_LOC[); fprintf (stderr, ": ");]])[ fprintf (stderr, "%s\n", msg); -}]], -[c++], [[/* A C++ error reporting function. */ -void -]AT_NAME_PREFIX[::parser::error (]AT_LOCATION_IF([[const location_type& l, ]])[const std::string& m) -{ - std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << std::endl; -}]], -[java], [AT_LOCATION_IF([[public void yyerror (Calc.Location l, String s) -{ - if (l == null) - System.err.println (s); - else - System.err.println (l + ": " + s); - } -]], [[ - public void yyerror (String s) - { - System.err.println (s); - }]])], -[m4_fatal([$0: invalid language: ]AT_LANG)])dnl -]) +}]]) -# AT_MAIN_DEFINE -# -------------- -m4_define([AT_MAIN_DEFINE], -[m4_case(AT_LANG, -[c], +m4_define([AT_MAIN_DEFINE(c)], [[#include /* getenv. */ #include /* strcmp. */ int @@ -518,8 +521,27 @@ main (int argc, char const* argv[]) (void) argc; (void) argv;]])[ return ]AT_NAME_PREFIX[parse (); -}]], -[c++], +}]]) + + +## ----- ## +## C++. ## +## ----- ## + +# No need to declare, it's part of the class interface. +m4_define([AT_YYERROR_DECLARE(c++)], []) +m4_define([AT_YYERROR_DECLARE_EXTERN(c++)], []) + +m4_define([AT_YYERROR_DEFINE(c++)], +[[/* A C++ error reporting function. */ +void +]AT_NAME_PREFIX[::parser::error (]AT_LOCATION_IF([[const location_type& l, ]])[const std::string& m) +{ + std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << std::endl; +}]]) + + +m4_define([AT_MAIN_DEFINE(c++)], [[#include // getenv. #include // strcmp. int @@ -533,8 +555,30 @@ main (int argc, char const* argv[]) (void) argc; (void) argv;]])[ return p.parse (); -}]], -[java], +}]]) + + + +## ------ ## +## Java. ## +## ------ ## + +m4_define([AT_YYERROR_DEFINE(java)], +[AT_LOCATION_IF([[public void yyerror (Calc.Location l, String s) +{ + if (l == null) + System.err.println (s); + else + System.err.println (l + ": " + s); + } +]], [[ + public void yyerror (String s) + { + System.err.println (s); + } +]])]) + +m4_define([AT_MAIN_DEFINE(java)], [[class input { public static void main (String args[]) throws IOException @@ -542,7 +586,8 @@ main (int argc, char const* argv[]) YYParser p = new YYParser (); p.parse (); } -}]])]) +}]]) + ## --------------- ## @@ -726,6 +771,7 @@ AT_CHECK(m4_join([ ], [m4_bmatch([$1], [[.]], [], [$LIBS])]), 0, [ignore], [ignore])]) + # AT_JAVA_COMPILE(SOURCES) # ------------------------ # Compile SOURCES into Java class files. Skip the test if java or javac @@ -737,6 +783,7 @@ AT_SKIP_IF([[test -z "$CONF_JAVA"]]) AT_CHECK([[$SHELL ../../../javacomp.sh ]$1], [[0]], [ignore], [ignore])]) + # AT_LANG_COMPILE(OUTPUT, [SOURCES = OUTPUT.c] # -------------------------------------------- # Compile SOURCES into OUTPUT. Skip if compiler does not work. @@ -744,13 +791,11 @@ AT_CHECK([[$SHELL ../../../javacomp.sh ]$1], # If OUTPUT does not contain '.', assume that we are linking too, # otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT # with trailing .o removed, and ".c"/".cc" appended. -m4_define([AT_LANG_COMPILE], -[m4_case(AT_LANG, -[c], [AT_COMPILE([$1], [$2])], -[c++], [AT_COMPILE_CXX([$1], [$2])], -[java], [AT_JAVA_COMPILE([$1.java], [$2])], - [m4_fatal([unknown language: ]m4_defn([AT_LANG]))])[]dnl -]) +m4_define([AT_LANG_COMPILE], [AT_LANG_DISPATCH([$0], $@)]) +m4_define([AT_LANG_COMPILE(c)], [AT_COMPILE([$1], [$2])]) +m4_define([AT_LANG_COMPILE(c++)], [AT_COMPILE_CXX([$1], [$2])]) +m4_define([AT_LANG_COMPILE(java)], [AT_JAVA_COMPILE([$1.java], [$2])]) + # AT_FULL_COMPILE(OUTPUT, [OTHER1], [OTHER2]) # ------------------------------------------- @@ -759,30 +804,31 @@ m4_define([AT_LANG_COMPILE], # OUTPUT-OTHER.c, OUTPUT-OTHER.cc, or OUTPUT-OTHER.java to OUTPUT or # OUTPUT.java along with it. Relies on AT_SKEL_CC_IF and # AT_SKEL_JAVA_IF. -m4_define([AT_FULL_COMPILE], -[m4_case(AT_LANG, -[java], - [AT_BISON_CHECK([-o $1.java $1.y]) - AT_LANG_COMPILE([$1], - m4_join([ ], - [$1.java], - m4_ifval($2, [[$1-$2.java]]), - m4_ifval($3, [[$1-$3.java]])))], -[c++], - [AT_BISON_CHECK([-o $1.cc $1.y]) - AT_LANG_COMPILE([$1], - m4_join([ ], - [$1.cc], - m4_ifval($2, [[$1-$2.cc]]), - m4_ifval($3, [[$1-$3.cc]])))], -[c], - [AT_BISON_CHECK([-o $1.c $1.y]) - AT_LANG_COMPILE([$1], - m4_join([ ], - [$1.c], - m4_ifval($2, [[$1-$2.c]]), - m4_ifval($3, [[$1-$3.c]])))]) -]) +m4_define([AT_FULL_COMPILE], [AT_LANG_DISPATCH([$0], $@)]) +m4_define([AT_FULL_COMPILE(c)], +[AT_BISON_CHECK([-o $1.c $1.y]) + AT_LANG_COMPILE([$1], + m4_join([ ], + [$1.c], + m4_ifval($2, [[$1-$2.c]]), + m4_ifval($3, [[$1-$3.c]])))]) + +m4_define([AT_FULL_COMPILE(c++)], +[AT_BISON_CHECK([-o $1.cc $1.y]) + AT_LANG_COMPILE([$1], + m4_join([ ], + [$1.cc], + m4_ifval($2, [[$1-$2.cc]]), + m4_ifval($3, [[$1-$3.cc]])))]) + +m4_define([AT_FULL_COMPILE(java)], +[AT_BISON_CHECK([-o $1.java $1.y]) + AT_LANG_COMPILE([$1], + m4_join([ ], + [$1.java], + m4_ifval($2, [[$1-$2.java]]), + m4_ifval($3, [[$1-$3.java]])))]) + -- 2.45.2