From: Akim Demaille Date: Fri, 10 Oct 2008 14:58:22 +0000 (+0200) Subject: Test the make_TOKEN interface. X-Git-Tag: v2.7.90~1027 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/dddec5378812c1327b3175edee8351e31f92aa94?ds=inline Test the make_TOKEN interface. * tests/c++.at (AT_CHECK_VARIANTS): Require and use locations. Factor the common code in yylex. Use it to test "%define lex_symbol". --- diff --git a/ChangeLog b/ChangeLog index 91b3e16d..8eb0ccde 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-11-15 Akim Demaille + + Test the make_TOKEN interface. + * tests/c++.at (AT_CHECK_VARIANTS): Require and use locations. + Factor the common code in yylex. + Use it to test "%define lex_symbol". + 2008-11-15 Akim Demaille Formatting change. diff --git a/tests/c++.at b/tests/c++.at index f00e1096..f0abad62 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -33,6 +33,7 @@ AT_DATA([list.yy], %skeleton "lalr1.cc" %defines %define variant +%locations ]m4_bpatsubst([$1], [\\n], [ ])[ @@ -50,10 +51,15 @@ typedef std::list strings_type; #include #include - // Prototype of the yylex function providing subsequent tokens. - static yy::parser::token_type yylex(yy::parser::semantic_type* yylval); + 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 - // Printing a list of strings. + // Printing a list of strings (for %printer). // Koening look up will look into std, since that's an std::list. namespace std { @@ -103,45 +109,62 @@ item: ; %% +#define STAGE_MAX 5 static -yy::parser::token_type -yylex(yy::parser::semantic_type* yylval) +#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 { - static int stage = 0; - yy::parser::token_type result; - - switch (stage) - { - case 0: - case 4: -#ifdef ONE_STAGE_BUILD - yylval->build(string_cast(stage)); + typedef yy::parser::token token; + 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 - yylval->build() = string_cast(stage); + *yylloc = location_type (); + return token::END_OF_FILE; #endif - result = yy::parser::token::TEXT; - break; - case 1: - case 2: - case 3: -#ifdef ONE_STAGE_BUILD - yylval->build(stage); + } + else if (stage % 2) + { +#if defined USE_LEX_SYMBOL + return yy::parser::make_NUMBER (stage, location_type ()); #else +# if defined ONE_STAGE_BUILD + yylval->build(stage); +# else yylval->build() = stage; +# endif + *yylloc = location_type (); + return token::NUMBER; #endif - result = yy::parser::token::NUMBER; - break; - default: - result = yy::parser::token::END_OF_FILE; - break; - } - - ++stage; - return result; + } + 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 std::string& message) +yy::parser::error(const yy::parser::location_type&, + const std::string& message) { std::cerr << message << std::endl; } @@ -171,6 +194,7 @@ AT_CLEANUP AT_CHECK_VARIANTS([]) AT_CHECK_VARIANTS([%define assert]) AT_CHECK_VARIANTS([[%define assert %code {\n#define ONE_STAGE_BUILD\n}]]) +AT_CHECK_VARIANTS([[%define assert %define lex_symbol %code {\n#define USE_LEX_SYMBOL\n}]]) ## ----------------------- ##