]> git.saurik.com Git - bison.git/blobdiff - examples/variant.yy
muscle: factor the field retrieval
[bison.git] / examples / variant.yy
index 39a57ba8082ed555a1506f07a767d3df6152c61d..9413cbcf05ce92c5229f855bb9c55aff9eb98077 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2012 Free Software Foundation, Inc.
+  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
@@ -18,9 +18,9 @@
 %debug
 %skeleton "lalr1.cc"
 %defines
+%define api.token.constructor
+%define api.value.type variant
 %define parse.assert
-%define variant
-%define lex_symbol
 %locations
 
 %code requires // *.hh
@@ -38,7 +38,10 @@ typedef std::list<std::string> strings_type;
 #include <sstream>
 
   // Prototype of the yylex function providing subsequent tokens.
-  static yy::parser::symbol_type yylex ();
+  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.
@@ -67,8 +70,7 @@ typedef std::list<std::string> strings_type;
 
 %token <::std::string> TEXT;
 %token <int> NUMBER;
-%printer { debug_stream () << $$; }
-   <int> <::std::string> <::std::list<std::string>>;
+%printer { yyoutput << $$; } <*>;
 %token END_OF_FILE 0;
 
 %type <::std::string> item;
@@ -91,41 +93,44 @@ 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::symbol_type
-yylex ()
+namespace yy
 {
-  static int stage = -1;
-  ++stage;
-  yy::parser::location_type loc(0, stage + 1, stage + 1);
-  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:
-      return yy::parser::make_TEXT ("I have three numbers for you.", loc);
-    case 1:
-    case 2:
-    case 3:
-      return yy::parser::make_NUMBER (stage, loc);
-    case 4:
-      return yy::parser::make_TEXT ("And that's all!", loc);
-    default:
-      return yy::parser::make_END_OF_FILE (loc);
+    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);
+      }
   }
-}
 
-// Mandatory error function
-void
-yy::parser::error (const yy::parser::location_type& loc, const std::string& msg)
-{
-  std::cerr << loc << ": " << msg << std::endl;
+  // Mandatory error function
+  void
+  parser::error (const parser::location_type& loc, const std::string& msg)
+  {
+    std::cerr << loc << ": " << msg << std::endl;
+  }
 }
 
 int