Update variant.yy to newest interface.

* examples/variant.yy: Define lex_symbol.
	Adjust.
This commit is contained in:
Akim Demaille
2008-10-22 06:27:42 -05:00
parent ff084799a3
commit 0078681b6b
2 changed files with 23 additions and 30 deletions

View File

@@ -1,3 +1,9 @@
2008-11-15 Akim Demaille <demaille@gostai.com>
Update variant.yy to newest interface.
* examples/variant.yy: Define lex_symbol.
Adjust.
2008-11-15 Akim Demaille <demaille@gostai.com> 2008-11-15 Akim Demaille <demaille@gostai.com>
Don't use locations in variant.yy. Don't use locations in variant.yy.

View File

@@ -1,9 +1,8 @@
/* Test file for C++ parsers using variants.
Based on an example by Michiel De Wilde <mdewilde.agilent@gmail.com>. */
%debug %debug
%skeleton "lalr1.cc" %skeleton "lalr1.cc"
%defines %defines
%define variant %define variant
%define lex_symbol
%code requires // *.hh %code requires // *.hh
{ {
@@ -20,17 +19,17 @@ typedef std::list<std::string> strings_type;
#include <sstream> #include <sstream>
// Prototype of the yylex function providing subsequent tokens. // Prototype of the yylex function providing subsequent tokens.
static yy::parser::token_type yylex(yy::parser::semantic_type* yylval); static yy::parser::symbol_type yylex ();
// Printing a list of strings. // Printing a list of strings.
// Koening look up will look into std, since that's an std::list. // Koening look up will look into std, since that's an std::list.
namespace std namespace std
{ {
std::ostream& std::ostream&
operator<<(std::ostream& o, const strings_type& s) operator<< (std::ostream& o, const strings_type& s)
{ {
std::copy(s.begin(), s.end(), std::copy (s.begin (), s.end (),
std::ostream_iterator<strings_type::value_type>(o, "\n")); std::ostream_iterator<strings_type::value_type> (o, "\n"));
return o; return o;
} }
} }
@@ -43,7 +42,7 @@ typedef std::list<std::string> strings_type;
{ {
std::ostringstream o; std::ostringstream o;
o << t; o << t;
return o.str(); return o.str ();
} }
} }
@@ -58,7 +57,7 @@ typedef std::list<std::string> strings_type;
%% %%
result: result:
list { std::cout << $1 << std::endl; } list { std::cout << $1 << std::endl; }
; ;
list: list:
@@ -81,35 +80,23 @@ item:
// END_OF_FILE // END_OF_FILE
static static
yy::parser::token_type yy::parser::symbol_type
yylex (yy::parser::semantic_type* yylval) yylex ()
{ {
static int stage = 0; static int stage = -1;
yy::parser::token_type result; switch (++stage)
switch (stage)
{ {
case 0: case 0:
yylval->build (std::string ("I have three numbers for you.")); return yy::parser::make_TEXT ("I have three numbers for you.");
result = yy::parser::token::TEXT;
break;
case 1: case 1:
case 2: case 2:
case 3: case 3:
yylval->build (stage); return yy::parser::make_NUMBER (stage);
result = yy::parser::token::NUMBER;
break;
case 4: case 4:
yylval->build (std::string ("And that's all!")); return yy::parser::make_TEXT ("And that's all!");
result = yy::parser::token::TEXT;
break;
default: default:
result = yy::parser::token::END_OF_FILE; return yy::parser::make_END_OF_FILE ();
break;
} }
stage++;
return result;
} }
// Mandatory error function // Mandatory error function
@@ -120,11 +107,11 @@ yy::parser::error (const std::string& message)
} }
int int
main (int argc, char *argv[]) main ()
{ {
yy::parser p; yy::parser p;
p.set_debug_level (!!getenv ("YYDEBUG")); p.set_debug_level (!!getenv ("YYDEBUG"));
return p.parse(); return p.parse ();
} }
// Local Variables: // Local Variables: