1 /* Test file for C++ parsers using variants.
 
   2    Based on an example by Michiel De Wilde <mdewilde.agilent@gmail.com>. */
 
   4 %skeleton "lalr1-fusion.cc"
 
  12 typedef std::list<std::string> strings_type;
 
  22   // Prototype of the yylex function providing subsequent tokens.
 
  23   static yy::parser::token_type yylex(yy::parser::semantic_type* yylval);
 
  25   // Printing a list of strings.
 
  26   // Koening look up will look into std, since that's an std::list.
 
  30     operator<<(std::ostream& o, const strings_type& s)
 
  32       std::copy(s.begin(), s.end(),
 
  33                 std::ostream_iterator<strings_type::value_type>(o, "\n"));
 
  38   // Conversion to string.
 
  42     string_cast (const T& t)
 
  50 %token <std::string> TEXT;
 
  52 %printer { debug_stream () << $$; } <int> <std::string> <strings_type>;
 
  55 %type <std::string> item;
 
  56 %type <strings_type> list;
 
  61   list  { std::cout << $1 << std::endl; }
 
  65   /* nothing */ { /* Generates an empty string list */ }
 
  66 | list item     { std::swap ($$, $1); $$.push_back ($2); }
 
  70   TEXT          { std::swap ($$, $1); }
 
  71 | NUMBER        { $$ = string_cast ($1); }
 
  75 // The yylex function providing subsequent tokens:
 
  76 // TEXT         "I have three numbers for you:"
 
  80 // TEXT         " and that's all!"
 
  84 yy::parser::token_type
 
  85 yylex (yy::parser::semantic_type* yylval)
 
  88   yy::parser::token_type result;
 
  93       yylval->build<std::string> () =
 
  94         std::string ("I have three numbers for you.");
 
  95       result = yy::parser::token::TEXT;
 
 100       yylval->build<int> () = stage;
 
 101       result = yy::parser::token::NUMBER;
 
 104       yylval->build<std::string> () = std::string ("And that's all!");
 
 105       result = yy::parser::token::TEXT;
 
 108       result = yy::parser::token::END_OF_FILE;
 
 116 // Mandatory error function
 
 118 yy::parser::error (const yy::parser::location_type& yylloc,
 
 119                    const std::string& message)
 
 121   std::cerr << yylloc << ": " << message << std::endl;
 
 125 main (int argc, char *argv[])
 
 128   p.set_debug_level (!!getenv ("YYDEBUG"));