mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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.
This commit is contained in:
210
tests/local.at
210
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 <stdio.h>
|
||||
|
||||
## --- ##
|
||||
## 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 <stdio.h>
|
||||
]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 <stdlib.h> /* getenv. */
|
||||
#include <string.h> /* 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 <cstdlib> // getenv.
|
||||
#include <cstring> // 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]])))])
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user