X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f6038cb8c35c6b1a827fd3f6356d8cc9a002abe0..28126202a52cda40411bc33ed795ceb4cfdd302d:/examples/variant.yy diff --git a/examples/variant.yy b/examples/variant.yy index cba6d08c..39a57ba8 100644 --- a/examples/variant.yy +++ b/examples/variant.yy @@ -1,9 +1,27 @@ -/* Test file for C++ parsers using variants. - Based on an example by Michiel De Wilde . */ +/* + Copyright (C) 2008-2012 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + %debug -%skeleton "lalr1-fusion.cc" +%skeleton "lalr1.cc" %defines +%define parse.assert %define variant +%define lex_symbol +%locations %code requires // *.hh { @@ -20,17 +38,17 @@ typedef std::list strings_type; #include // 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. // Koening look up will look into std, since that's an std::list. namespace std { 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::ostream_iterator(o, "\n")); + std::copy (s.begin (), s.end (), + std::ostream_iterator (o, "\n")); return o; } } @@ -43,22 +61,23 @@ typedef std::list strings_type; { std::ostringstream o; o << t; - return o.str(); + return o.str (); } } -%token TEXT; +%token <::std::string> TEXT; %token NUMBER; -%printer { debug_stream () << $$; } ; +%printer { debug_stream () << $$; } + <::std::string> <::std::list>; %token END_OF_FILE 0; -%type item; -%type list; +%type <::std::string> item; +%type <::std::list> list; %% result: - list { std::cout << $1 << std::endl; } + list { std::cout << $1 << std::endl; } ; list: @@ -81,52 +100,40 @@ item: // END_OF_FILE static -yy::parser::token_type -yylex (yy::parser::semantic_type* yylval) +yy::parser::symbol_type +yylex () { - static int stage = 0; - yy::parser::token_type result; - + static int stage = -1; + ++stage; + yy::parser::location_type loc(0, stage + 1, stage + 1); switch (stage) { case 0: - yylval->build () = - std::string ("I have three numbers for you."); - result = yy::parser::token::TEXT; - break; + return yy::parser::make_TEXT ("I have three numbers for you.", loc); case 1: case 2: case 3: - yylval->build () = stage; - result = yy::parser::token::NUMBER; - break; + return yy::parser::make_NUMBER (stage, loc); case 4: - yylval->build () = std::string ("And that's all!"); - result = yy::parser::token::TEXT; - break; + return yy::parser::make_TEXT ("And that's all!", loc); default: - result = yy::parser::token::END_OF_FILE; - break; + return yy::parser::make_END_OF_FILE (loc); } - - stage++; - return result; } // Mandatory error function void -yy::parser::error (const yy::parser::location_type& yylloc, - const std::string& message) +yy::parser::error (const yy::parser::location_type& loc, const std::string& msg) { - std::cerr << yylloc << ": " << message << std::endl; + std::cerr << loc << ": " << msg << std::endl; } int -main (int argc, char *argv[]) +main () { yy::parser p; p.set_debug_level (!!getenv ("YYDEBUG")); - p.parse (); + return p.parse (); } // Local Variables: