summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim@betelgeuse.gostai.ensta.fr>2008-10-10 16:58:22 +0200
committerAkim Demaille <demaille@gostai.com>2008-11-15 14:23:27 +0100
commitdddec5378812c1327b3175edee8351e31f92aa94 (patch)
tree38342eed727d39eb4f9ee63448ba4aabcacfff3f
parent7d3e21ba7b8e7cb4f2b74117fd61ec7238540eb7 (diff)
downloadbison-dddec5378812c1327b3175edee8351e31f92aa94.tar.gz
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".
-rw-r--r--ChangeLog7
-rw-r--r--tests/c++.at88
2 files changed, 63 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index 91b3e16d..8eb0ccde 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2008-11-15 Akim Demaille <akim@betelgeuse.gostai.ensta.fr>
+ 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 <akim@betelgeuse.gostai.ensta.fr>
+
Formatting change.
2008-11-15 Akim Demaille <akim@betelgeuse.gostai.ensta.fr>
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<std::string> strings_type;
#include <iterator>
#include <sstream>
- // 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<std::string>() = 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<int>() = 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<std::string>() = 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}]])
## ----------------------- ##