]> git.saurik.com Git - bison.git/blobdiff - examples/variant.yy
style: scope reduction in lalr.cc
[bison.git] / examples / variant.yy
index d560e7dd63bb59cb92751a27cbd011b652a3b729..fd551cc19ab299a9c5160f7e00f691f941fecdba 100644 (file)
@@ -1,9 +1,27 @@
-/* Test file for C++ parsers using variants.
-   Based on an example by Michiel De Wilde <mdewilde.agilent@gmail.com>. */
+/*
+  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 <http://www.gnu.org/licenses/>.
+*/
+
 %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<std::string> strings_type;
 #include <sstream>
 
   // 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<strings_type::value_type>(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<std::string> strings_type;
   {
     std::ostringstream o;
     o << t;
-    return o.str();
+    return o.str ();
   }
 }
 
-%token <std::string> TEXT;
+%token <::std::string> TEXT;
 %token <int> NUMBER;
-%printer { debug_stream () << $$; } <int> <std::string> <strings_type>;
+%printer { yyoutput << $$; } <*>;
 %token END_OF_FILE 0;
 
-%type <std::string> item;
-%type <strings_type> list;
+%type <::std::string> item;
+%type <::std::list<std::string>> 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> () =
-        std::string ("I have three numbers for you.");
-      result = yy::parser::token::TEXT;
-      break;
-    case 1:
-    case 2:
-    case 3:
-      yylval->build<int> () = stage;
-      result = yy::parser::token::NUMBER;
-      break;
-    case 4:
-      yylval->build<std::string> () = 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: