]> git.saurik.com Git - bison.git/blobdiff - tests/local.at
tests: handle locations in the generic yyerror functions.
[bison.git] / tests / local.at
index 6d3ff18f9568b6091af13f4dc529d7d410a88b2b..b945968ece281be6baae30e565463e07698471fe 100644 (file)
@@ -17,7 +17,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# We want a recent Autotest.
 m4_version_prereq([2.58])
 
 
@@ -108,6 +107,10 @@ m4_pushdef([AT_SKEL_CC_IF],
 [m4_bmatch([$3], [%language "[Cc]\+\+"\|%skeleton "[a-z0-9]+\.cc"], [$1], [$2])])
 m4_pushdef([AT_SKEL_JAVA_IF],
 [m4_bmatch([$3], [%language "[Jj][Aa][Vv][Aa]"\|%skeleton "[a-z0-9]+\.java"], [$1], [$2])])
+m4_pushdef([AT_LANG],
+[AT_SKEL_JAVA_IF([java],
+                 [AT_SKEL_CC_IF([c++],
+                                [c])])])
 m4_pushdef([AT_GLR_IF],
 [m4_bmatch([$3], [%glr-parser\|%skeleton "glr\..*"], [$1], [$2])])
 m4_pushdef([AT_LALR1_CC_IF],
@@ -217,6 +220,7 @@ m4_popdef([AT_LEXPARAM_IF])
 m4_popdef([AT_YACC_IF])
 m4_popdef([AT_GLR_IF])
 m4_popdef([AT_SKEL_CC_IF])
+m4_popdef([AT_LANG])
 m4_popdef([AT_SKEL_JAVA_IF])
 m4_popdef([AT_GLR_CC_IF])
 m4_popdef([AT_LALR1_CC_IF])
@@ -309,28 +313,46 @@ static int
 # Beware that must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS
 # pair.
 m4_define([AT_YYERROR_DECLARE_EXTERN],
-[void AT_API_PREFIX[]error (const char *msg);dnl
+[m4_case(AT_LANG,
+[c], [void AT_API_PREFIX[]error (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])[const char *msg);])[]dnl
 ])
 
 m4_define([AT_YYERROR_DECLARE],
-[static AT_YYERROR_DECLARE_EXTERN[]dnl
+[m4_case(AT_LANG,
+[c], [static AT_YYERROR_DECLARE_EXTERN])[]dnl
 ])
 
 m4_define([AT_YYERROR_DEFINE],
-[AT_SKEL_JAVA_IF([[public void yyerror (String msg)
-{
-  System.err.println (msg);
-}]], [AT_SKEL_CC_IF([[void
-yy::parser::error (const yy::location &, std::string const &msg)
-{
-  std::cerr << msg << std::endl;
-}]], [[#include <stdio.h>
+[m4_case(AT_LANG,
+[c], [[#include <stdio.h>
+/* A C error reporting function.  */
 static void
-]AT_API_PREFIX[error (char const *msg)
+yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])[const char *msg)
 {
+]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", msg);
-}]])])dnl
-])
+}]],
+[c++], [[/* A C++ error reporting function.  */
+void
+]AT_NAME_PREFIX[::parser::error (const location_type& l, const std::string& m)
+{
+  (void) l;
+  std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << std::endl;
+}]],
+[java], [[public void yyerror (String msg)
+{
+  System.err.println (msg);
+}]])])
+
 
 ## --------------- ##
 ## Running Bison.  ##
@@ -514,11 +536,20 @@ AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1
 # is not installed.
 m4_define([AT_JAVA_COMPILE],
 [AT_KEYWORDS(java)
-AT_CHECK([[test -n "$CONF_JAVA" || exit 77
-           test -n "$CONF_JAVAC" || exit 77]])
+AT_SKIP_IF([[test -z "$CONF_JAVA$CONF_JAVAC"]])
 AT_CHECK([[$SHELL ../../../javacomp.sh ]$1],
          [[0]], [ignore], [ignore])])
 
+# AT_LANG_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]
+# --------------------------------------------
+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
+])
+
 # AT_FULL_COMPILE(OUTPUT, [OTHER1], [OTHER2])
 # -------------------------------------------
 # Compile OUTPUT.y to OUTPUT.c, OUTPUT.cc, or OUTPUT.java, and then
@@ -526,31 +557,29 @@ AT_CHECK([[$SHELL ../../../javacomp.sh ]$1],
 # 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], [
-  AT_SKEL_JAVA_IF([
-    AT_BISON_CHECK([-o $1.java $1.y])
-    AT_JAVA_COMPILE([$1.java],
-                    m4_join([ ],
-                            [$1.java],
-                            m4_ifval($2, [[$1-$2.java]]),
-                            m4_ifval($3, [[$1-$3.java]])))
-  ], [
-    AT_SKEL_CC_IF([
-      AT_BISON_CHECK([-o $1.cc $1.y])
-      AT_COMPILE_CXX([$1],
-                     m4_join([ ],
-                             [$1.cc],
-                             m4_ifval($2, [[$1-$2.cc]]),
-                             m4_ifval($3, [[$1-$3.cc]])))
-    ], [
-      AT_BISON_CHECK([-o $1.c $1.y])
-      AT_COMPILE([$1],
-                  m4_join([ ],
-                         [$1.c],
-                          m4_ifval($2, [[$1-$2.c]]),
-                          m4_ifval($3, [[$1-$3.c]])))
-    ])
-  ])
+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]])))])
 ])