mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-21 02:03:03 +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. ##
|
## 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
|
# AT_DATA_SOURCE_PROLOGUE
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# The prologue that should be included in any source code that is
|
# The prologue that should be included in any source code that is
|
||||||
@@ -406,24 +425,33 @@ static
|
|||||||
# AT_YYERROR_DEFINE
|
# AT_YYERROR_DEFINE
|
||||||
# -------------------------
|
# -------------------------
|
||||||
# Must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS pair.
|
# Must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS pair.
|
||||||
m4_define([AT_YYERROR_FORMALS],
|
m4_define([AT_YYERROR_FORMALS], [AT_LANG_DISPATCH([$0], $@)])
|
||||||
[m4_case(AT_LANG,
|
m4_define([AT_YYERROR_PROTOTYPE],[AT_LANG_DISPATCH([$0], $@)])
|
||||||
[c], [AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE const * const llocp, ])AT_PARSE_PARAMS [const char *msg]])[]dnl
|
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],
|
# AT_MAIN_DEFINE
|
||||||
[m4_case(AT_LANG,
|
# --------------
|
||||||
[c], [[void ]AT_NAME_PREFIX[error (]AT_YYERROR_FORMALS[)]])[]dnl
|
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([[
|
]AT_LOCATION_IF([[
|
||||||
#if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
|
#if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
|
||||||
static unsigned location_print (FILE *yyo, ]AT_YYLTYPE[ const * const yylocp);
|
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
|
||||||
#endif
|
#endif
|
||||||
]])[
|
]])[
|
||||||
static AT_YYERROR_DECLARE_EXTERN])[]dnl
|
static AT_YYERROR_DECLARE_EXTERN])
|
||||||
])
|
|
||||||
|
|
||||||
m4_define([AT_YYERROR_DEFINE],
|
|
||||||
[m4_case(AT_LANG,
|
m4_define([AT_YYERROR_DEFINE(c)],
|
||||||
[c], [[
|
[[
|
||||||
]AT_LOCATION_IF([[
|
]AT_LOCATION_IF([[
|
||||||
# if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
|
# if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
|
||||||
/* Print *YYLOCP on YYO. */
|
/* Print *YYLOCP on YYO. */
|
||||||
@@ -478,34 +505,10 @@ AT_YYERROR_SEES_LOC_IF([[
|
|||||||
LOCATION_PRINT (stderr, ]AT_LOC[);
|
LOCATION_PRINT (stderr, ]AT_LOC[);
|
||||||
fprintf (stderr, ": ");]])[
|
fprintf (stderr, ": ");]])[
|
||||||
fprintf (stderr, "%s\n", msg);
|
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(c)],
|
||||||
# --------------
|
|
||||||
m4_define([AT_MAIN_DEFINE],
|
|
||||||
[m4_case(AT_LANG,
|
|
||||||
[c],
|
|
||||||
[[#include <stdlib.h> /* getenv. */
|
[[#include <stdlib.h> /* getenv. */
|
||||||
#include <string.h> /* strcmp. */
|
#include <string.h> /* strcmp. */
|
||||||
int
|
int
|
||||||
@@ -518,8 +521,27 @@ main (int argc, char const* argv[])
|
|||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;]])[
|
(void) argv;]])[
|
||||||
return ]AT_NAME_PREFIX[parse ();
|
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 <cstdlib> // getenv.
|
||||||
#include <cstring> // strcmp.
|
#include <cstring> // strcmp.
|
||||||
int
|
int
|
||||||
@@ -533,8 +555,30 @@ main (int argc, char const* argv[])
|
|||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;]])[
|
(void) argv;]])[
|
||||||
return p.parse ();
|
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
|
[[class input
|
||||||
{
|
{
|
||||||
public static void main (String args[]) throws IOException
|
public static void main (String args[]) throws IOException
|
||||||
@@ -542,7 +586,8 @@ main (int argc, char const* argv[])
|
|||||||
YYParser p = new YYParser ();
|
YYParser p = new YYParser ();
|
||||||
p.parse ();
|
p.parse ();
|
||||||
}
|
}
|
||||||
}]])])
|
}]])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## --------------- ##
|
## --------------- ##
|
||||||
@@ -726,6 +771,7 @@ AT_CHECK(m4_join([ ],
|
|||||||
[m4_bmatch([$1], [[.]], [], [$LIBS])]),
|
[m4_bmatch([$1], [[.]], [], [$LIBS])]),
|
||||||
0, [ignore], [ignore])])
|
0, [ignore], [ignore])])
|
||||||
|
|
||||||
|
|
||||||
# AT_JAVA_COMPILE(SOURCES)
|
# AT_JAVA_COMPILE(SOURCES)
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# Compile SOURCES into Java class files. Skip the test if java or javac
|
# 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],
|
AT_CHECK([[$SHELL ../../../javacomp.sh ]$1],
|
||||||
[[0]], [ignore], [ignore])])
|
[[0]], [ignore], [ignore])])
|
||||||
|
|
||||||
|
|
||||||
# AT_LANG_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]
|
# AT_LANG_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
# Compile SOURCES into OUTPUT. Skip if compiler does not work.
|
# 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,
|
# If OUTPUT does not contain '.', assume that we are linking too,
|
||||||
# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
|
# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
|
||||||
# with trailing .o removed, and ".c"/".cc" appended.
|
# with trailing .o removed, and ".c"/".cc" appended.
|
||||||
m4_define([AT_LANG_COMPILE],
|
m4_define([AT_LANG_COMPILE], [AT_LANG_DISPATCH([$0], $@)])
|
||||||
[m4_case(AT_LANG,
|
m4_define([AT_LANG_COMPILE(c)], [AT_COMPILE([$1], [$2])])
|
||||||
[c], [AT_COMPILE([$1], [$2])],
|
m4_define([AT_LANG_COMPILE(c++)], [AT_COMPILE_CXX([$1], [$2])])
|
||||||
[c++], [AT_COMPILE_CXX([$1], [$2])],
|
m4_define([AT_LANG_COMPILE(java)], [AT_JAVA_COMPILE([$1.java], [$2])])
|
||||||
[java], [AT_JAVA_COMPILE([$1.java], [$2])],
|
|
||||||
[m4_fatal([unknown language: ]m4_defn([AT_LANG]))])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
# AT_FULL_COMPILE(OUTPUT, [OTHER1], [OTHER2])
|
# 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-OTHER.c, OUTPUT-OTHER.cc, or OUTPUT-OTHER.java to OUTPUT or
|
||||||
# OUTPUT.java along with it. Relies on AT_SKEL_CC_IF and
|
# OUTPUT.java along with it. Relies on AT_SKEL_CC_IF and
|
||||||
# AT_SKEL_JAVA_IF.
|
# AT_SKEL_JAVA_IF.
|
||||||
m4_define([AT_FULL_COMPILE],
|
m4_define([AT_FULL_COMPILE], [AT_LANG_DISPATCH([$0], $@)])
|
||||||
[m4_case(AT_LANG,
|
m4_define([AT_FULL_COMPILE(c)],
|
||||||
[java],
|
[AT_BISON_CHECK([-o $1.c $1.y])
|
||||||
[AT_BISON_CHECK([-o $1.java $1.y])
|
AT_LANG_COMPILE([$1],
|
||||||
AT_LANG_COMPILE([$1],
|
m4_join([ ],
|
||||||
m4_join([ ],
|
[$1.c],
|
||||||
[$1.java],
|
m4_ifval($2, [[$1-$2.c]]),
|
||||||
m4_ifval($2, [[$1-$2.java]]),
|
m4_ifval($3, [[$1-$3.c]])))])
|
||||||
m4_ifval($3, [[$1-$3.java]])))],
|
|
||||||
[c++],
|
m4_define([AT_FULL_COMPILE(c++)],
|
||||||
[AT_BISON_CHECK([-o $1.cc $1.y])
|
[AT_BISON_CHECK([-o $1.cc $1.y])
|
||||||
AT_LANG_COMPILE([$1],
|
AT_LANG_COMPILE([$1],
|
||||||
m4_join([ ],
|
m4_join([ ],
|
||||||
[$1.cc],
|
[$1.cc],
|
||||||
m4_ifval($2, [[$1-$2.cc]]),
|
m4_ifval($2, [[$1-$2.cc]]),
|
||||||
m4_ifval($3, [[$1-$3.cc]])))],
|
m4_ifval($3, [[$1-$3.cc]])))])
|
||||||
[c],
|
|
||||||
[AT_BISON_CHECK([-o $1.c $1.y])
|
m4_define([AT_FULL_COMPILE(java)],
|
||||||
AT_LANG_COMPILE([$1],
|
[AT_BISON_CHECK([-o $1.java $1.y])
|
||||||
m4_join([ ],
|
AT_LANG_COMPILE([$1],
|
||||||
[$1.c],
|
m4_join([ ],
|
||||||
m4_ifval($2, [[$1-$2.c]]),
|
[$1.java],
|
||||||
m4_ifval($3, [[$1-$3.c]])))])
|
m4_ifval($2, [[$1-$2.java]]),
|
||||||
])
|
m4_ifval($3, [[$1-$3.java]])))])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user