X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/23d13411c85d3a8705f9507219f61eddea57a218..f6df83b4e80b2a53c08b5dc654e247076a3b9b03:/tests/c%20%20.at/bison.git/blobdiff_plain/23d13411c85d3a8705f9507219f61eddea57a218..f6df83b4e80b2a53c08b5dc654e247076a3b9b03:/tests/c++.at diff --git a/tests/c++.at b/tests/c++.at index 0d491709..a5d41a98 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -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 strings_type; %code // code for the .cc file { +#include // abort, getenv #include #include - 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 () = Value #else -# if defined ONE_STAGE_BUILD - yylval->build (stage); -# else - yylval->build() = 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() = 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.tokens.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 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