]> git.saurik.com Git - bison.git/blobdiff - tests/c++.at
build: fix VPATH issue
[bison.git] / tests / c++.at
index d5e75962aad5e76e87d64164974bd18d0a618749..a5d41a98ed9f823c755ab2ef74a6575757beecbb 100644 (file)
@@ -22,19 +22,19 @@ AT_BANNER([[C++ Features.]])
 ## Variants.  ##
 ## ---------- ##
 
-# AT_CHECK_VARIANTS([DIRECTIVES])
-# -------------------------------
+# AT_TEST([DIRECTIVES])
+# ---------------------
 # Check the support of variants in C++, with the additional DIRECTIVES.
-m4_define([AT_CHECK_VARIANTS],
+m4_pushdef([AT_TEST],
 [AT_SETUP([Variants $1])
 
+AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1])
 # Store strings and integers in a list of strings.
 AT_DATA_GRAMMAR([list.yy],
 [[%debug
 %skeleton "lalr1.cc"
 %defines
-%define variant
-%locations
+%define api.value.type variant
 ]m4_bpatsubst([$1], [\\n], [
 ])[
 
@@ -47,16 +47,17 @@ typedef std::list<std::string> strings_type;
 
 %code // code for the .cc file
 {
+#include <cstdlib> // abort, getenv
 #include <iostream>
 #include <sstream>
 
-  static
-#if defined USE_LEX_SYMBOL
-  yy::parser::symbol_type yylex ();
-#else
-  yy::parser::token_type yylex (yy::parser::semantic_type* yylval,
-                                yy::parser::location_type* yylloc);
-#endif
+  namespace yy
+  {
+    static]AT_TOKEN_CTOR_IF([[
+    parser::symbol_type yylex ()]], [[
+    parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([,
+                              parser::location_type* yylloc])[)]])[;
+  }
 
   // Printing a list of strings (for %printer).
   // Koening look up will look into std, since that's an std::list.
@@ -118,68 +119,51 @@ item:
 ;
 %%
 
-#define STAGE_MAX 5
-static
-#if defined USE_LEX_SYMBOL
-yy::parser::symbol_type yylex ()
-#else
-yy::parser::token_type yylex (yy::parser::semantic_type* yylval,
-                              yy::parser::location_type* yylloc)
-#endif
-{
-#ifndef USE_LEX_SYMBOL
-  typedef yy::parser::token token;
-#endif
-  typedef yy::parser::location_type location_type;
-  static int stage = -1;
-  ++stage;
-  if (stage == STAGE_MAX)
-    {
-#if defined USE_LEX_SYMBOL
-      return yy::parser::make_END_OF_FILE (location_type ());
-#else
-      *yylloc = location_type ();
-      return token::END_OF_FILE;
-#endif
-    }
-  else if (stage % 2)
-    {
-#if defined USE_LEX_SYMBOL
-      return yy::parser::make_NUMBER (stage, location_type ());
+#ifdef TWO_STAGE_BUILD
+# define BUILD(Type, Value) build<Type> () = Value
 #else
-# if defined ONE_STAGE_BUILD
-      yylval->build (stage);
-# else
-      yylval->build<int>() = stage;
-# endif
-      *yylloc = location_type ();
-      return token::NUMBER;
+# define BUILD(Type, Value) build (Value)
 #endif
-    }
-  else
-    {
-#if defined USE_LEX_SYMBOL
-      return yy::parser::make_TEXT (string_cast (stage), location_type ());
-#else
-# if defined ONE_STAGE_BUILD
-      yylval->build (string_cast (stage));
-# else
-      yylval->build<std::string>() = string_cast (stage);
-# endif
-      *yylloc = location_type ();
-      return token::TEXT;
-#endif
-    }
-  abort ();
-}
 
-void
-yy::parser::error (const yy::parser::location_type&,
-                   const std::string& message)
+#define STAGE_MAX 5
+namespace yy
 {
-  std::cerr << message << std::endl;
+  static]AT_TOKEN_CTOR_IF([[
+  parser::symbol_type yylex ()]], [[
+  parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([,
+                            parser::location_type* yylloc])[)]])[
+  {]AT_LOCATION_IF([
+    typedef parser::location_type location;])[
+    static int stage = -1;
+    ++stage;
+    if (stage == STAGE_MAX)
+      {]AT_TOKEN_CTOR_IF([[
+        return parser::make_END_OF_FILE (]AT_LOCATION_IF([location ()])[);]],
+[AT_LOCATION_IF([
+        *yylloc = location ();])[
+        return parser::token::END_OF_FILE;]])[
+      }
+    else if (stage % 2)
+      {]AT_TOKEN_CTOR_IF([[
+        return parser::make_NUMBER (stage]AT_LOCATION_IF([, location ()])[);]],
+[[
+        yylval->BUILD (int, stage);]AT_LOCATION_IF([
+        *yylloc = location ();])[
+        return parser::token::NUMBER;]])[
+      }
+    else
+      {]AT_TOKEN_CTOR_IF([[
+        return parser::make_TEXT (string_cast (stage)]AT_LOCATION_IF([, location ()])[);]], [[
+        yylval->BUILD (std::string, string_cast (stage));]AT_LOCATION_IF([
+        *yylloc = location ();])[
+        return parser::token::TEXT;]])[
+      }
+    abort ();
+  }
 }
 
+]AT_YYERROR_DEFINE[
+
 int
 main ()
 {
@@ -190,19 +174,24 @@ main ()
 ]])
 
 AT_BISON_CHECK([-o list.cc list.yy])
-AT_COMPILE_CXX([list])
-AT_CHECK([./list], 0,
-         [(0, 1, 2, 4)
+AT_COMPILE_CXX([list], [$NO_STRICT_ALIAS_CXXFLAGS list.cc])
+AT_PARSER_CHECK([./list], 0,
+[(0, 1, 2, 4)
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
 ])
 
-AT_CHECK_VARIANTS([])
-AT_CHECK_VARIANTS([%define parse.assert])
-AT_CHECK_VARIANTS([[%define parse.assert %code {\n#define ONE_STAGE_BUILD\n}]])
-AT_CHECK_VARIANTS([[%define parse.assert %define lex_symbol %code {\n#define USE_LEX_SYMBOL\n}]])
-AT_CHECK_VARIANTS([[%define parse.assert %define lex_symbol %code {\n#define USE_LEX_SYMBOL\n} %define api.token.prefix "TOK_"]])
+AT_TEST([])
+AT_TEST([%define parse.assert])
+AT_TEST([%locations %define parse.assert])
+AT_TEST([[%define parse.assert %code {\n#define TWO_STAGE_BUILD\n}]])
+AT_TEST([[%define parse.assert %define api.token.constructor]])
+AT_TEST([[%define parse.assert %define api.token.constructor %define api.token.prefix "TOK_"]])
+AT_TEST([[%locations %define parse.assert %define api.token.constructor %define api.token.prefix "TOK_"]])
+
+m4_popdef([AT_TEST])
 
 
 ## ----------------------- ##
@@ -467,7 +456,7 @@ AT_DATA_GRAMMAR([[input.yy]],
 }
 
 %defines
-%define variant
+%define api.value.type variant
 %define parse.error verbose
 %define parse.trace
 %%
@@ -698,7 +687,7 @@ main (int argc, const char *argv[])
       input = argv[1];
       break;
     case 3:
-      assert (!strcmp (argv[1], "--debug"));
+      assert (std::string(argv[1]) == "--debug");
       debug = 1;
       input = argv[2];
       break;
@@ -745,7 +734,7 @@ AT_PARSER_CHECK([[./input i]], [[2]], [[]],
 AT_PARSER_CHECK([[./input aaaap]])
 
 AT_PARSER_CHECK([[./input --debug aaaap]], [[2]], [[]], [[stderr]])
-AT_PARSER_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore])
+AT_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore])
 
 AT_PARSER_CHECK([[./input aaaae]], [[2]], [[]],
 [[exception caught: syntax error
@@ -763,3 +752,46 @@ AT_PARSER_CHECK([[./input aaaaR]], [[0]])
 AT_BISON_OPTION_POPDEFS
 
 AT_CLEANUP
+
+## ------------------------------------ ##
+## C++ GLR parser identifier shadowing  ##
+## ------------------------------------ ##
+
+AT_SETUP([[C++ GLR parser identifier shadowing]])
+
+AT_DATA_GRAMMAR([input.yy], [
+%skeleton "glr.cc"
+
+%union
+{
+  int ival;
+}
+
+%token <ival> ZERO;
+
+%code
+{
+  int yylex (yy::parser::semantic_type *yylval);
+}
+
+%%
+exp: ZERO
+
+%%
+
+int yylex (yy::parser::semantic_type *yylval)
+{
+  return yy::parser::token::ZERO;
+}
+
+void yy::parser::error (std::string const& msg)
+{}
+
+int main()
+{}
+])
+
+AT_BISON_CHECK([[-o input.cc input.yy]])
+AT_COMPILE_CXX([[input]])
+
+AT_CLEANUP