X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/5de9c593019d717db3073a37e2acf6a30e7f352d..a339aef48a90a4d8e3b477cfcc2a07f1d5072424:/examples/variant.yy diff --git a/examples/variant.yy b/examples/variant.yy index d560e7dd..fd551cc1 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-2013 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.cc" +%language "c++" %defines -%define variant +%define api.token.constructor +%define api.value.type variant +%define parse.assert +%locations %code requires // *.hh { @@ -20,18 +38,27 @@ 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); + namespace yy + { + static 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& ss) { - std::copy(s.begin(), s.end(), - std::ostream_iterator(o, "\n")); - return o; + o << "(" << &ss << ") {"; + const char *sep = ""; + for (strings_type::const_iterator i = ss.begin(), end = ss.end(); + i != end; ++i) + { + o << sep << *i; + sep = ", "; + } + return o << "}"; } } @@ -43,22 +70,22 @@ 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 { yyoutput << $$; } <*>; %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: @@ -72,61 +99,52 @@ item: ; %% -// The yylex function providing subsequent tokens: -// TEXT "I have three numbers for you:" -// NUMBER 1 -// NUMBER 2 -// NUMBER 3 -// TEXT " and that's all!" -// END_OF_FILE - -static -yy::parser::token_type -yylex (yy::parser::semantic_type* yylval) +namespace yy { - static int stage = 0; - yy::parser::token_type result; - - switch (stage) + // The yylex function providing subsequent tokens: + // TEXT "I have three numbers for you." + // NUMBER 1 + // NUMBER 2 + // NUMBER 3 + // TEXT "And that's all!" + // END_OF_FILE + + static + parser::symbol_type + yylex () { - case 0: - yylval->build () = - std::string ("I have three numbers for you."); - result = yy::parser::token::TEXT; - break; - case 1: - case 2: - case 3: - yylval->build () = stage; - result = yy::parser::token::NUMBER; - break; - case 4: - yylval->build () = std::string ("And that's all!"); - result = yy::parser::token::TEXT; - break; - default: - result = yy::parser::token::END_OF_FILE; - break; + static int stage = -1; + ++stage; + parser::location_type loc(0, stage + 1, stage + 1); + switch (stage) + { + case 0: + return parser::make_TEXT ("I have three numbers for you.", loc); + case 1: + case 2: + case 3: + return parser::make_NUMBER (stage, loc); + case 4: + return parser::make_TEXT ("And that's all!", loc); + default: + return 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) -{ - std::cerr << yylloc << ": " << message << std::endl; + // Mandatory error function + void + parser::error (const parser::location_type& loc, const std::string& msg) + { + 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: