$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52605 - in trunk/libs/spirit: . example/karma example/lex example/lex/static_lexer example/qi example/qi/calc6 example/qi/calc7 example/qi/mini_c test test/karma test/lex test/qi test/support test/support/detail
From: hartmut.kaiser_at_[hidden]
Date: 2009-04-26 10:47:02
Author: hkaiser
Date: 2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
New Revision: 52605
URL: http://svn.boost.org/trac/boost/changeset/52605
Log:
Merging Spirit V2.1
Added:
   trunk/libs/spirit/example/karma/karma_problem.cpp   (contents, props changed)
   trunk/libs/spirit/example/qi/calc4_debug.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/and_attribute.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/format_manip_attr.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/generate_attr.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/maxwidth.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/plus.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/stream.cpp   (contents, props changed)
   trunk/libs/spirit/test/karma/test_attr.hpp   (contents, props changed)
   trunk/libs/spirit/test/karma/test_manip_attr.hpp   (contents, props changed)
   trunk/libs/spirit/test/karma/tricky_alignment.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/match_manip_attr.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/omit.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/parse_attr.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/repeat.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/skip.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/terminal_ex.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/test_attr.hpp   (contents, props changed)
   trunk/libs/spirit/test/qi/test_manip_attr.hpp   (contents, props changed)
Removed:
   trunk/libs/spirit/example/karma/calc2_ast_dump.cpp
   trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp
   trunk/libs/spirit/example/karma/functor_facilities.cpp
   trunk/libs/spirit/example/qi/calc3_lexer.cpp
   trunk/libs/spirit/test/karma/none.cpp
   trunk/libs/spirit/test/qi/none.cpp
   trunk/libs/spirit/test/support/detail/
   trunk/libs/spirit/test/support/hold_any.cpp
   trunk/libs/spirit/test/support/multi_pass.cpp
   trunk/libs/spirit/test/support/multi_pass_compile.cpp
Text files modified: 
   trunk/libs/spirit/CMakeLists.txt                                   |     2                                         
   trunk/libs/spirit/example/karma/Jamfile                            |    11                                         
   trunk/libs/spirit/example/karma/actions.cpp                        |    28 ++-                                     
   trunk/libs/spirit/example/karma/basic_facilities.cpp               |   100 +++++++----                             
   trunk/libs/spirit/example/karma/calc2_ast.hpp                      |     4                                         
   trunk/libs/spirit/example/karma/calc2_ast_vm.cpp                   |    30 ++-                                     
   trunk/libs/spirit/example/karma/mini_xml_karma.cpp                 |    22 +-                                      
   trunk/libs/spirit/example/karma/quick_start1.cpp                   |    16 +-                                      
   trunk/libs/spirit/example/lex/Jamfile                              |    29 +-                                      
   trunk/libs/spirit/example/lex/example1.cpp                         |    49 +++---                                  
   trunk/libs/spirit/example/lex/example2.cpp                         |    49 +++---                                  
   trunk/libs/spirit/example/lex/example3.cpp                         |    34 +--                                     
   trunk/libs/spirit/example/lex/example4.cpp                         |    53 +++---                                  
   trunk/libs/spirit/example/lex/example5.cpp                         |    95 +++++------                             
   trunk/libs/spirit/example/lex/example6.cpp                         |    53 +++---                                  
   trunk/libs/spirit/example/lex/print_numbers.cpp                    |    40 ++--                                    
   trunk/libs/spirit/example/lex/static_lexer/Jamfile                 |     3                                         
   trunk/libs/spirit/example/lex/static_lexer/word_count_generate.cpp |     8                                         
   trunk/libs/spirit/example/lex/static_lexer/word_count_static.cpp   |    40 ++--                                    
   trunk/libs/spirit/example/lex/static_lexer/word_count_static.hpp   |    84 +++++-----                              
   trunk/libs/spirit/example/lex/static_lexer/word_count_tokens.hpp   |    11                                         
   trunk/libs/spirit/example/lex/strip_comments.cpp                   |    35 ++--                                    
   trunk/libs/spirit/example/lex/strip_comments.input                 |    82 ++++++----                              
   trunk/libs/spirit/example/lex/strip_comments_lexer.cpp             |    82 ++++++++--                              
   trunk/libs/spirit/example/lex/word_count.cpp                       |    40 ++--                                    
   trunk/libs/spirit/example/lex/word_count_functor.cpp               |    18 +-                                      
   trunk/libs/spirit/example/lex/word_count_lexer.cpp                 |    29 +--                                     
   trunk/libs/spirit/example/qi/Jamfile                               |     6                                         
   trunk/libs/spirit/example/qi/actions.cpp                           |    58 ++++---                                 
   trunk/libs/spirit/example/qi/calc1.cpp                             |    75 +++++----                               
   trunk/libs/spirit/example/qi/calc2.cpp                             |    97 ++++++-----                             
   trunk/libs/spirit/example/qi/calc2_ast.cpp                         |   296 +++++++++++++++++++++---------------    
   trunk/libs/spirit/example/qi/calc3.cpp                             |    80 +++++----                               
   trunk/libs/spirit/example/qi/calc4.cpp                             |   121 ++++++++-------                         
   trunk/libs/spirit/example/qi/calc5.cpp                             |   305 +++++++++++++++++++------------------   
   trunk/libs/spirit/example/qi/calc6/calc6.cpp                       |     4                                         
   trunk/libs/spirit/example/qi/calc6/calc6.hpp                       |    40 ++--                                    
   trunk/libs/spirit/example/qi/calc6/calc6a.cpp                      |     2                                         
   trunk/libs/spirit/example/qi/calc6/calc6b.cpp                      |     4                                         
   trunk/libs/spirit/example/qi/calc6/calc6b.hpp                      |    11 +                                       
   trunk/libs/spirit/example/qi/calc6/calc6c.cpp                      |     2                                         
   trunk/libs/spirit/example/qi/calc6/calc6c.hpp                      |    15 +                                       
   trunk/libs/spirit/example/qi/calc7/calc7.cpp                       |     4                                         
   trunk/libs/spirit/example/qi/calc7/calc7.hpp                       |    44 ++--                                    
   trunk/libs/spirit/example/qi/calc7/calc7a.cpp                      |     2                                         
   trunk/libs/spirit/example/qi/calc7/calc7b.cpp                      |     4                                         
   trunk/libs/spirit/example/qi/calc7/calc7b.hpp                      |    12 +                                       
   trunk/libs/spirit/example/qi/calc7/calc7c.cpp                      |     2                                         
   trunk/libs/spirit/example/qi/calc7/calc7c.hpp                      |    13 +                                       
   trunk/libs/spirit/example/qi/complex_number.cpp                    |    59 +++---                                  
   trunk/libs/spirit/example/qi/employee.cpp                          |   104 +++++++-----                            
   trunk/libs/spirit/example/qi/mini_c/mini_c.cpp                     |     4                                         
   trunk/libs/spirit/example/qi/mini_c/mini_c.hpp                     |    13                                         
   trunk/libs/spirit/example/qi/mini_c/mini_ca.cpp                    |     2                                         
   trunk/libs/spirit/example/qi/mini_c/mini_cb.cpp                    |     2                                         
   trunk/libs/spirit/example/qi/mini_c/mini_cb.hpp                    |     6                                         
   trunk/libs/spirit/example/qi/mini_c/mini_cc.cpp                    |     2                                         
   trunk/libs/spirit/example/qi/mini_c/mini_cc.hpp                    |     6                                         
   trunk/libs/spirit/example/qi/mini_c/mini_cd.cpp                    |     2                                         
   trunk/libs/spirit/example/qi/mini_c/mini_cd.hpp                    |     8                                         
   trunk/libs/spirit/example/qi/mini_xml1.cpp                         |   276 ++++++++++++++++++----------------      
   trunk/libs/spirit/example/qi/mini_xml2.cpp                         |   273 +++++++++++++++++----------------       
   trunk/libs/spirit/example/qi/mini_xml3.cpp                         |   316 ++++++++++++++++++++------------------- 
   trunk/libs/spirit/example/qi/num_list1.cpp                         |    52 +++---                                  
   trunk/libs/spirit/example/qi/num_list2.cpp                         |    68 ++++---                                 
   trunk/libs/spirit/example/qi/num_list3.cpp                         |    66 ++++---                                 
   trunk/libs/spirit/example/qi/num_list4.cpp                         |    61 ++++---                                 
   trunk/libs/spirit/example/qi/roman.cpp                             |   200 +++++++++++++------------               
   trunk/libs/spirit/example/qi/sum.cpp                               |    68 ++++---                                 
   trunk/libs/spirit/test/CMakeLists.txt                              |    94 +++++++----                             
   trunk/libs/spirit/test/Jamfile                                     |    52 +++--                                   
   trunk/libs/spirit/test/karma/actions.cpp                           |    75 +++++++-                                
   trunk/libs/spirit/test/karma/alternative.cpp                       |   138 ++++++++++-------                       
   trunk/libs/spirit/test/karma/binary.cpp                            |    22 +-                                      
   trunk/libs/spirit/test/karma/case_handling.cpp                     |   178 ++++++++++++++++------                  
   trunk/libs/spirit/test/karma/center_alignment.cpp                  |    15 +                                       
   trunk/libs/spirit/test/karma/char.cpp                              |   175 ++++++++++++---------                   
   trunk/libs/spirit/test/karma/delimiter.cpp                         |    16 +                                       
   trunk/libs/spirit/test/karma/eps.cpp                               |    31 +++                                     
   trunk/libs/spirit/test/karma/format_manip.cpp                      |    54 ++---                                   
   trunk/libs/spirit/test/karma/grammar.cpp                           |     4                                         
   trunk/libs/spirit/test/karma/grammar_fail.cpp                      |    23 +-                                      
   trunk/libs/spirit/test/karma/int_numerics.cpp                      |    85 ++++++----                              
   trunk/libs/spirit/test/karma/kleene.cpp                            |    75 ++------                                
   trunk/libs/spirit/test/karma/lazy.cpp                              |    30 +-                                      
   trunk/libs/spirit/test/karma/left_alignment.cpp                    |    16 +-                                      
   trunk/libs/spirit/test/karma/list.cpp                              |     6                                         
   trunk/libs/spirit/test/karma/lit.cpp                               |    93 +++++++----                             
   trunk/libs/spirit/test/karma/optional.cpp                          |    12 -                                       
   trunk/libs/spirit/test/karma/pattern.cpp                           |   133 ++++++++++------                        
   trunk/libs/spirit/test/karma/pattern2.cpp                          |   100 +++++++++++                             
   trunk/libs/spirit/test/karma/real_numerics.cpp                     |   188 +++++++++++++++--------                 
   trunk/libs/spirit/test/karma/right_alignment.cpp                   |    12                                         
   trunk/libs/spirit/test/karma/rule_fail.cpp                         |    19 +-                                      
   trunk/libs/spirit/test/karma/sequence.cpp                          |    46 +++--                                   
   trunk/libs/spirit/test/karma/test.hpp                              |    64 ++++---                                 
   trunk/libs/spirit/test/lex/lexertl1.cpp                            |    47 ++---                                   
   trunk/libs/spirit/test/lex/lexertl2.cpp                            |    67 +++----                                 
   trunk/libs/spirit/test/lex/lexertl3.cpp                            |    41 ++--                                    
   trunk/libs/spirit/test/lex/lexertl4.cpp                            |    37 ++--                                    
   trunk/libs/spirit/test/lex/lexertl5.cpp                            |    45 ++---                                   
   trunk/libs/spirit/test/lex/state_switcher_test.cpp                 |    85 +++++-----                              
   trunk/libs/spirit/test/lex/test_parser.hpp                         |    26 +--                                     
   trunk/libs/spirit/test/qi/actions.cpp                              |    28 ++-                                     
   trunk/libs/spirit/test/qi/alternative.cpp                          |    66 ++++++--                                
   trunk/libs/spirit/test/qi/and_predicate.cpp                        |     4                                         
   trunk/libs/spirit/test/qi/binary.cpp                               |    43 +++--                                   
   trunk/libs/spirit/test/qi/char.cpp                                 |   144 ++++++++++++-----                       
   trunk/libs/spirit/test/qi/char_class.cpp                           |    18 +-                                      
   trunk/libs/spirit/test/qi/difference.cpp                           |    17 +-                                      
   trunk/libs/spirit/test/qi/end.cpp                                  |    67 +++----                                 
   trunk/libs/spirit/test/qi/eps.cpp                                  |    19 +                                       
   trunk/libs/spirit/test/qi/expect.cpp                               |    33 ++-                                     
   trunk/libs/spirit/test/qi/grammar.cpp                              |    20 +                                       
   trunk/libs/spirit/test/qi/int.cpp                                  |    37 +++                                     
   trunk/libs/spirit/test/qi/kleene.cpp                               |    50 +++---                                  
   trunk/libs/spirit/test/qi/lazy.cpp                                 |    33 +++-                                    
   trunk/libs/spirit/test/qi/lexeme.cpp                               |    11                                         
   trunk/libs/spirit/test/qi/list.cpp                                 |    26 ++                                      
   trunk/libs/spirit/test/qi/lit.cpp                                  |    60 +++++--                                 
   trunk/libs/spirit/test/qi/match_manip.cpp                          |    77 ++++----                                
   trunk/libs/spirit/test/qi/no_case.cpp                              |    59 ++++++-                                 
   trunk/libs/spirit/test/qi/not_predicate.cpp                        |     5                                         
   trunk/libs/spirit/test/qi/optional.cpp                             |    19 +-                                      
   trunk/libs/spirit/test/qi/permutation.cpp                          |    11                                         
   trunk/libs/spirit/test/qi/plus.cpp                                 |    28 +-                                      
   trunk/libs/spirit/test/qi/range_run.cpp                            |     2                                         
   trunk/libs/spirit/test/qi/raw.cpp                                  |    18 +                                       
   trunk/libs/spirit/test/qi/real.cpp                                 |    75 +++++---                                
   trunk/libs/spirit/test/qi/rule.cpp                                 |   236 ++++++++++++++++++++++++-----           
   trunk/libs/spirit/test/qi/sequence.cpp                             |   129 +++++----------                         
   trunk/libs/spirit/test/qi/sequential_or.cpp                        |    29 ++                                      
   trunk/libs/spirit/test/qi/symbols.cpp                              |    93 +++++++++++                             
   trunk/libs/spirit/test/qi/test.hpp                                 |    36 ++++                                    
   trunk/libs/spirit/test/qi/tst.cpp                                  |     8                                         
   trunk/libs/spirit/test/qi/uint.cpp                                 |    65 ++++---                                 
   136 files changed, 4361 insertions(+), 3141 deletions(-)
Modified: trunk/libs/spirit/CMakeLists.txt
==============================================================================
--- trunk/libs/spirit/CMakeLists.txt	(original)
+++ trunk/libs/spirit/CMakeLists.txt	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -13,7 +13,7 @@
   TESTDIRS  test
   HEADERS ${lib_headers}
   #  DOCDIRS 
-  DESCRIPTION  "LL parser framework represents parsers directly as EBNF grammars in inlined C++."
+  DESCRIPTION  "A object oriented, recursive-descent parser and output generation library using the yyntax of Parsing Expression Grammars (PEGs) directly in C++"
   MODULARIZED
   AUTHORS  "Joel de Guzman <joel -at- boost-consulting.com>"
            "Hartmut Kaiser <hartmut.kaiser -at- gmail.com>"
Modified: trunk/libs/spirit/example/karma/Jamfile
==============================================================================
--- trunk/libs/spirit/example/karma/Jamfile	(original)
+++ trunk/libs/spirit/example/karma/Jamfile	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 #==============================================================================
-#   Copyright (c) 2001-2008 Joel de Guzman
-#   Copyright (c) 2001-2008 Hartmut Kaiser
+#   Copyright (c) 2001-2009 Joel de Guzman
+#   Copyright (c) 2001-2009 Hartmut Kaiser
 #
 #   Distributed under the Boost Software License, Version 1.0. (See accompanying
 #   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,9 +9,12 @@
 
 exe quick_start1       : quick_start1.cpp ;
 exe actions_example    : actions.cpp ;
-exe basic_facilities   : basic_facilities.cpp ;
-exe functor_facilities : functor_facilities.cpp ;
+exe basic_facilities   : basic_facilities.cpp /boost//date_time ;
 exe calc2_ast_dump     : calc2_ast_dump.cpp ;
 exe calc2_ast_rpn      : calc2_ast_rpn.cpp ;
 exe calc2_ast_vm       : calc2_ast_vm.cpp ;
+exe min_xml_karma      : min_xml_karma.cpp ;
+
+# not ported yet:
+# exe functor_facilities : functor_facilities.cpp ;
 
Modified: trunk/libs/spirit/example/karma/actions.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/actions.cpp	(original)
+++ trunk/libs/spirit/example/karma/actions.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2008 Hartmut Kaiser
-    Copyright (c) 2001-2008 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -20,7 +20,7 @@
 //  * Using boost.bind
 //  * Using boost.lambda
 
-using namespace boost::spirit;
+using boost::spirit::unused_type;
 
 void read(int& i)
 {
@@ -39,8 +39,11 @@
 int main()
 {
     { // example using plain functions
+        using namespace boost::spirit;
+
         std::string generated;
-        bool result = karma::generate(std::back_inserter(generated), 
+        std::back_insert_iterator<std::string> outit(generated);
+        bool result = karma::generate(outit, 
             '{' << int_[&read] << '}');
 
         if (result)
@@ -48,8 +51,11 @@
     }
 
     { // example using simple function objects
+        using namespace boost::spirit;
+
         std::string generated;
-        bool result = karma::generate(std::back_inserter(generated), 
+        std::back_insert_iterator<std::string> outit(generated);
+        bool result = karma::generate(outit, 
             '{' << int_[read_action()] << '}');
 
         if (result)
@@ -57,9 +63,13 @@
     }
 
     { // example using boost.bind
+        using boost::spirit::int_;
+        using boost::spirit::karma::generate;
+
         std::string generated;
-        bool result = karma::generate(std::back_inserter(generated), 
-            '{' << int_[boost::bind(&read, _1)] << '}');
+        std::back_insert_iterator<std::string> outit(generated);
+        bool result = generate(outit, 
+            '{' << int_[boost::bind(read, _1)] << '}');
 
         if (result)
             std::cout << "Boost.Bind: " << generated << std::endl;
@@ -67,11 +77,13 @@
 
     { // example using boost.lambda
         namespace lambda = boost::lambda;
+        using namespace boost::spirit;
 
         std::string generated;
         std::stringstream strm("42");
 
-        bool result = karma::generate(std::back_inserter(generated),
+        std::back_insert_iterator<std::string> outit(generated);
+        bool result = karma::generate(outit,
             '{' << int_[strm >> lambda::_1] << '}');
 
         if (result)
Modified: trunk/libs/spirit/example/karma/basic_facilities.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/basic_facilities.cpp	(original)
+++ trunk/libs/spirit/example/karma/basic_facilities.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -26,6 +26,7 @@
 #include <cstdlib> 
 
 #include <boost/range.hpp>
+#include <boost/array.hpp>
 #include <boost/date_time/gregorian/gregorian.hpp>
 #include <boost/fusion/include/std_pair.hpp>
 
@@ -59,17 +60,24 @@
 {
     // output the container as a space separated sequence
     os << 
+        karma::format(
+            *stream,                              // format description
+            c                                     // data
+        ) << std::endl << std::endl;
+
+    // output the container as a space separated sequence
+    os << 
         karma::format_delimited(
             *stream,                              // format description
-            c,                                    // data
-            space                                 // delimiter
+            space,                                // delimiter
+            c                                     // data
         ) << std::endl << std::endl;
 
     os << 
         karma::format_delimited(
             '[' << *stream << ']',                // format description
-            c,                                    // data
-            space                                 // delimiter
+            space,                                // delimiter
+            c                                     // data
         ) << std::endl << std::endl;
 
     // output the container as a comma separated list
@@ -85,11 +93,17 @@
             c                                     // data
         ) << std::endl << std::endl;
 
-    os << 
-        karma::format(
-            '[' << -(stream % ", ") << ']',       // format description
-            c                                     // data
-        ) << std::endl << std::endl;
+//     os << 
+//         karma::format(
+//             '[' << -(stream % ", ") << ']',       // format description
+//             c                                     // data
+//         ) << std::endl << std::endl;
+
+//     os << 
+//         karma::format(
+//             '[' << (+stream | "empty") << ']',    // format description
+//             c                                     // data
+//         ) << std::endl << std::endl;
 
     // output the container as a comma separated list of items enclosed in '()'
     os << 
@@ -105,15 +119,15 @@
              )  << ']',                           // format description
             c                                     // data
         ) << std::endl << std::endl;
-        
+
     // output the container as a HTML list
     os << 
         karma::format_delimited(
-            "<ol>" << 
+            /*"<ol>" << */
                 *verbatim["<li>" << stream << "</li>"]
-            << "</ol>",                           // format description
-            c,                                    // data
-            '\n'                                  // delimiter
+            /*<< "</ol>"*/,                           // format description
+            '\n',                                 // delimiter
+            c                                     // data
         ) << std::endl;
 
     // output the container as right aligned column
@@ -122,8 +136,8 @@
            *verbatim[
                 "|" << right_align[stream] << "|"
             ],                                    // format description
-            c,                                    // data
-            '\n'                                  // delimiter
+            '\n',                                 // delimiter
+            c                                     // data
         ) << std::endl;
 
     os << std::endl;
@@ -132,15 +146,24 @@
 int main()
 {
     ///////////////////////////////////////////////////////////////////////////
+    // C-style array
+    int i[4] = { 3, 6, 9, 12 };
+    
+    std::cout << "-------------------------------------------------------------" 
+              << std::endl;
+    std::cout << "int i[]" << std::endl;
+    output_container(std::cout, boost::make_iterator_range(i, i+4));
+
+    ///////////////////////////////////////////////////////////////////////////
     // vector
-    std::vector<int> v (8);
+    std::vector<int> v (5);
     std::generate(v.begin(), v.end(), std::rand); // randomly fill the vector
 
     std::cout << "-------------------------------------------------------------" 
               << std::endl;
     std::cout << "std::vector<int>" << std::endl;
     output_container(std::cout, v);
-        
+
     ///////////////////////////////////////////////////////////////////////////
     // list
     std::list<char> l;
@@ -154,15 +177,6 @@
     output_container(std::cout, l);
 
     ///////////////////////////////////////////////////////////////////////////
-    // C-style array
-    int i[4] = { 3, 6, 9, 12 };
-    
-    std::cout << "-------------------------------------------------------------" 
-              << std::endl;
-    std::cout << "int i[]" << std::endl;
-    output_container(std::cout, boost::make_iterator_range(i, i+4));
-    
-    ///////////////////////////////////////////////////////////////////////////
     // strings
     std::string str("Hello world!");
 
@@ -170,7 +184,17 @@
               << std::endl;
     std::cout << "std::string" << std::endl;
     output_container(std::cout, str);
-        
+
+    ///////////////////////////////////////////////////////////////////////////
+    // boost::array
+    boost::array<long, 5> arr;
+    std::generate(arr.begin(), arr.end(), std::rand); // randomly fill the array
+
+    std::cout << "-------------------------------------------------------------" 
+              << std::endl;
+    std::cout << "boost::array<long, 5>" << std::endl;
+    output_container(std::cout, arr);
+
     ///////////////////////////////////////////////////////////////////////////
     //  vector of boost::date objects
     //  Note: any registered facets get used!
@@ -187,18 +211,18 @@
               << std::endl;
     std::cout << "std::vector<boost::date>" << std::endl;
     output_container(std::cout, dates);
-    
+
     ///////////////////////////////////////////////////////////////////////////
     //  map of int --> string mappings
-    std::map<int, std::string> mappings;
-    mappings.insert(std::make_pair(0, "zero"));
-    mappings.insert(std::make_pair(1, "one"));
-    mappings.insert(std::make_pair(2, "two"));
-
-    std::cout << "-------------------------------------------------------------" 
-              << std::endl;
-    std::cout << "std::map<int, std::string>" << std::endl;
-    output_container(std::cout, mappings);
+//     std::map<int, std::string> mappings;
+//     mappings.insert(std::make_pair(0, "zero"));
+//     mappings.insert(std::make_pair(1, "one"));
+//     mappings.insert(std::make_pair(2, "two"));
+// 
+//     std::cout << "-------------------------------------------------------------" 
+//               << std::endl;
+//     std::cout << "std::map<int, std::string>" << std::endl;
+//     output_container(std::cout, mappings);
 
     return 0;
 }
Modified: trunk/libs/spirit/example/karma/calc2_ast.hpp
==============================================================================
--- trunk/libs/spirit/example/karma/calc2_ast.hpp	(original)
+++ trunk/libs/spirit/example/karma/calc2_ast.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
-    Copyright (c) 2001-2008 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Deleted: trunk/libs/spirit/example/karma/calc2_ast_dump.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/calc2_ast_dump.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,165 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
-    Copyright (c) 2001-2008 Hartmut Kaiser
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-///////////////////////////////////////////////////////////////////////////////
-//
-//  A Calculator example demonstrating generation of AST which gets dumped into
-//  a human readable format afterwards.
-//
-//  [ JDG April 28, 2008 ]
-//  [ HK April 28, 2008 ]
-//
-///////////////////////////////////////////////////////////////////////////////
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/karma.hpp>
-
-#include <iostream>
-#include <vector>
-#include <string>
-
-#include "calc2_ast.hpp"
-
-using namespace boost::spirit;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator parser grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : qi::grammar<Iterator, expression_ast(), space_type>
-{
-    calculator() : calculator::base_type(expression)
-    {
-        expression =
-            term                            [_val = _1]
-            >> *(   ('+' >> term            [_val += _1])
-                |   ('-' >> term            [_val -= _1])
-                )
-            ;
-
-        term =
-            factor                          [_val = _1]
-            >> *(   ('*' >> factor          [_val *= _1])
-                |   ('/' >> factor          [_val /= _1])
-                )
-            ;
-
-        factor =
-            uint_                           [_val = _1]
-            |   '(' >> expression           [_val = _1] >> ')'
-            |   ('-' >> factor              [_val = neg(_1)])
-            |   ('+' >> factor              [_val = pos(_1)])
-            ;
-    }
-
-    qi::rule<Iterator, expression_ast(), space_type> expression, term, factor;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our AST grammar for the generator, this just dumps the AST as a expression
-///////////////////////////////////////////////////////////////////////////////
-template <typename OuputIterator>
-struct dump_ast
-  : karma::grammar<OuputIterator, expression_ast(), space_type>
-{
-    dump_ast() : dump_ast::base_type(ast_node)
-    {
-        ast_node %= 
-                int_        [_1 = _int(_val)]
-            |   binary_node [_1 = _bin_op(_val)]
-            |   unary_node  [_1 = _unary_op(_val)]
-            ;
-            
-        binary_node = 
-                ('(' << ast_node << char_ << ast_node << ')')
-                [ 
-                    _1 = _left(_val), _2 = _op(_val), _3 = _right(_val)
-                ]
-            ;
-
-        unary_node =
-                ('(' << char_ << ast_node << ')')
-                [
-                    _1 = _op(_val), _2 = _right(_val)
-                ]
-            ;
-    }
-
-    karma::rule<OuputIterator, expression_ast(), space_type> ast_node;
-    karma::rule<OuputIterator, binary_op(), space_type> binary_node;
-    karma::rule<OuputIterator, unary_op(), space_type> unary_node;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//  Main program
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
-    std::cout << "/////////////////////////////////////////////////////////\n\n";
-    std::cout << "Dump AST's for simple expressions...\n\n";
-    std::cout << "/////////////////////////////////////////////////////////\n\n";
-    std::cout << "Type an expression...or [q or Q] to quit\n\n";
-
-    //  Our parser grammar definitions
-    typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
-
-    calculator calc; 
-
-    // Our generator grammar definitions
-    typedef std::back_insert_iterator<std::string> output_iterator_type;
-    typedef dump_ast<output_iterator_type> dump_ast;
-
-    dump_ast ast_grammar;
-
-    std::string str;
-    while (std::getline(std::cin, str))
-    {
-        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
-            break;
-
-        expression_ast ast;
-        std::string::const_iterator iter = str.begin();
-        std::string::const_iterator end = str.end();
-        bool r = qi::phrase_parse(iter, end, calc, ast, space);
-
-        if (r && iter == end)
-        {
-            std::string generated;
-            r = karma::generate_delimited(
-                std::back_inserter(generated), ast_grammar, ast, space);
-            
-            if (r)
-            {
-                std::cout << "AST for '" << str << "': " << generated 
-                          << std::endl;
-            }
-            else
-            {
-                std::cout << "-------------------------\n";
-                std::cout << "Generating failed\n";
-                std::cout << "-------------------------\n";
-            }
-        }
-        else
-        {
-            std::string rest(iter, end);
-            std::cout << "-------------------------\n";
-            std::cout << "Parsing failed\n";
-            std::cout << "stopped at: \": " << rest << "\"\n";
-            std::cout << "-------------------------\n";
-        }
-    }
-
-    std::cout << "Bye... :-) \n\n";
-    return 0;
-}
-
-
Deleted: trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,169 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
-    Copyright (c) 2001-2008 Hartmut Kaiser
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-///////////////////////////////////////////////////////////////////////////////
-//
-//  A Calculator example demonstrating generation of AST which gets dumped into
-//  a reverse polish notation afterwards.
-//
-//  [ JDG April 28, 2008 ]
-//  [ HK April 28, 2008 ]
-//
-///////////////////////////////////////////////////////////////////////////////
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/karma.hpp>
-
-#include <iostream>
-#include <vector>
-#include <string>
-
-#include "calc2_ast.hpp"
-
-using namespace boost::spirit;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator parser grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : qi::grammar<Iterator, expression_ast(), space_type>
-{
-    calculator() : calculator::base_type(expression)
-    {
-        expression =
-            term                            [_val = _1]
-            >> *(   ('+' >> term            [_val += _1])
-                |   ('-' >> term            [_val -= _1])
-                )
-            ;
-
-        term =
-            factor                          [_val = _1]
-            >> *(   ('*' >> factor          [_val *= _1])
-                |   ('/' >> factor          [_val /= _1])
-                )
-            ;
-
-        factor =
-            uint_                           [_val = _1]
-            |   '(' >> expression           [_val = _1] >> ')'
-            |   ('-' >> factor              [_val = neg(_1)])
-            |   ('+' >> factor              [_val = pos(_1)])
-            ;
-    }
-
-    qi::rule<Iterator, expression_ast(), space_type> expression, term, factor;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our AST grammar for the generator, this prints the AST in reverse polish 
-//  notation
-///////////////////////////////////////////////////////////////////////////////
-template <typename OuputIterator>
-struct ast_rpn
-  : karma::grammar<OuputIterator, expression_ast(), space_type>
-{
-    ast_rpn() : ast_rpn::base_type(ast_node)
-    {
-        ast_node %= 
-                int_        [_1 = _int(_val)]
-            |   binary_node [_1 = _bin_op(_val)]
-            |   unary_node  [_1 = _unary_op(_val)]
-            ;
-            
-        binary_node = 
-                (ast_node << ast_node << char_)
-                [ 
-                    _1 = _left(_val), _2 = _right(_val), _3 = _op(_val)
-                ]
-            ;
-
-        unary_node =
-                verbatim [
-                    ('(' << ast_node << char_ << ')')
-                    [
-                        _1 = _right(_val), _2 = _op(_val)
-                    ]
-                ]
-            ;
-    }
-
-    karma::rule<OuputIterator, expression_ast(), space_type> ast_node;
-    karma::rule<OuputIterator, binary_op(), space_type> binary_node;
-    karma::rule<OuputIterator, unary_op(), space_type> unary_node;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//  Main program
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
-    std::cout << "/////////////////////////////////////////////////////////\n\n";
-    std::cout << "RPN generator for simple expressions...\n\n";
-    std::cout << "/////////////////////////////////////////////////////////\n\n";
-    std::cout << "Type an expression...or [q or Q] to quit\n\n";
-
-    //  Our parser grammar definitions
-    typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
-
-    calculator calc; 
-
-    // Our generator grammar definitions
-    typedef std::back_insert_iterator<std::string> output_iterator_type;
-    typedef ast_rpn<output_iterator_type> ast_rpn;
-    
-    ast_rpn ast_grammar;
-
-    std::string str;
-    while (std::getline(std::cin, str))
-    {
-        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
-            break;
-
-        expression_ast ast;   // this will hold the generated AST
-        
-        std::string::const_iterator iter = str.begin();
-        std::string::const_iterator end = str.end();
-        bool r = qi::phrase_parse(iter, end, calc, ast, space);
-
-        if (r && iter == end)
-        {
-            std::string generated;
-            r = karma::generate_delimited(
-                std::back_inserter(generated), ast_grammar, ast, space);
-            
-            if (r)
-            {
-                std::cout << "RPN for '" << str << "': " << generated 
-                          << std::endl;
-            }
-            else
-            {
-                std::cout << "-------------------------\n";
-                std::cout << "Generating failed\n";
-                std::cout << "-------------------------\n";
-            }
-        }
-        else
-        {
-            std::string rest(iter, end);
-            std::cout << "-------------------------\n";
-            std::cout << "Parsing failed\n";
-            std::cout << "stopped at: \": " << rest << "\"\n";
-            std::cout << "-------------------------\n";
-        }
-    }
-
-    std::cout << "Bye... :-) \n\n";
-    return 0;
-}
-
-
Modified: trunk/libs/spirit/example/karma/calc2_ast_vm.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/calc2_ast_vm.cpp	(original)
+++ trunk/libs/spirit/example/karma/calc2_ast_vm.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -16,9 +16,9 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 #include <boost/config/warning_disable.hpp>
+
 #include <boost/spirit/include/qi.hpp>
 #include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/home/karma/binary.hpp>
 
 #include <iostream>
 #include <vector>
@@ -28,13 +28,13 @@
 
 using namespace boost::spirit;
 using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Our calculator parser grammar
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Iterator>
-struct calculator : qi::grammar<Iterator, expression_ast(), space_type>
+struct calculator 
+  : qi::grammar<Iterator, expression_ast(), space_type>
 {
     calculator() : calculator::base_type(expression)
     {
@@ -138,20 +138,24 @@
     generate_byte_code() : generate_byte_code::base_type(ast_node)
     {
         ast_node %= 
-                (dword(op_int) << dword) [_1 = _int(_val)]
-            |   binary_node              [_1 = _bin_op(_val)]
-            |   unary_node               [_1 = _unary_op(_val)]
+                int_node    [_1 = _int(_val)]
+            |   binary_node [_1 = _bin_op(_val)]
+            |   unary_node  [_1 = _unary_op(_val)]
+            ;
+
+        int_node %=
+                dword(op_int) << dword
             ;
-            
+
         binary_node = 
-                (ast_node << ast_node << byte)
+                (ast_node << ast_node << byte_)
                 [ 
                     _1 = _left(_val), _2 = _right(_val), _3 = _op(_val)
                 ]
             ;
 
         unary_node =
-                (ast_node << byte)
+                (ast_node << byte_)
                 [
                     _1 = _right(_val), _2 = _op(_val)
                 ]
@@ -159,6 +163,7 @@
     }
 
     karma::rule<OuputIterator, expression_ast(), Delimiter> ast_node;
+    karma::rule<OuputIterator, int(), Delimiter> int_node;
     karma::rule<OuputIterator, binary_op(), Delimiter> binary_node;
     karma::rule<OuputIterator, unary_op(), Delimiter> unary_node;
 };
@@ -173,8 +178,9 @@
     typedef char* output_iterator_type;
     typedef generate_byte_code<output_iterator_type, Delimiter> generate_byte_code;
 
+    char* outbuffer = (*code.begin()).bytes;
     generate_byte_code gen_vm;
-    return karma::generate_delimited((*code.begin()).bytes, gen_vm, ast, d);
+    return karma::generate_delimited(outbuffer, gen_vm, d, ast);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -203,14 +209,14 @@
         expression_ast ast;
         std::string::const_iterator iter = str.begin();
         std::string::const_iterator end = str.end();
-        bool r = qi::phrase_parse(iter, end, calc, ast, space);
+        bool r = qi::phrase_parse(iter, end, calc, space, ast);
 
         if (r && iter == end)
         {
             // we assume a vm code size of 4096 is sufficient
             std::vector<vmachine::element> code (4096);
             r = generate_vm_code(ast, code, pad(4));
-            
+
             if (r)
             {
                 vmachine vm;
Deleted: trunk/libs/spirit/example/karma/functor_facilities.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/functor_facilities.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,199 +0,0 @@
-//  Copyright (c) 2001-2009 Hartmut Kaiser
-// 
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  This examples demonstrate how to write functor based generators for special
-//  purposes. 
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/include/karma_stream.hpp>
-
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
-
-#include <iostream>
-#include <string>
-#include <vector>
-#include <list>
-#include <algorithm>
-#include <cstdlib> 
-
-using namespace boost::spirit;
-
-///////////////////////////////////////////////////////////////////////////////
-//  The functor generator 'counter' can be used for output annotation with some
-//  item counting information.
-///////////////////////////////////////////////////////////////////////////////
-struct counter_impl : boost::spirit::karma::functor_base
-{
-    template <typename OutputIterator, typename Context, typename Parameter>
-    bool operator()(Parameter const&, Context& ctx, OutputIterator& sink) const
-    {
-        return karma::generate(sink, int_ << ": ", counter++);
-    }
-
-    counter_impl(int& counter_) 
-    : counter(counter_) {}
-
-    int& counter;
-};
-
-inline boost::spirit::result_of::as_generator<counter_impl>::type
-counter(int& counter_)
-{
-    using namespace boost::spirit::karma;
-    return as_generator(counter_impl(counter_));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//  The functor generator 'confix' allows a simple syntax for generating 
-//  output wrapped inside a pair of a prefix and a suffix.
-///////////////////////////////////////////////////////////////////////////////
-template <typename Expr>
-struct confix_impl : public boost::spirit::karma::functor_base
-{
-    template <typename Context>
-    struct apply
-    {
-        typedef boost::spirit::hold_any type;
-    };
-
-    template <typename OutputIterator, typename Context, typename Parameter>
-    bool operator()(Parameter const& v, Context& ctx, OutputIterator& sink) const
-    {
-        return karma::generate(sink, open << xpr << close, v);
-    }
-
-    confix_impl(char const* open_, char const* close_, Expr const& xpr_) 
-    : open(open_), close(close_), xpr(xpr_) {}
-
-    std::string open;
-    std::string close;
-    Expr xpr;
-};
-
-template <typename Expr>
-inline typename boost::spirit::result_of::as_generator<confix_impl<Expr> >::type
-confix(Expr const& xpr_, char const* open_ = "", char const* close_ = "")
-{
-    using namespace boost::spirit::karma;
-    return as_generator(confix_impl<Expr>(open_, close_, xpr_));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//  The functor generator 'list' allows a simple syntax for generating 
-//  list formatted output.
-//
-//  This example uses phoenix::bind to allow to omit the second argument from 
-//  the operator() and to allow to switch the remaining two arguments.
-///////////////////////////////////////////////////////////////////////////////
-template <typename Expr>
-struct list_impl : boost::spirit::karma::functor_base
-{
-    // this function will be called to generate the output
-    template <typename OutputIterator, typename Parameter>
-    bool operator()(OutputIterator& sink, Parameter const& v) const
-    {
-        return karma::generate(sink, xpr % delim, v);
-    }
-
-    list_impl(Expr const& xpr_, char const* delim_) 
-    : xpr(xpr_), delim(delim_) {}
-
-    Expr xpr;
-    std::string delim;
-};
-
-//  Supply the expected parameter type explicitly
-struct list_impl_mf
-{
-    // the expected parameter type of a functor has to be defined using a
-    // embedded apply metafunction
-    template <typename Context>
-    struct apply
-    {
-        typedef boost::spirit::hold_any type;
-    };
-};
-
-template <typename Expr>
-inline list_impl<Expr>
-list(Expr const& xpr, char const* delim)
-{
-    return list_impl<Expr>(xpr, delim);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
-    using namespace boost::phoenix;
-    using namespace boost::phoenix::arg_names;
-
-    ///////////////////////////////////////////////////////////////////////////
-    //  Output the given containers in list format
-    //  We use a special functor generator here to annotate the output with 
-    //  a integer counting the entries.
-    ///////////////////////////////////////////////////////////////////////////
-    std::vector<int> v (8);
-    std::generate(v.begin(), v.end(), std::rand); // randomly fill the vector
-
-    int counter1 = 1;
-    std::cout << 
-        karma::format(
-            (counter(counter1) << int_) % ", ",   // format description
-            v                                     // data
-        ) << std::endl;
-
-    //  Here we initialize the counter to 100
-    int counter2 = 100;
-    std::cout << 
-        karma::format(
-            '[' << (
-                (counter(counter2) << int_) % ", "
-             ) << ']',                            // format description
-            v                                     // data
-        ) << std::endl;
-
-    ///////////////////////////////////////////////////////////////////////////
-    //  list
-    //  The output format description used below adds special item formatting
-    ///////////////////////////////////////////////////////////////////////////
-    std::list<std::string> names;
-    names.push_back("Spirit");
-    names.push_back("Qi");
-    names.push_back("Karma");
-
-    // specifying a prefix item suffix scheme directly
-    std::cout << 
-        karma::format(
-            ('{' << stream << '}') % ", ",        // format description
-            names                                 // data
-        ) << std::endl;
-
-    //  The confix generator nicely wraps the given expression with prefix and 
-    //  suffix strings
-    std::cout << 
-        karma::format(
-            confix(stream % ", ", "[", "]"),      // format description
-            names                                 // data
-        ) << std::endl;
-
-    ///////////////////////////////////////////////////////////////////////////
-    //  Output the given container as a list
-    //  We use a separate metafunction list_impl_mf to specify the expected 
-    //  parameter type of this functor generator. 
-    //  We use phoenix::bind to allow to omit the 2nd argument from the functor
-    //  function operator and to change the sequence of the remaining two 
-    //  arguments.
-    ///////////////////////////////////////////////////////////////////////////
-    std::string str("Hello world!");
-    std::cout << 
-        karma::format(
-            karma::as_generator_mf<list_impl_mf>(bind(list(stream, ", "), _3, _1)),
-            str
-        ) << std::endl;
-    
-    return 0;
-}
Added: trunk/libs/spirit/example/karma/karma_problem.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/example/karma/karma_problem.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,79 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_fusion.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <boost/variant/recursive_variant.hpp>
+
+#include <string>
+#include <vector>
+
+using namespace boost::spirit;
+using namespace boost::spirit::ascii;
+
+namespace fusion = boost::fusion;
+namespace phoenix = boost::phoenix;
+
+using phoenix::at_c;
+
+struct mini_xml;
+
+typedef
+    boost::variant<
+        boost::recursive_wrapper<mini_xml>
+      , std::string
+    >
+mini_xml_node;
+
+struct mini_xml
+{
+    std::string name;                           // tag name
+    std::vector<mini_xml_node> children;        // children
+};
+
+BOOST_FUSION_ADAPT_STRUCT(
+    mini_xml,
+    (std::string, name)
+    (std::vector<mini_xml_node>, children)
+)
+
+template <typename OutputIterator>
+struct mini_xml_generator
+  : karma::grammar<OutputIterator, mini_xml()>
+{
+    mini_xml_generator() : mini_xml_generator::base_type(xml)
+    {
+        xml = 
+//                string[_1 = at_c<0>(_val)]    // this compiles
+               string(at_c<0>(_val))    // this doesn't compile
+            ;
+    }
+
+    karma::rule<OutputIterator, mini_xml()> xml;
+};
+
+int main(int argc, char **argv)
+{
+    mini_xml ast;
+
+    typedef std::back_insert_iterator<std::string> outiter_type;
+    typedef mini_xml_generator<outiter_type> mini_xml_generator;
+
+    mini_xml_generator xmlout;
+
+    std::string generated;
+    outiter_type outit(generated);
+    bool r = karma::generate(outit, xmlout, ast);
+
+    return 0;
+}
+
+
Modified: trunk/libs/spirit/example/karma/mini_xml_karma.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/mini_xml_karma.cpp	(original)
+++ trunk/libs/spirit/example/karma/mini_xml_karma.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
-    Copyright (c) 2001-2008 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -15,6 +15,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <boost/config/warning_disable.hpp>
+
 #include <boost/spirit/include/qi.hpp>
 #include <boost/spirit/include/karma.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
@@ -32,7 +33,6 @@
 
 using namespace boost::spirit;
 using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
 
 namespace fusion = boost::fusion;
 namespace phoenix = boost::phoenix;
@@ -133,13 +133,14 @@
     mini_xml_generator() : mini_xml_generator::base_type(xml)
     {
         node %= 
-                lit[_1 = _string(_r0)] 
-            |   xml[_1 = _xml(_r0)]
+                string  [_1 = _string(_val)] 
+            |   xml     [_1 = _xml(_val)]
             ;
 
-        xml =   char_('<') << lit(at_c<0>(_r0)) << '>'
-            <<  (*node)[_1 = at_c<1>(_r0)]
-            <<  lit("</")  << lit(at_c<0>(_r0)) << '>'
+        xml = 
+                char_('<') << string[_1 = at_c<0>(_val)] << '>'
+            <<               (*node)[_1 = at_c<1>(_val)]
+            <<  lit("</")  << string[_1 = at_c<0>(_val)] << '>'
             ;
     }
 
@@ -185,7 +186,7 @@
 
     std::string::const_iterator iter = storage.begin();
     std::string::const_iterator end = storage.end();
-    bool r = qi::phrase_parse(iter, end, xmlin, ast, space);
+    bool r = qi::phrase_parse(iter, end, xmlin, space, ast);
 
     if (r && iter == end)
     {
@@ -199,7 +200,8 @@
         mini_xml_generator xmlout;                 //  Our grammar definition
 
         std::string generated;
-        bool r = karma::generate(std::back_inserter(generated), xmlout, ast);
+        outiter_type outit(generated);
+        bool r = karma::generate(outit, xmlout, ast);
 
         if (r)
             std::cout << generated << std::endl;
Modified: trunk/libs/spirit/example/karma/quick_start1.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/quick_start1.cpp	(original)
+++ trunk/libs/spirit/example/karma/quick_start1.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -41,15 +41,15 @@
     std::cout << 
         karma::format_delimited(
             *int_,                                // format description
-            v,                                    // data
-            space                                 // delimiter
+            space,                                // delimiter
+            v                                     // data
         ) << std::endl << std::endl;
 
     std::cout << 
         karma::format_delimited(
             '[' << *int_ << ']',                  // format description
-            v,                                    // data
-            space                                 // delimiter
+            space,                                // delimiter
+            v                                     // data
         ) << std::endl << std::endl;
 
     // output the container as a comma separated list
@@ -98,8 +98,8 @@
                 // no delimiting within verbatim
                 *verbatim["  <li>" << int_ << "</li>"]
             << "</ol>",                           // format description
-            v,                                    // data
-            '\n'                                  // delimiter
+            '\n',                                 // delimiter
+            v                                     // data
         ) << std::endl;
 
     // output the container as right aligned column
@@ -109,8 +109,8 @@
            *verbatim[
                 "|" << right_align[int_] << "|"
             ],                                    // format description
-            v,                                    // data
-            '\n'                                  // delimiter
+            '\n',                                 // delimiter
+            v                                     // data
         ) << std::endl;
 
     std::cout << std::endl;
Modified: trunk/libs/spirit/example/lex/Jamfile
==============================================================================
--- trunk/libs/spirit/example/lex/Jamfile	(original)
+++ trunk/libs/spirit/example/lex/Jamfile	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 #==============================================================================
-#   Copyright (c) 2001-2008 Joel de Guzman
-#   Copyright (c) 2001-2008 Hartmut Kaiser
+#   Copyright (c) 2001-2009 Joel de Guzman
+#   Copyright (c) 2001-2009 Hartmut Kaiser
 #
 #   Distributed under the Boost Software License, Version 1.0. (See accompanying
 #   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,16 +8,17 @@
 
 project spirit-lexer-example ;
 
-exe example1             : example1.cpp ;
-exe example2             : example2.cpp ;
-exe example3             : example3.cpp ;
-exe example4             : example4.cpp ;
-exe example5             : example5.cpp ;
-exe example6             : example6.cpp ;
-exe print_numbers        : print_numbers.cpp ;
-exe word_count           : word_count.cpp ;
-exe word_count_functor   : word_count_functor.cpp ;
-exe word_count_lexer     : word_count_lexer.cpp ;
-exe strip_comments       : strip_comments.cpp ;
-exe strip_comments_lexer : strip_comments_lexer.cpp ;
+exe example1                : example1.cpp ;
+exe example2                : example2.cpp ;
+exe example3                : example3.cpp ;
+exe example4                : example4.cpp ;
+exe example5                : example5.cpp ;
+exe example6                : example6.cpp ;
+exe print_numbers           : print_numbers.cpp ;
+exe word_count              : word_count.cpp ;
+exe word_count_functor      : word_count_functor.cpp ;
+exe word_count_lexer        : word_count_lexer.cpp ;
+exe word_count_lexer_flex   : word_count_lexer_flex.cpp ;
+exe strip_comments          : strip_comments.cpp ;
+exe strip_comments_lexer    : strip_comments_lexer.cpp ;
 
Modified: trunk/libs/spirit/example/lex/example1.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/example1.cpp	(original)
+++ trunk/libs/spirit/example/lex/example1.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,14 +1,13 @@
 //  Copyright (c) 2001-2009 Hartmut Kaiser
-//  Copyright (c) 2001-2007 Joel de Guzman
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 //  Simple lexer/parser to test the Spirit installation.
 //
-//  This example shows, how to create a simple lexer recognizing 4 different 
+//  This example shows, how to create a simple lexer recognizing 5 different 
 //  tokens, and how to use a single token definition as the skip parser during 
-//  the parsing. Additionally it demonstrates how to use one of the defined 
+//  the parsing. Additionally, it demonstrates how to use one of the defined 
 //  tokens as a parser component in the grammar.
 //
 //  The grammar recognizes a simple input structure, for instance:
@@ -20,6 +19,8 @@
 //  Any number of simple sentences (optionally comma separated) inside a pair 
 //  of curly braces will be matched.
 
+// #define BOOST_SPIRIT_LEXERTL_DEBUG
+
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
 #include <boost/spirit/include/lex_lexer_lexertl.hpp>
@@ -31,6 +32,7 @@
 #include "example.hpp"
 
 using namespace boost::spirit;
+using namespace boost::spirit::ascii;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
 
@@ -38,21 +40,20 @@
 //  Token definition
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct example1_tokens : lexer_def<Lexer>
+struct example1_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    example1_tokens()
     {
         // define tokens and associate them with the lexer
         identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
-        self = token_def<>(',') | '{' | '}' | identifier;
-        
+        this->self = char_(',') | '{' | '}' | identifier;
+
         // any token definition to be used as the skip parser during parsing 
         // has to be associated with a separate lexer state (here 'WS') 
-        white_space = "[ \\t\\n]+";
-        self("WS") = white_space;
+        this->white_space = "[ \\t\\n]+";
+        this->self("WS") = white_space;
     }
-    
+
     token_def<> identifier, white_space;
 };
 
@@ -78,29 +79,27 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
     // This is the token type to return from the lexer iterator
-    typedef lexertl_token<base_iterator_type> token_type;
-    
+    typedef lexertl::token<base_iterator_type> token_type;
+
     // This is the lexer type to use to tokenize the input.
     // We use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
-    
-    // This is the token definition type (derived from the given lexer type).
-    typedef example1_tokens<lexer_type> example1_tokens;
-    
+    typedef lexertl::lexer<token_type> lexer_type;
+
+    // This is the lexer type (derived from the given lexer type).
+    typedef example1_tokens<lexer_type> example1_lex;
+
     // This is the iterator type exposed by the lexer 
-    typedef lexer<example1_tokens>::iterator_type iterator_type;
+    typedef example1_lex::iterator_type iterator_type;
 
     // This is the type of the grammar to parse
     typedef example1_grammar<iterator_type> example1_grammar;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    example1_tokens tokens;                         // Our token definition
-    example1_grammar calc(tokens);                  // Our grammar definition
-
-    lexer<example1_tokens> lex(tokens);             // Our lexer
+    example1_lex lex;                             // Our lexer
+    example1_grammar calc(lex);                   // Our grammar definition
 
     std::string str (read_from_file("example1.input"));
 
@@ -115,7 +114,7 @@
     // Note, how we use the token_def defined above as the skip parser. It must
     // be explicitly wrapped inside a state directive, switching the lexer 
     // state for the duration of skipping whitespace.
-    bool r = phrase_parse(iter, end, calc, in_state("WS")[tokens.white_space]);
+    bool r = phrase_parse(iter, end, calc, in_state("WS")[lex.white_space]);
 
     if (r && iter == end)
     {
Modified: trunk/libs/spirit/example/lex/example2.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/example2.cpp	(original)
+++ trunk/libs/spirit/example/lex/example2.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,4 @@
 //  Copyright (c) 2001-2009 Hartmut Kaiser
-//  Copyright (c) 2001-2007 Joel de Guzman
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -22,7 +21,7 @@
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 
 #include <iostream>
@@ -32,6 +31,7 @@
 #include "example.hpp"
 
 using namespace boost::spirit;
+using namespace boost::spirit::ascii;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
 using boost::phoenix::ref;
@@ -40,10 +40,9 @@
 //  Token definition
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct example2_tokens : lexer_def<Lexer>
+struct example2_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    example2_tokens()
     {
         //  A 'word' is comprised of one or more letters and an optional 
         //  apostrophe. If it contains an apostrophe, there may only be one and 
@@ -51,11 +50,15 @@
         //  For example, "I'm" and "doesn't" meet the definition of 'word' we 
         //  define below.
         word = "[a-zA-Z]+('[a-zA-Z]+)?";
-        
-        // associate the tokens and the token set with the lexer
+
+        // Associate the tokens and the token set with the lexer. Note that 
+        // single character token definitions as used below always get 
+        // interpreted literally and never as special regex characters. This is
+        // done to be able to assign single characters the id of their character
+        // code value, allowing to reference those as literals in Qi grammars.
         self = token_def<>(',') | '!' | '.' | '?' | ' ' | '\n' | word;
     }
-    
+
     token_def<> word;
 };
 
@@ -67,8 +70,8 @@
 {
     template <typename TokenDef>
     example2_grammar(TokenDef const& tok)
-      : example2_grammar::base_type(story), 
-        paragraphs(0), commands(0), questions(0), statements(0)
+      : example2_grammar::base_type(story)
+      , paragraphs(0), commands(0), questions(0), statements(0)
     {
         story 
             =  +paragraph
@@ -112,38 +115,36 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
     // This is the token type to return from the lexer iterator
-    typedef lexertl_token<base_iterator_type> token_type;
-    
+    typedef lexertl::token<base_iterator_type> token_type;
+
     // This is the lexer type to use to tokenize the input.
     // Here we use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
-    
+    typedef lexertl::lexer<token_type> lexer_type;
+
     // This is the token definition type (derived from the given lexer type).
     typedef example2_tokens<lexer_type> example2_tokens;
-    
+
     // this is the iterator type exposed by the lexer 
-    typedef lexer<example2_tokens>::iterator_type iterator_type;
+    typedef example2_tokens::iterator_type iterator_type;
 
     // this is the type of the grammar to parse
     typedef example2_grammar<iterator_type> example2_grammar;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    example2_tokens tokens;                         // Our token definition
-    example2_grammar calc(tokens);                  // Our grammar definition
-
-    lexer<example2_tokens> lex(tokens);             // Our lexer
+    example2_tokens tokens;                         // Our lexer
+    example2_grammar calc(tokens);                  // Our parser 
 
     std::string str (read_from_file("example2.input"));
 
     // At this point we generate the iterator pair used to expose the
     // tokenized input stream.
     std::string::iterator it = str.begin();
-    iterator_type iter = lex.begin(it, str.end());
-    iterator_type end = lex.end();
-        
+    iterator_type iter = tokens.begin(it, str.end());
+    iterator_type end = tokens.end();
+
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
     bool r = parse(iter, end, calc);
Modified: trunk/libs/spirit/example/lex/example3.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/example3.cpp	(original)
+++ trunk/libs/spirit/example/lex/example3.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,4 @@
 //  Copyright (c) 2001-2009 Hartmut Kaiser
-//  Copyright (c) 2001-2007 Joel de Guzman
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -40,29 +39,28 @@
 //  Token definition
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct example3_tokens : lexer_def<Lexer>
+struct example3_tokens : lexer<Lexer>
 {
     typedef typename Lexer::token_set token_set;
-    
-    template <typename Self>
-    void def (Self& self)
+
+    example3_tokens()
     {
         // define the tokens to match
         ellipses = "\\.\\.\\.";
         number = "[0-9]+";
-        
+
         // define the whitespace to ignore (spaces, tabs, newlines and C-style 
         // comments)
         white_space 
             =   token_def<>("[ \\t\\n]+")               // whitespace
             |   "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/"   // C style comments
             ;
-        
+
         // associate the tokens and the token set with the lexer
-        self = ellipses | '(' | ')' | number;
-        self("WS") = white_space;
+        this->self = ellipses | '(' | ')' | number;
+        this->self("WS") = white_space;
     }
-    
+
     // these tokens expose the iterator_range of the matched input sequence
     token_def<> ellipses, identifier, number;
     token_set white_space;
@@ -108,35 +106,33 @@
     typedef std::string::iterator base_iterator_type;
 
     // This is the token type to return from the lexer iterator
-    typedef lexertl_token<base_iterator_type> token_type;
+    typedef lexertl::token<base_iterator_type> token_type;
 
     // This is the lexer type to use to tokenize the input.
     // Here we use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
+    typedef lexertl::lexer<token_type> lexer_type;
 
     // This is the token definition type (derived from the given lexer type).
     typedef example3_tokens<lexer_type> example3_tokens;
 
     // this is the iterator type exposed by the lexer 
-    typedef lexer<example3_tokens>::iterator_type iterator_type;
+    typedef example3_tokens::iterator_type iterator_type;
 
     // this is the type of the grammar to parse
     typedef example3_grammar<iterator_type, lexer_type> example3_grammar;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    example3_tokens tokens;                         // Our token definition
-    example3_grammar calc(tokens);                  // Our grammar definition
-
-    lexer<example3_tokens> lex(tokens);             // Our lexer
+    example3_tokens tokens;                         // Our lexer
+    example3_grammar calc(tokens);                  // Our parser
 
     std::string str (read_from_file("example3.input"));
 
     // At this point we generate the iterator pair used to expose the
     // tokenized input stream.
     std::string::iterator it = str.begin();
-    iterator_type iter = lex.begin(it, str.end());
-    iterator_type end = lex.end();
+    iterator_type iter = tokens.begin(it, str.end());
+    iterator_type end = tokens.end();
 
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
Modified: trunk/libs/spirit/example/lex/example4.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/example4.cpp	(original)
+++ trunk/libs/spirit/example/lex/example4.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,4 @@
 //  Copyright (c) 2001-2009 Hartmut Kaiser
-//  Copyright (c) 2001-2007 Joel de Guzman
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -24,7 +23,7 @@
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 
 #include <iostream>
@@ -36,7 +35,6 @@
 using namespace boost::spirit;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
-using namespace boost::spirit::arg_names;
 
 using boost::phoenix::val;
 
@@ -44,12 +42,11 @@
 //  Token definition
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct example4_tokens : lexer_def<Lexer>
+struct example4_tokens : lexer<Lexer>
 {
     typedef typename Lexer::token_set token_set;
-    
-    template <typename Self>
-    void def (Self& self)
+
+    example4_tokens()
     {
         // define the tokens to match
         identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
@@ -57,29 +54,29 @@
         if_ = "if";
         else_ = "else";
         while_ = "while";
-        
+
         // define the whitespace to ignore (spaces, tabs, newlines and C-style 
         // comments)
         white_space 
             =   token_def<>("[ \\t\\n]+") 
             |   "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/"
             ;
-        
+
         // associate the tokens and the token set with the lexer
-        self = token_def<>('(') | ')' | '{' | '}' | '=' | ';' | constant;
-        self += if_ | else_ | while_ | identifier;
-        self("WS") = white_space;
+        this->self = token_def<>('(') | ')' | '{' | '}' | '=' | ';' | constant;
+        this->self += if_ | else_ | while_ | identifier;
+        this->self("WS") = white_space;
     }
 
 //[example4_token_def
     // these tokens expose the iterator_range of the matched input sequence
     token_def<> if_, else_, while_;
-    
+
     // The following two tokens have an associated value type, 'identifier'
     // carries a string (the identifier name) and 'constant' carries the 
     // matched integer value.
     //
-    // Note: any token value type specified explicitly during a token_def<>
+    // Note: any token attribute type explicitly specified in a token_def<>
     //       declaration needs to be listed during token type definition as 
     //       well (see the typedef for the token_type below).
     //
@@ -87,7 +84,7 @@
     // once (on first access), which makes token values as efficient as 
     // possible. Moreover, token instances are constructed once by the lexer
     // library. From this point on tokens are passed by reference only, 
-    // avoiding tokens being copied around.
+    // avoiding them being copied around.
     token_def<std::string> identifier;
     token_def<unsigned int> constant;
 //]
@@ -155,11 +152,11 @@
 
     typedef typename Lexer::token_set token_set;
     typedef boost::variant<unsigned int, std::string> expression_type;
-    
+
     rule<Iterator, in_state_skipper<token_set> > program, block, statement;
     rule<Iterator, in_state_skipper<token_set> > assignment, if_stmt;
     rule<Iterator, in_state_skipper<token_set> > while_stmt;
-    
+
     //  the expression is the only rule having a return value
     rule<Iterator, expression_type(), in_state_skipper<token_set> >  expression;
 };
@@ -169,7 +166,7 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
 //[example4_token
     // This is the lexer token type to use. The second template parameter lists 
     // all attribute types used for token_def's during token definition (see 
@@ -184,36 +181,34 @@
     // least one token value type you'll have to list all value types used  
     // for token_def<> declarations in the token definition class above,  
     // otherwise compilation errors will occur.
-    typedef lexertl_token<
+    typedef lexertl::token<
         base_iterator_type, boost::mpl::vector<unsigned int, std::string> 
     > token_type;
 //]
     // Here we use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
-    
+    typedef lexertl::lexer<token_type> lexer_type;
+
     // This is the token definition type (derived from the given lexer type).
     typedef example4_tokens<lexer_type> example4_tokens;
-    
+
     // this is the iterator type exposed by the lexer 
-    typedef lexer<example4_tokens>::iterator_type iterator_type;
+    typedef example4_tokens::iterator_type iterator_type;
 
     // this is the type of the grammar to parse
     typedef example4_grammar<iterator_type, lexer_type> example4_grammar;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    example4_tokens tokens;                         // Our token definition
-    example4_grammar calc(tokens);                  // Our grammar definition
-
-    lexer<example4_tokens> lex(tokens);                 // Our lexer
+    example4_tokens tokens;                         // Our lexer
+    example4_grammar calc(tokens);                  // Our parser
 
     std::string str (read_from_file("example4.input"));
 
     // At this point we generate the iterator pair used to expose the
     // tokenized input stream.
     std::string::iterator it = str.begin();
-    iterator_type iter = lex.begin(it, str.end());
-    iterator_type end = lex.end();
+    iterator_type iter = tokens.begin(it, str.end());
+    iterator_type end = tokens.end();
         
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
Modified: trunk/libs/spirit/example/lex/example5.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/example5.cpp	(original)
+++ trunk/libs/spirit/example/lex/example5.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,4 @@
 //  Copyright (c) 2001-2009 Hartmut Kaiser
-//  Copyright (c) 2001-2007 Joel de Guzman
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,7 +12,7 @@
 //  as the skip parser during parsing, allowing to define several tokens to be 
 //  ignored.
 //
-//  The main purpose of this example is to show, how inheritance can be used to 
+//  The main purpose of this example is to show how inheritance can be used to 
 //  overload parts of a base grammar and add token definitions to a base lexer.
 //
 //  Further, it shows how you can use the 'omitted' attribute type specifier 
@@ -38,7 +37,6 @@
 using namespace boost::spirit;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
-using namespace boost::spirit::arg_names;
 
 using boost::phoenix::val;
 
@@ -46,40 +44,44 @@
 //  Token definition base, defines all tokens for the base grammar below
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct example5_base_tokens : lexer_def<Lexer>
+struct example5_base_tokens : lexer<Lexer>
 {
     typedef typename Lexer::token_set token_set;
-    
-    template <typename Self>
-    void def (Self& self)
+
+protected:
+    // this lexer is supposed to be used as a base type only
+    example5_base_tokens() {}
+
+public:
+    void init_token_definitions()
     {
         // define the tokens to match
         identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
         constant = "[0-9]+";
         if_ = "if";
         while_ = "while";
-        
+
         // define the whitespace to ignore (spaces, tabs, newlines and C-style 
         // comments)
         white_space 
             =   token_def<>("[ \\t\\n]+") 
             |   "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/"
             ;
-        
+
         // associate the tokens and the token set with the lexer
-        self += token_def<>('(') | ')' | '{' | '}' | '=' | ';' | constant;
-        self += if_ | while_ | identifier;
-        self("WS") = white_space;
+        this->self += token_def<>('(') | ')' | '{' | '}' | '=' | ';' | constant;
+        this->self += if_ | while_ | identifier;
+        this->self("WS") = white_space;
     }
-    
-    // these tokens have no value
+
+    // these tokens have no attribute
     token_def<omitted> if_, while_;
-    
-    // The following two tokens have an associated value type, identifier 
-    // carries a string (the identifier name) and constant carries the matched 
-    // integer value.
+
+    // The following two tokens have an associated attribute type, 'identifier'
+    // carries a string (the identifier name) and 'constant' carries the 
+    // matched integer value.
     //
-    // Note: any explicitly token value type specified during a token_def<>
+    // Note: any token attribute type explicitly specified in a token_def<>
     //       declaration needs to be listed during token type definition as 
     //       well (see the typedef for the token_type below).
     //
@@ -87,7 +89,7 @@
     // once (on first access), which makes token values as efficient as 
     // possible. Moreover, token instances are constructed once by the lexer
     // library. From this point on tokens are passed by reference only, 
-    // avoiding tokens being copied around.
+    // avoiding them being copied around.
     token_def<std::string> identifier;
     token_def<unsigned int> constant;
 
@@ -150,15 +152,12 @@
             ;
     }
 
-    typedef 
-        grammar<Iterator, in_state_skipper<typename Lexer::token_set> > 
-    base_type;
-    typedef typename base_type::skipper_type skipper_type;
-    
+    typedef in_state_skipper<typename Lexer::token_set> skipper_type;
+
     rule<Iterator, skipper_type> program, block, statement;
     rule<Iterator, skipper_type> assignment, if_stmt;
     rule<Iterator, skipper_type> while_stmt;
-    
+
     //  the expression is the only rule having a return value
     typedef boost::variant<unsigned int, std::string> expression_type;
     rule<Iterator, expression_type(), skipper_type>  expression;
@@ -170,23 +169,23 @@
 template <typename Lexer>
 struct example5_tokens : example5_base_tokens<Lexer>
 {
+    typedef example5_base_tokens<Lexer> base_type;
     typedef typename Lexer::token_set token_set;
-    
-    template <typename Self>
-    void def (Self& self)
+
+    example5_tokens()
     {
         // define the additional token to match
         else_ = "else";
-        
+
         // associate the new token with the lexer, note we add 'else' before 
         // anything else to add it to the token set before the identifier 
         // token, otherwise "else" would be matched as an identifier
-        self = else_;
-        
-        // call the base class definition function
-        example5_base_tokens<Lexer>::def(self);
+        this->self = else_;
+
+        // now add the token definitions from the base class
+        this->base_type::init_token_definitions();
     }
-    
+
     // this token has no value
     token_def<omitted> else_;
 };
@@ -213,10 +212,10 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
     // This is the lexer token type to use. The second template parameter lists 
     // all attribute types used for token_def's during token definition (see 
-    // calculator_tokens<> above). Here we use the predefined lexertl token 
+    // example5_base_tokens<> above). Here we use the predefined lexertl token 
     // type, but any compatible token type may be used instead.
     //
     // If you don't list any token value types in the following declaration 
@@ -227,36 +226,34 @@
     // least one token value type you'll have to list all value types used  
     // for token_def<> declarations in the token definition class above,  
     // otherwise compilation errors will occur.
-    typedef lexertl_token<
+    typedef lexertl::token<
         base_iterator_type, boost::mpl::vector<unsigned int, std::string> 
     > token_type;
-    
+
     // Here we use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
-    
+    typedef lexertl::lexer<token_type> lexer_type;
+
     // This is the token definition type (derived from the given lexer type).
     typedef example5_tokens<lexer_type> example5_tokens;
-    
+
     // this is the iterator type exposed by the lexer 
-    typedef lexer<example5_tokens>::iterator_type iterator_type;
+    typedef example5_tokens::iterator_type iterator_type;
 
     // this is the type of the grammar to parse
     typedef example5_grammar<iterator_type, lexer_type> example5_grammar;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    example5_tokens tokens;                         // Our token definition
-    example5_grammar calc(tokens);                  // Our grammar definition
-
-    lexer<example5_tokens> lex(tokens);                 // Our lexer
+    example5_tokens tokens;                         // Our lexer
+    example5_grammar calc(tokens);                  // Our parser
 
     std::string str (read_from_file("example5.input"));
 
     // At this point we generate the iterator pair used to expose the
     // tokenized input stream.
     std::string::iterator it = str.begin();
-    iterator_type iter = lex.begin(it, str.end());
-    iterator_type end = lex.end();
+    iterator_type iter = tokens.begin(it, str.end());
+    iterator_type end = tokens.end();
         
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
Modified: trunk/libs/spirit/example/lex/example6.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/example6.cpp	(original)
+++ trunk/libs/spirit/example/lex/example6.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,4 @@
 //  Copyright (c) 2001-2009 Hartmut Kaiser
-//  Copyright (c) 2001-2007 Joel de Guzman
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -40,7 +39,6 @@
 using namespace boost::spirit;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
-using namespace boost::spirit::arg_names;
 
 using boost::phoenix::val;
 
@@ -60,27 +58,26 @@
 //  Token definitions
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct example6_tokens : lexer_def<Lexer>
+struct example6_tokens : lexer<Lexer>
 {
     typedef typename Lexer::token_set token_set;
-    
-    template <typename Self>
-    void def (Self& self)
+
+    example6_tokens()
     {
         // define the tokens to match
         identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
         constant = "[0-9]+";
-        
+
         // define the whitespace to ignore (spaces, tabs, newlines and C-style 
         // comments)
         white_space 
             =   token_def<>("[ \\t\\n]+") 
             |   "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/"
             ;
-        
+
         // associate the tokens and the token set with the lexer
         self = token_def<>('(') | ')' | '{' | '}' | '=' | ';';
-        
+
         // Token definitions can be added by using some special syntactic 
         // construct as shown below.
         // Note, that the token definitions added this way expose the iterator
@@ -92,16 +89,16 @@
             ("while", ID_WHILE)
             (identifier, ID_IDENTIFIER)
         ;
-        
+
         // add whitespace tokens to another lexer state (here: "WS")
         self("WS") = white_space;
     }
-    
+
     // The following two tokens have an associated value type, identifier 
     // carries a string (the identifier name) and constant carries the matched 
     // integer value.
     //
-    // Note: any explicitly token value type specified during a token_def<>
+    // Note: any token attribute type explicitly specified in a token_def<>
     //       declaration needs to be listed during token type definition as 
     //       well (see the typedef for the token_type below).
     //
@@ -109,7 +106,7 @@
     // once (on first access), which makes token values as efficient as 
     // possible. Moreover, token instances are constructed once by the lexer
     // library. From this point on tokens are passed by reference only, 
-    // avoiding tokens being copied around.
+    // avoiding them being copied around.
     token_def<std::string> identifier;
     token_def<unsigned int> constant;
 
@@ -179,11 +176,11 @@
 
     typedef typename Lexer::token_set token_set;
     typedef boost::variant<unsigned int, std::string> expression_type;
-    
+
     rule<Iterator, in_state_skipper<token_set> > program, block, statement;
     rule<Iterator, in_state_skipper<token_set> > assignment, if_stmt;
     rule<Iterator, in_state_skipper<token_set> > while_stmt;
-    
+
     //  the expression is the only rule having a return value
     rule<Iterator, expression_type(), in_state_skipper<token_set> >  expression;
 };
@@ -193,7 +190,7 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
     // This is the lexer token type to use. The second template parameter lists 
     // all attribute types used for token_def's during token definition (see 
     // calculator_tokens<> above). Here we use the predefined lexertl token 
@@ -207,37 +204,35 @@
     // least one token value type you'll have to list all value types used  
     // for token_def<> declarations in the token definition class above,  
     // otherwise compilation errors will occur.
-    typedef lexertl_token<
+    typedef lexertl::token<
         base_iterator_type, boost::mpl::vector<unsigned int, std::string> 
     > token_type;
-    
+
     // Here we use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
-    
+    typedef lexertl::lexer<token_type> lexer_type;
+
     // This is the token definition type (derived from the given lexer type).
     typedef example6_tokens<lexer_type> example6_tokens;
-    
+
     // this is the iterator type exposed by the lexer 
-    typedef lexer<example6_tokens>::iterator_type iterator_type;
+    typedef example6_tokens::iterator_type iterator_type;
 
     // this is the type of the grammar to parse
     typedef example6_grammar<iterator_type, lexer_type> example6_grammar;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    example6_tokens tokens;                         // Our token definition
-    example6_grammar calc(tokens);                  // Our grammar definition
-
-    lexer<example6_tokens> lex(tokens);                 // Our lexer
+    example6_tokens tokens;                         // Our lexer
+    example6_grammar calc(tokens);                  // Our parser
 
     std::string str (read_from_file("example6.input"));
 
     // At this point we generate the iterator pair used to expose the
     // tokenized input stream.
     std::string::iterator it = str.begin();
-    iterator_type iter = lex.begin(it, str.end());
-    iterator_type end = lex.end();
-        
+    iterator_type iter = tokens.begin(it, str.end());
+    iterator_type end = tokens.end();
+
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
     // Note, how we use the token_def defined above as the skip parser. It must
Modified: trunk/libs/spirit/example/lex/print_numbers.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/print_numbers.cpp	(original)
+++ trunk/libs/spirit/example/lex/print_numbers.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -32,20 +32,21 @@
 using namespace boost::spirit;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
-using namespace boost::spirit::arg_names;
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Token definition: We use the lexertl based lexer engine as the underlying 
 //                    lexer type.
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct print_numbers_tokens : lexer_def<Lexer>
+struct print_numbers_tokens : lexer<Lexer>
 {
-    // define tokens and associate it with the lexer
-    template <typename Self>
-    void def (Self& self)
+    // define tokens and associate it with the lexer, we set the lexer flags
+    // not to match newlines while matching a dot, so we need to add the
+    // '\n' explicitly below
+    print_numbers_tokens()
+      : print_numbers_tokens::base_type(match_flags::match_not_dot_newline)
     {
-        self = token_def<int>("[0-9]*") | ".|\n";
+        this->self = token_def<int>("[0-9]*") | ".|\n";
     }
 };
 
@@ -56,8 +57,11 @@
 struct print_numbers_grammar : grammar<Iterator>
 {
     print_numbers_grammar()
-      : grammar<Iterator>(start)
+      : print_numbers_grammar::base_type(start)
     {
+        // we just know, that the token ids get assigned starting min_token_id
+        // so, "[0-9]*" gets the id 'min_token_id' and ".|\n" gets the id
+        // 'min_token_id+1'.
         start =  *(   token(lex::min_token_id)  [ std::cout << _1  << "\n" ] 
                   |   token(lex::min_token_id+1)
                   )
@@ -75,29 +79,25 @@
 
     // the token type to be used, 'int' is available as the type of the token 
     // value and no lexer state is supported
-    typedef lexertl_token<
-        base_iterator_type, boost::mpl::vector<int>, boost::mpl::false_
-    > token_type;
-    
+    typedef lexertl::token<base_iterator_type, boost::mpl::vector<int>
+      , boost::mpl::false_> token_type;
+
     // lexer type
-    typedef lexertl_lexer<token_type> lexer_type;
-    
+    typedef lexertl::lexer<token_type> lexer_type;
+
     // iterator type exposed by the lexer 
-    typedef 
-        lexer_iterator<print_numbers_tokens<lexer_type> >::type 
-    iterator_type;
+    typedef print_numbers_tokens<lexer_type>::iterator_type iterator_type;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    print_numbers_tokens<lexer_type> print_tokens;    // Our token definition
-    print_numbers_grammar<iterator_type> print;       // Our grammar definition
+    print_numbers_tokens<lexer_type> print_tokens;    // Our lexer
+    print_numbers_grammar<iterator_type> print;       // Our parser 
 
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
     std::string str (read_from_file(1 == argc ? "print_numbers.input" : argv[1]));
     base_iterator_type first = str.begin();
-    bool r = tokenize_and_parse(first, str.end(), make_lexer(print_tokens), 
-        print);
+    bool r = tokenize_and_parse(first, str.end(), print_tokens, print);
 
     if (r) {
         std::cout << "-------------------------\n";
Modified: trunk/libs/spirit/example/lex/static_lexer/Jamfile
==============================================================================
--- trunk/libs/spirit/example/lex/static_lexer/Jamfile	(original)
+++ trunk/libs/spirit/example/lex/static_lexer/Jamfile	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,5 @@
 #==============================================================================
-#   Copyright (c) 2001-2007 Joel de Guzman
-#   Copyright (c) 2001-2008 Hartmut Kaiser
+#   Copyright (c) 2001-2009 Hartmut Kaiser
 #
 #   Distributed under the Boost Software License, Version 1.0. (See accompanying
 #   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/lex/static_lexer/word_count_generate.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/static_lexer/word_count_generate.cpp	(original)
+++ trunk/libs/spirit/example/lex/static_lexer/word_count_generate.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -14,8 +14,8 @@
 // #define BOOST_SPIRIT_LEXERTL_DEBUG
 
 #include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
-#include <boost/spirit/home/lex/lexer/lexertl/lexertl_generate_static.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
+#include <boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>
 
 #include <fstream>
 
@@ -29,7 +29,7 @@
 int main(int argc, char* argv[])
 {
     // create the lexer object instance needed to invoke the generator
-    word_count_tokens<lexertl_lexer<> > word_count; // the token definition
+    word_count_tokens<lexertl::lexer<> > word_count; // the token definition
 
     // open the output file, where the generated tokenizer function will be 
     // written to
@@ -38,6 +38,6 @@
     // invoke the generator, passing the token definition, the output stream 
     // and the name prefix of the tokenizing function to be generated
     char const* function_name = (argc < 3 ? "" : argv[2]);
-    return generate_static(make_lexer(word_count), out, function_name) ? 0 : -1;
+    return lexertl::generate_static(word_count, out, function_name) ? 0 : -1;
 }
 //]
Modified: trunk/libs/spirit/example/lex/static_lexer/word_count_static.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/static_lexer/word_count_static.cpp	(original)
+++ trunk/libs/spirit/example/lex/static_lexer/word_count_static.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -17,7 +17,7 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
 //[wc_static_include
-#include <boost/spirit/include/lex_lexer_static_lexertl.hpp>
+#include <boost/spirit/include/lex_static_lexertl.hpp>
 //]
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
@@ -27,11 +27,12 @@
 #include <string>
 
 #include "../example.hpp"
-#include "word_count_tokens.hpp"    // token definition
+#include "word_count_tokens.hpp"          // token definition
 
-#include "word_count_static.hpp"    // generated tokenizer
+#include "word_count_static.hpp"          // generated tokenizer
 
 using namespace boost::spirit;
+using namespace boost::spirit::ascii;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
 
@@ -48,17 +49,17 @@
 {
     template <typename TokenDef>
     word_count_grammar(TokenDef const& tok)
-      : grammar<Iterator>(start), c(0), w(0), l(0)
+      : word_count_grammar::base_type(start)
+      , c(0), w(0), l(0)
     {
-        using boost::spirit::arg_names::_1;
         using boost::phoenix::ref;
         using boost::phoenix::size;
-        
+
         //  associate the defined tokens with the lexer, at the same time 
         //  defining the actions to be executed 
-        start =  *(   tok.word      [++ref(w), ref(c) += size(_1)]
-                  |   char_('\n')   [++ref(l), ++ref(c)] 
-                  |   token(IDANY)  [++ref(c)]
+        start =  *(   tok.word      [ ++ref(w), ref(c) += size(_1) ]
+                  |   char_('\n')   [ ++ref(l), ++ref(c) ] 
+                  |   token(IDANY)  [ ++ref(c) ]
                   )
               ;
     }
@@ -74,7 +75,7 @@
 {
     // Define the token type to be used: 'std::string' is available as the type 
     // of the token value.
-    typedef lexertl_token<
+    typedef lexertl::token<
         char const*, boost::mpl::vector<std::string>
     > token_type;
 
@@ -82,26 +83,25 @@
     // definition.
     //
     // This is the only place where the code is different from an equivalent
-    // dynamic lexical analyzer. We use the `lexertl_static_lexer<>` instead of
-    // the `lexertl_lexer<>` as the base class for our token defintion type.
-    //
-    typedef lexertl_static_lexer<token_type> lexer_type;
-    
+    // dynamic lexical analyzer. We use the `lexertl::static_lexer<>` instead of
+    // the `lexertl::lexer<>` as the base class for our token defintion type.
+    typedef lexertl::static_lexer<token_type> lexer_type;
+
     // Define the iterator type exposed by the lexer.
-    typedef lexer_iterator<word_count_tokens<lexer_type> >::type iterator_type;
+    typedef word_count_tokens<lexer_type>::iterator_type iterator_type;
 
     // Now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process.
-    word_count_tokens<lexer_type> word_count;           // Our token definition
-    word_count_grammar<iterator_type> g (word_count);   // Our grammar definition
+    word_count_tokens<lexer_type> word_count;           // Our lexer
+    word_count_grammar<iterator_type> g (word_count);   // Our parser
 
     // Read in the file into memory.
     std::string str (read_from_file(1 == argc ? "word_count.input" : argv[1]));
     char const* first = str.c_str();
     char const* last = &first[str.size()];
-    
+
     // Parsing is done based on the the token stream, not the character stream.
-    bool r = tokenize_and_parse(first, last, make_lexer(word_count), g);
+    bool r = tokenize_and_parse(first, last, word_count, g);
 
     if (r) {    // success
         std::cout << "lines: " << g.l << ", words: " << g.w 
Modified: trunk/libs/spirit/example/lex/static_lexer/word_count_static.hpp
==============================================================================
--- trunk/libs/spirit/example/lex/static_lexer/word_count_static.hpp	(original)
+++ trunk/libs/spirit/example/lex/static_lexer/word_count_static.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,18 +1,20 @@
-// Copyright (c) 2008 Ben Hanson
+// Copyright (c) 2008-2009 Ben Hanson
+// Copyright (c) 2008-2009 Hartmut Kaiser
 //
 // Distributed under the Boost Software License, Version 1.0. (See accompanying
 // file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
-// Auto-generated by boost::lexer
-#if !defined(BOOST_SPIRIT_LEXER_NEXT_TOKEN_Apr_20_2008_17_34_03)
-#define BOOST_SPIRIT_LEXER_NEXT_TOKEN_Apr_20_2008_17_34_03
+// Auto-generated by boost::lexer, do not edit
+
+#if !defined(BOOST_SPIRIT_LEXER_NEXT_TOKEN_APR_23_2009_12_12_57)
+#define BOOST_SPIRIT_LEXER_NEXT_TOKEN_APR_23_2009_12_12_57
 
 #include <boost/detail/iterator.hpp>
 #include <boost/spirit/home/support/detail/lexer/char_traits.hpp>
 
 // the generated table of state names and the tokenizer have to be
 // defined in the boost::spirit::lex::static namespace
-namespace boost { namespace spirit { namespace lex { namespace static_ {
+namespace boost { namespace spirit { namespace lex { namespace lexertl { namespace static_ {
 
 // this table defines the names of the lexer states
 char const* const lexer_state_names[1] = 
@@ -27,43 +29,43 @@
     enum {end_state_index, id_index, state_index, bol_index, eol_index,
         dead_state_index, dfa_offset};
     static const std::size_t npos = static_cast<std::size_t>(~0);
-    static const std::size_t lookup_[256] = {8, 8, 8, 8, 8, 8, 8, 8,
-        8, 7, 6, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        7, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8,
-        8, 8, 8, 8, 8, 8, 8, 8};
+    static const std::size_t lookup_[256] = {7, 7, 7, 7, 7, 7, 7, 7,
+        7, 8, 6, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        8, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7,
+        7, 7, 7, 7, 7, 7, 7, 7};
     static const std::size_t dfa_alphabet_ = 9;
     static const std::size_t dfa_[45] = {0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 3,
-        4, 2, 1, 65536, 0, 0, 0, 0,
-        0, 0, 2, 1, 10, 0, 0, 0,
+        2, 4, 1, 65536, 0, 0, 0, 0,
+        0, 2, 0, 1, 10, 0, 0, 0,
         0, 0, 0, 0, 1, 65537, 0, 0,
         0, 0, 0, 0, 0};
 
@@ -79,7 +81,7 @@
     {
         std::size_t const state_ =
             ptr_[lookup_[static_cast<unsigned char>
-            (*curr_++)]];
+                (*curr_++)]];
 
         if (state_ == 0) break;
 
@@ -106,6 +108,6 @@
     return id_;
 }
 
-}}}}  // namespace boost::spirit::lex::static_
+}}}}}  // namespace boost::spirit::lex::lexertl::static_
 
 #endif
Modified: trunk/libs/spirit/example/lex/static_lexer/word_count_tokens.hpp
==============================================================================
--- trunk/libs/spirit/example/lex/static_lexer/word_count_tokens.hpp	(original)
+++ trunk/libs/spirit/example/lex/static_lexer/word_count_tokens.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -23,16 +23,17 @@
 // possible use cases: a dynamic lexical analyzer, a code generator, and a
 // static lexical analyzer.
 template <typename BaseLexer>
-struct word_count_tokens : boost::spirit::lex::lexer_def<BaseLexer> 
+struct word_count_tokens : boost::spirit::lex::lexer<BaseLexer> 
 {
-    template <typename Self>
-    void def (Self& self)
+    word_count_tokens()
+      : word_count_tokens::base_type(
+          boost::spirit::lex::match_flags::match_not_dot_newline)
     {
         // define tokens and associate them with the lexer
         word = "[^ \t\n]+";
-        self = word | '\n' | token_def<>(".", IDANY);
+        this->self = word | '\n' | token_def<>(".", IDANY);
     }
-    
+
     boost::spirit::lex::token_def<std::string> word;
 };
 //]
Modified: trunk/libs/spirit/example/lex/strip_comments.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/strip_comments.cpp	(original)
+++ trunk/libs/spirit/example/lex/strip_comments.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -47,7 +47,6 @@
 using namespace boost::spirit;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
-using namespace boost::spirit::arg_names;
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Token definition: We use the lexertl based lexer engine as the underlying 
@@ -59,35 +58,35 @@
 };
 
 template <typename Lexer>
-struct strip_comments_tokens : lexer_def<Lexer>
+struct strip_comments_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    strip_comments_tokens() 
+      : strip_comments_tokens::base_type(match_flags::match_default)
     {
         // define tokens and associate them with the lexer
         cppcomment = "//[^\n]*";
         ccomment = "/\\*";
         endcomment = "\\*/";
-        
+
         // The following tokens are associated with the default lexer state 
         // (the "INITIAL" state). Specifying 'INITIAL' as a lexer state is 
         // strictly optional.
-        self.add
+        this->self.add
             (cppcomment)    // no explicit token id is associated
             (ccomment)
             (".", IDANY)    // IDANY is the token id associated with this token 
                             // definition
         ;
-        
+
         // The following tokens are associated with the lexer state "COMMENT".
         // We switch lexer states from inside the parsing process using the 
         // in_state("COMMENT")[] parser component as shown below.
-        self("COMMENT").add
+        this->self("COMMENT").add
             (endcomment)
             (".", IDANY)
         ;
     }
-    
+
     token_def<> cppcomment, ccomment, endcomment;
 };
 
@@ -99,7 +98,7 @@
 {
     template <typename TokenDef>
     strip_comments_grammar(TokenDef const& tok)
-      : grammar<Iterator>(start)
+      : strip_comments_grammar::base_type(start)
     {
         // The in_state("COMMENT")[...] parser component switches the lexer 
         // state to be 'COMMENT' during the matching of the embedded parser.
@@ -124,26 +123,24 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
     // lexer type
-    typedef lexertl_lexer<lexertl_token<base_iterator_type> > lexer_type;
-    
+    typedef lexertl::lexer<lexertl::token<base_iterator_type> > lexer_type;
+
     // iterator type exposed by the lexer 
-    typedef 
-        lexer_iterator<strip_comments_tokens<lexer_type> >::type 
-    iterator_type;
+    typedef strip_comments_tokens<lexer_type>::iterator_type iterator_type;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    strip_comments_tokens<lexer_type> strip_comments;           // Our token definition
-    strip_comments_grammar<iterator_type> g (strip_comments);   // Our grammar definition
+    strip_comments_tokens<lexer_type> strip_comments;           // Our lexer
+    strip_comments_grammar<iterator_type> g (strip_comments);   // Our parser 
 
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
     std::string str (read_from_file(1 == argc ? "strip_comments.input" : argv[1]));
     base_iterator_type first = str.begin();
 
-    bool r = tokenize_and_parse(first, str.end(), make_lexer(strip_comments), g);
+    bool r = tokenize_and_parse(first, str.end(), strip_comments, g);
 
     if (r) {
         std::cout << "-------------------------\n";
Modified: trunk/libs/spirit/example/lex/strip_comments.input
==============================================================================
--- trunk/libs/spirit/example/lex/strip_comments.input	(original)
+++ trunk/libs/spirit/example/lex/strip_comments.input	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,4 +1,4 @@
-//  Copyright (c) 2001-2007 Hartmut Kaiser
+//  Copyright (c) 2001-2009 Hartmut Kaiser
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -27,13 +27,17 @@
 //       }
 //
 //  Its purpose is to strip comments out of C code.
+//
+//  Additionally this example demonstrates the use of lexer states to structure
+//  the lexer definition.
 
 // #define BOOST_SPIRIT_LEXERTL_DEBUG
 
-#include <boost/spirit/qi.hpp>
-#include <boost/spirit/lex/lexer_lexertl.hpp>
-#include <boost/spirit/phoenix/operator.hpp>
-#include <boost/spirit/phoenix/container.hpp>
+#include <boost/config/warning_disable.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_container.hpp>
 
 #include <iostream>
 #include <string>
@@ -43,39 +47,45 @@
 using namespace boost::spirit;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
-using namespace boost::spirit::arg_names;
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Token definition: We use the lexertl based lexer engine as the underlying 
 //                    lexer type.
 ///////////////////////////////////////////////////////////////////////////////
-enum {
+enum tokenids 
+{
     IDANY = lex::min_token_id + 10
 };
 
-template <typename BaseIterator>
-struct strip_comments_tokens : lexer_def<lexertl_lexer<BaseIterator> >
+template <typename Lexer>
+struct strip_comments_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    strip_comments_tokens()
     {
         // define tokens and associate them with the lexer
-        cppcomment = "//.*\n";
+        cppcomment = "//[^\n]*";
         ccomment = "/\\*";
         endcomment = "\\*/";
-        
-        self.add
-            (cppcomment)
+
+        // The following tokens are associated with the default lexer state 
+        // (the "INITIAL" state). Specifying 'INITIAL' as a lexer state is 
+        // strictly optional.
+        this->self.add
+            (cppcomment)    // no explicit token id is associated
             (ccomment)
-            (".", IDANY)
+            (".", IDANY)    // IDANY is the token id associated with this token 
+                            // definition
         ;
-        
-        self("COMMENT").add
+
+        // The following tokens are associated with the lexer state "COMMENT".
+        // We switch lexer states from inside the parsing process using the 
+        // in_state("COMMENT")[] parser component as shown below.
+        this->self("COMMENT").add
             (endcomment)
             (".", IDANY)
         ;
     }
-    
+
     token_def<> cppcomment, ccomment, endcomment;
 };
 
@@ -83,16 +93,23 @@
 //  Grammar definition
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Iterator>
-struct strip_comments_grammar : grammar_def<Iterator>
+struct strip_comments_grammar : grammar<Iterator>
 {
     template <typename TokenDef>
     strip_comments_grammar(TokenDef const& tok)
+      : strip_comments_grammar::base_type(start)
     {
+        // The in_state("COMMENT")[...] parser component switches the lexer 
+        // state to be 'COMMENT' during the matching of the embedded parser.
         start =  *(   tok.ccomment 
                       >>  in_state("COMMENT") 
-                          [ *token(IDANY) >> tok.endcomment ]
+                          [
+                              // the lexer is in the 'COMMENT' state during
+                              // matching of the following parser components
+                              *token(IDANY) >> tok.endcomment 
+                          ]
                   |   tok.cppcomment
-                  |   token(IDANY)
+                  |   token(IDANY)   [ std::cout << _1 ]
                   )
               ;
     }
@@ -104,24 +121,25 @@
 int main(int argc, char* argv[])
 {
     // iterator type used to expose the underlying input stream
-    typedef std::string::const_iterator base_iterator_type;
-    
+    typedef std::string::iterator base_iterator_type;
+
+    // lexer type
+    typedef lexertl::lexer<lexertl::token<base_iterator_type> > lexer_type;
+
     // iterator type exposed by the lexer 
-    typedef 
-        lexer_iterator<strip_comments_tokens<base_iterator_type> >::type 
-    iterator_type;
+    typedef strip_comments_tokens<lexer_type>::iterator_type iterator_type;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    strip_comments_tokens<base_iterator_type> strip_comments;    // Our token definition
-    strip_comments_grammar<iterator_type> def (strip_comments);  // Our grammar definition
+    strip_comments_tokens<lexer_type> strip_comments;           // Our lexer
+    strip_comments_grammar<iterator_type> g (strip_comments);   // Our grammar 
 
     // Parsing is done based on the the token stream, not the character 
     // stream read from the input.
     std::string str (read_from_file(1 == argc ? "strip_comments.input" : argv[1]));
     base_iterator_type first = str.begin();
-    base_iterator_type end = str.end();
-    bool r = lex_and_parse(first, end, strip_comments, make_grammar(def));
+
+    bool r = tokenize_and_parse(first, str.end(), strip_comments, g);
 
     if (r) {
         std::cout << "-------------------------\n";
@@ -129,7 +147,7 @@
         std::cout << "-------------------------\n";
     }
     else {
-        std::string rest(first, end);
+        std::string rest(first, str.end());
         std::cout << "-------------------------\n";
         std::cout << "Parsing failed\n";
         std::cout << "stopped at: \"" << rest << "\"\n";
Modified: trunk/libs/spirit/example/lex/strip_comments_lexer.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/strip_comments_lexer.cpp	(original)
+++ trunk/libs/spirit/example/lex/strip_comments_lexer.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -34,7 +34,7 @@
 // #define BOOST_SPIRIT_LEXERTL_DEBUG
 
 #include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
@@ -57,11 +57,56 @@
     IDEOL = lex::min_token_id + 11
 };
 
+///////////////////////////////////////////////////////////////////////////////
+// Simple custom semantic action function object used to print the matched
+// input sequence for a particular token
+template <typename Char, typename Traits>
+struct echo_input_functor
+{
+    echo_input_functor (std::basic_ostream<Char, Traits>& os_)
+      : os(os_) {}
+
+    // This is called by the semantic action handling code during the lexing
+    template <typename Range, typename LexerContext>
+    void operator()(Range const& r, std::size_t, bool&, LexerContext&) const
+    {
+        os << r;
+    }
+
+    std::basic_ostream<Char, Traits>& os;
+};
+
+template <typename Char, typename Traits>
+inline echo_input_functor<Char, Traits> 
+echo_input(std::basic_ostream<Char, Traits>& os)
+{
+    return echo_input_functor<Char, Traits>(os);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Another simple custom semantic action function object used to switch the 
+// state of the lexer 
+struct set_lexer_state
+{
+    set_lexer_state(char const* state_)
+      : state(state_) {}
+
+    // This is called by the semantic action handling code during the lexing
+    template <typename Range, typename LexerContext>
+    void operator()(Range const&, std::size_t, bool&, LexerContext& ctx) const
+    {
+        ctx.set_state_name(state.c_str());
+    }
+
+    std::string state;
+};
+
+///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct strip_comments_tokens : lexer_def<Lexer>
+struct strip_comments_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    strip_comments_tokens()
+      : strip_comments_tokens::base_type(match_flags::match_default)
     {
         // define tokens and associate them with the lexer
         cppcomment = "//[^\n]*";
@@ -69,24 +114,25 @@
         endcomment = "\\*/";
         any = ".";
         eol = "\n";
-        
+
         // The following tokens are associated with the default lexer state 
         // (the "INITIAL" state). Specifying 'INITIAL' as a lexer state is 
         // strictly optional.
-        self =  cppcomment
-            |   ccomment    [ set_state("COMMENT") ]
+        this->self 
+            =   cppcomment
+            |   ccomment    [ set_lexer_state("COMMENT") ]
             |   eol         [ echo_input(std::cout) ]
             |   any         [ echo_input(std::cout) ]
             ;
-        
+
         // The following tokens are associated with the lexer state 'COMMENT'.
-        self("COMMENT") 
-            =   endcomment  [ set_state("INITIAL") ]
+        this->self("COMMENT") 
+            =   endcomment  [ set_lexer_state("INITIAL") ]
             |   eol
             |   any 
             ;
     }
-    
+
     token_def<> cppcomment, ccomment, endcomment, any, eol;
 };
 
@@ -95,19 +141,19 @@
 {
     // iterator type used to expose the underlying input stream
     typedef std::string::iterator base_iterator_type;
-    
+
     // lexer type
-    typedef lexertl_actor_lexer<lexertl_token<base_iterator_type> > lexer_type;
-    
+    typedef lexertl::actor_lexer<lexertl::token<base_iterator_type> > lexer_type;
+
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    strip_comments_tokens<lexer_type> strip_comments;             // Our token definition
+    strip_comments_tokens<lexer_type> strip_comments;             // Our lexer
 
-    // Parsing is done based on the the token stream, not the character 
-    // stream read from the input.
+    // No parsing is done alltogether, everzthing happens in the lexer semantic
+    // actions.
     std::string str (read_from_file(1 == argc ? "strip_comments.input" : argv[1]));
     base_iterator_type first = str.begin();
-    bool r = tokenize(first, str.end(), make_lexer(strip_comments));
+    bool r = tokenize(first, str.end(), strip_comments);
 
     if (!r) {
         std::string rest(first, str.end());
Modified: trunk/libs/spirit/example/lex/word_count.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/word_count.cpp	(original)
+++ trunk/libs/spirit/example/lex/word_count.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -37,7 +37,7 @@
 #include <boost/config/warning_disable.hpp>
 //[wcp_includes
 #include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
 #include <boost/spirit/include/phoenix_container.hpp>
@@ -50,6 +50,7 @@
 
 //[wcp_namespaces
 using namespace boost::spirit;
+using namespace boost::spirit::ascii;
 using namespace boost::spirit::qi;
 using namespace boost::spirit::lex;
 //]
@@ -67,29 +68,29 @@
 
 //[wcp_token_definition
 template <typename Lexer>
-struct word_count_tokens : lexer_def<Lexer>
+struct word_count_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    word_count_tokens()
     {
         // define patterns (lexer macros) to be used during token definition 
         // below
-        self.add_pattern
+        this->self.add_pattern
             ("WORD", "[^ \t\n]+")
         ;
-            
+
         // define tokens and associate them with the lexer
         word = "{WORD}";    // reference the pattern 'WORD' as defined above
 
         // this lexer will recognize 3 token types: words, newlines, and 
         // everything else
-        self.add
+        this->self.add
             (word)          // no token id is needed here
             ('\n')          // characters are usable as tokens as well
-            (".", IDANY)
+            (".", IDANY)    // string literals will not be esacped by the library
         ;
     }
-    
+
+    // the token 'word' exposes the matched string as its parser attribute
     token_def<std::string> word;
 };
 //]
@@ -103,16 +104,11 @@
 {
     template <typename TokenDef>
     word_count_grammar(TokenDef const& tok)
-      : grammar<Iterator>(start), c(0), w(0), l(0)
+      : word_count_grammar::base_type(start)
+      , c(0), w(0), l(0)
     {
         using boost::phoenix::ref;
         using boost::phoenix::size;
-        
-        // As documented in the Spirit.Qi documentation, any placeholders 
-        // (_1 et.al.) used in semantic actions inside a grammar need to be 
-        // imported from the namespace boost::spirit::arg_names, and not from 
-        // the corresponding namespace in Phoenix.
-        using boost::spirit::arg_names::_1;
 
         start =  *(   tok.word      [++ref(w), ref(c) += size(_1)]
                   |   char_('\n')   [++ref(c), ++ref(l)] 
@@ -132,20 +128,20 @@
 {
 /*< define the token type to be used: `std::string` is available as the 
      type of the token value 
->*/  typedef lexertl_token<
+>*/  typedef lexertl::token<
         char const*, boost::mpl::vector<std::string>
     > token_type;
 
 /*< define the lexer type to use implementing the state machine
->*/  typedef lexertl_lexer<token_type> lexer_type;
+>*/  typedef lexertl::lexer<token_type> lexer_type;
 
 /*< define the iterator type exposed by the lexer type
->*/  typedef lexer_iterator<word_count_tokens<lexer_type> >::type iterator_type;
+>*/  typedef word_count_tokens<lexer_type>::iterator_type iterator_type;
 
     // now we use the types defined above to create the lexer and grammar
     // object instances needed to invoke the parsing process
-    word_count_tokens<lexer_type> word_count;          // Our token definition
-    word_count_grammar<iterator_type> g (word_count);  // Our grammar definition
+    word_count_tokens<lexer_type> word_count;          // Our lexer
+    word_count_grammar<iterator_type> g (word_count);  // Our parser 
 
     // read in the file int memory
     std::string str (read_from_file(1 == argc ? "word_count.input" : argv[1]));
@@ -156,7 +152,7 @@
     // stream read from the input. The function `tokenize_and_parse()` wraps
     // the passed iterator range `[first, last)` by the lexical analyzer and 
     // uses its exposed iterators to parse the toke stream.
-    bool r = tokenize_and_parse(first, last, make_lexer(word_count), g);
+    bool r = tokenize_and_parse(first, last, word_count, g);
 
     if (r) {
         std::cout << "lines: " << g.l << ", words: " << g.w 
Modified: trunk/libs/spirit/example/lex/word_count_functor.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/word_count_functor.cpp	(original)
+++ trunk/libs/spirit/example/lex/word_count_functor.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -51,7 +51,7 @@
 
 #include <boost/config/warning_disable.hpp>
 //[wcf_includes
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <boost/bind.hpp>
 #include <boost/ref.hpp>
 //]
@@ -62,7 +62,6 @@
 #include "example.hpp"
 
 //[wcf_namespaces
-using namespace boost::spirit;
 using namespace boost::spirit::lex;
 //]
 
@@ -91,14 +90,13 @@
     example we use the Lexertl based lexer engine as the underlying lexer type. 
 */
 template <typename Lexer>
-struct word_count_tokens : lexer_def<Lexer>
+struct word_count_tokens : lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    word_count_tokens()
     {
         // define tokens (the regular expression to match and the corresponding
         // token id) and add them to the lexer 
-        self.add
+        this->self.add
             ("[^ \t\n]+", ID_WORD) // words (anything except ' ', '\t' or '\n')
             ("\n", ID_EOL)         // newline characters
             (".", ID_CHAR)         // anything else is a plain character
@@ -114,9 +112,9 @@
 */
 struct counter
 {
-//<- this is an implementation detail and doesn't show up in the documentation
+//<- this is an implementation detail specific to boost::bind and doesn't show 
+//   up in the documentation
     typedef bool result_type;
-    
 //->
     // the function operator gets called for each of the matched tokens
     // c, l, w are references to the counters used to keep track of the numbers
@@ -160,13 +158,13 @@
     std::string str (read_from_file(1 == argc ? "word_count.input" : argv[1]));
 
     // create the token definition instance needed to invoke the lexical analyzer
-    word_count_tokens<lexertl_lexer<> > word_count_functor;
+    word_count_tokens<lexertl::lexer<> > word_count_functor;
 
     // tokenize the given string, the bound functor gets invoked for each of 
     // the matched tokens
     char const* first = str.c_str();
     char const* last = &first[str.size()];
-    bool r = lex::tokenize(first, last, make_lexer(word_count_functor), 
+    bool r = tokenize(first, last, word_count_functor, 
         boost::bind(counter(), _1, boost::ref(c), boost::ref(w), boost::ref(l)));
 
     // print results
Modified: trunk/libs/spirit/example/lex/word_count_lexer.cpp
==============================================================================
--- trunk/libs/spirit/example/lex/word_count_lexer.cpp	(original)
+++ trunk/libs/spirit/example/lex/word_count_lexer.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -34,8 +34,7 @@
 
 #include <boost/config/warning_disable.hpp>
 //[wcl_includes
-#include <boost/spirit/include/support_argument.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
 #include <boost/spirit/include/phoenix_algorithm.hpp>
@@ -61,27 +60,25 @@
 ///////////////////////////////////////////////////////////////////////////////
 //[wcl_token_definition
 template <typename Lexer>
-struct word_count_tokens : lexer_def<Lexer>
+struct word_count_tokens : lexer<Lexer>
 {
     word_count_tokens()
-      : c(0), w(0), l(0),
-        word("[^ \t\n]+"), eol("\n"), any(".")  // define tokens
-    {}
-    
-    template <typename Self>
-    void def (Self& self)
+      : c(0), w(0), l(0)
+      , word("[^ \t\n]+")     // define tokens
+      , eol("\n")
+      , any(".")
     {
         using boost::phoenix::ref;
         using boost::phoenix::distance;
-        using boost::spirit::arg_names::_1;
 
         // associate tokens with the lexer
-        self =  word  [++ref(w), ref(c) += distance(_1)]
+        this->self 
+            =   word  [++ref(w), ref(c) += distance(_1)]
             |   eol   [++ref(c), ++ref(l)] 
             |   any   [++ref(c)]
             ;
     }
-    
+
     std::size_t c, w, l;
     token_def<> word, eol, any;
 };
@@ -105,18 +102,18 @@
     //
     // As a result the token instances contain the token ids as the only data 
     // member.
-    typedef lexertl_token<char const*, omitted, boost::mpl::false_> token_type;
+    typedef lexertl::token<char const*, omitted, boost::mpl::false_> token_type;
 
     // lexer type
-    typedef lexertl_actor_lexer<token_type> lexer_type;
-    
+    typedef lexertl::actor_lexer<token_type> lexer_type;
+
     // create the lexer object instance needed to invoke the lexical analysis 
     word_count_tokens<lexer_type> word_count_lexer;
 
     // tokenize the given string, all generated tokens are discarded
     char const* first = str.c_str();
     char const* last = &first[str.size()];
-    bool r = tokenize(first, last, make_lexer(word_count_lexer));
+    bool r = tokenize(first, last, word_count_lexer);
 
     if (r) {
         std::cout << "lines: " << word_count_lexer.l 
Modified: trunk/libs/spirit/example/qi/Jamfile
==============================================================================
--- trunk/libs/spirit/example/qi/Jamfile	(original)
+++ trunk/libs/spirit/example/qi/Jamfile	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -5,7 +5,7 @@
 #   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 #==============================================================================
 project spirit-qi-example
-    : requirements <toolset>gcc:<cxxflags>-ftemplate-depth-300
+    : requirements <toolset>gcc:<c++-template-depth>300
     :
     :
     ;
@@ -17,6 +17,7 @@
 exe roman : roman.cpp ;
 exe mini_xml1 : mini_xml1.cpp ;
 exe mini_xml2 : mini_xml2.cpp ;
+exe mini_xml3 : mini_xml3.cpp ;
 exe num_list1 : num_list1.cpp ;
 exe num_list2 : num_list2.cpp ;
 exe num_list3 : num_list3.cpp ;
@@ -26,8 +27,9 @@
 exe calc2 : calc2.cpp ;
 exe calc2_ast : calc2_ast.cpp ;
 exe calc3 : calc3.cpp ;
-exe calc3_lexer : calc3_lexer.cpp ;
+#exe calc3_lexer : calc3_lexer.cpp ;
 exe calc4 : calc4.cpp ;
+exe calc4_debug : calc4_debug.cpp ;
 exe calc5 : calc5.cpp ;
 
 exe calc6 :
Modified: trunk/libs/spirit/example/qi/actions.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/actions.cpp	(original)
+++ trunk/libs/spirit/example/qi/actions.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,10 +1,9 @@
 /*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
-
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
 #include <boost/lambda/lambda.hpp>
@@ -19,41 +18,50 @@
 //  * Using boost.bind with a member function
 //  * Using boost.lambda
 
-using namespace boost::spirit;
-
 //[tutorial_semantic_action_functions
-// A plain function
-void write(int const& i)
+namespace client
 {
-    std::cout << i << std::endl;
-}
+    namespace qi = boost::spirit::qi;
 
-// A member function
-struct writer
-{
-    void print(int const& i) const
+    // A plain function
+    void print(int const& i)
     {
         std::cout << i << std::endl;
     }
-};
 
-// A function object
-struct write_action
-{
-    void operator()(int const& i, unused_type, unused_type) const
+    // A member function
+    struct writer
     {
-        std::cout << i << std::endl;
-    }
-};
+        void print(int const& i) const
+        {
+            std::cout << i << std::endl;
+        }
+    };
+
+    // A function object
+    struct print_action
+    {
+        void operator()(int const& i, qi::unused_type, qi::unused_type) const
+        {
+            std::cout << i << std::endl;
+        }
+    };
+}
 //]
 
 int main()
 {
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::parse;
+    using client::print;
+    using client::writer;
+    using client::print_action;
+
     { // example using plain function
 
         char const *first = "{42}", *last = first + std::strlen(first);
         //[tutorial_attach_actions1
-        qi::parse(first, last, '{' >> int_[&write] >> '}');
+        parse(first, last, '{' >> int_[&print] >> '}');
         //]
     }
 
@@ -61,7 +69,7 @@
 
         char const *first = "{43}", *last = first + std::strlen(first);
         //[tutorial_attach_actions2
-        qi::parse(first, last, '{' >> int_[write_action()] >> '}');
+        parse(first, last, '{' >> int_[print_action()] >> '}');
         //]
     }
 
@@ -69,7 +77,7 @@
 
         char const *first = "{44}", *last = first + std::strlen(first);
         //[tutorial_attach_actions3
-        qi::parse(first, last, '{' >> int_[boost::bind(&write, _1)] >> '}');
+        parse(first, last, '{' >> int_[boost::bind(&print, _1)] >> '}');
         //]
     }
 
@@ -78,7 +86,7 @@
         char const *first = "{44}", *last = first + std::strlen(first);
         //[tutorial_attach_actions4
         writer w;
-        qi::parse(first, last, '{' >> int_[boost::bind(&writer::print, &w, _1)] >> '}');
+        parse(first, last, '{' >> int_[boost::bind(&writer::print, &w, _1)] >> '}');
         //]
     }
 
@@ -88,7 +96,7 @@
         char const *first = "{45}", *last = first + std::strlen(first);
         using lambda::_1;
         //[tutorial_attach_actions5
-        qi::parse(first, last, '{' >> int_[std::cout << _1 << '\n'] >> '}');
+        parse(first, last, '{' >> int_[std::cout << _1 << '\n'] >> '}');
         //]
     }
 
Modified: trunk/libs/spirit/example/qi/calc1.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc1.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc1.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -19,42 +19,46 @@
 #include <iostream>
 #include <string>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : grammar<Iterator, space_type>
+namespace client
 {
-    calculator() : calculator::base_type(expression)
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar
+    ///////////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, ascii::space_type>
     {
-        expression =
-            term
-            >> *(   ('+' >> term)
-                |   ('-' >> term)
-                )
-            ;
-
-        term =
-            factor
-            >> *(   ('*' >> factor)
-                |   ('/' >> factor)
-                )
-            ;
-
-        factor =
-            uint_
-            |   '(' >> expression >> ')'
-            |   ('-' >> factor)
-            |   ('+' >> factor)
-            ;
-    }
+        calculator() : calculator::base_type(expression)
+        {
+            using qi::uint_;
+
+            expression =
+                term
+                >> *(   ('+' >> term)
+                    |   ('-' >> term)
+                    )
+                ;
+
+            term =
+                factor
+                >> *(   ('*' >> factor)
+                    |   ('/' >> factor)
+                    )
+                ;
+
+            factor =
+                uint_
+                |   '(' >> expression >> ')'
+                |   ('-' >> factor)
+                |   ('+' >> factor)
+                ;
+        }
 
-    rule<Iterator, space_type> expression, term, factor;
-};
+        qi::rule<Iterator, ascii::space_type> expression, term, factor;
+    };
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -67,8 +71,9 @@
     std::cout << "/////////////////////////////////////////////////////////\n\n";
     std::cout << "Type an expression...or [q or Q] to quit\n\n";
 
+    using boost::spirit::ascii::space;
     typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
+    typedef client::calculator<iterator_type> calculator;
 
     calculator calc; // Our grammar
 
Modified: trunk/libs/spirit/example/qi/calc2.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc2.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc2.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,55 +21,59 @@
 #include <iostream>
 #include <string>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Semantic actions
-///////////////////////////////////////////////////////////////////////////////
-namespace
+namespace client
 {
-    void do_int(int n)  { std::cout << "push " << n << std::endl; }
-    void do_add()       { std::cout << "add\n"; }
-    void do_subt()      { std::cout << "subtract\n"; }
-    void do_mult()      { std::cout << "mult\n"; }
-    void do_div()       { std::cout << "divide\n"; }
-    void do_neg()       { std::cout << "negate\n"; }
-}
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
 
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : grammar<Iterator, space_type>
-{
-    calculator() : calculator::base_type(expression)
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Semantic actions
+    ///////////////////////////////////////////////////////////////////////////////
+    namespace
     {
-        expression =
-            term
-            >> *(   ('+' >> term            [&do_add])
-                |   ('-' >> term            [&do_subt])
-                )
-            ;
-
-        term =
-            factor
-            >> *(   ('*' >> factor          [&do_mult])
-                |   ('/' >> factor          [&do_div])
-                )
-            ;
-
-        factor =
-            uint_                           [&do_int]
-            |   '(' >> expression >> ')'
-            |   ('-' >> factor              [&do_neg])
-            |   ('+' >> factor)
-            ;
+        void do_int(int n)  { std::cout << "push " << n << std::endl; }
+        void do_add()       { std::cout << "add\n"; }
+        void do_subt()      { std::cout << "subtract\n"; }
+        void do_mult()      { std::cout << "mult\n"; }
+        void do_div()       { std::cout << "divide\n"; }
+        void do_neg()       { std::cout << "negate\n"; }
     }
 
-    rule<Iterator, space_type> expression, term, factor;
-};
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar
+    ///////////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, ascii::space_type>
+    {
+        calculator() : calculator::base_type(expression)
+        {
+            using qi::uint_;
+
+            expression =
+                term
+                >> *(   ('+' >> term            [&do_add])
+                    |   ('-' >> term            [&do_subt])
+                    )
+                ;
+
+            term =
+                factor
+                >> *(   ('*' >> factor          [&do_mult])
+                    |   ('/' >> factor          [&do_div])
+                    )
+                ;
+
+            factor =
+                uint_                           [&do_int]
+                |   '(' >> expression >> ')'
+                |   ('-' >> factor              [&do_neg])
+                |   ('+' >> factor)
+                ;
+        }
+
+        qi::rule<Iterator, ascii::space_type> expression, term, factor;
+    };
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -82,8 +86,9 @@
     std::cout << "/////////////////////////////////////////////////////////\n\n";
     std::cout << "Type an expression...or [q or Q] to quit\n\n";
 
+    using boost::spirit::ascii::space;
     typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
+    typedef client::calculator<iterator_type> calculator;
 
     calculator calc; // Our grammar
 
Modified: trunk/libs/spirit/example/qi/calc2_ast.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc2_ast.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc2_ast.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,13 +8,14 @@
 //
 //  A Calculator example demonstrating generation of AST
 //
-//  [ JDG April 28, 2002 ]
+//  [ JDG April 28, 2008 ]
 //
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
 #include <boost/variant/recursive_variant.hpp>
+#include <boost/variant/apply_visitor.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_function.hpp>
 
@@ -22,142 +23,180 @@
 #include <vector>
 #include <string>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our AST
-///////////////////////////////////////////////////////////////////////////////
-struct binary_op;
-struct unary_op;
-struct nil {};
-
-struct expression_ast
+namespace client
 {
-    typedef
-        boost::variant<
-            nil // can't happen!
-          , unsigned int
-          , boost::recursive_wrapper<expression_ast>
-          , boost::recursive_wrapper<binary_op>
-          , boost::recursive_wrapper<unary_op>
-        >
-    type;
-
-    expression_ast()
-      : expr(nil()) {}
-
-    template <typename Expr>
-    expression_ast(Expr const& expr)
-      : expr(expr) {}
-
-    expression_ast& operator+=(expression_ast const& rhs);
-    expression_ast& operator-=(expression_ast const& rhs);
-    expression_ast& operator*=(expression_ast const& rhs);
-    expression_ast& operator/=(expression_ast const& rhs);
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
 
-    type expr;
-};
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our AST
+    ///////////////////////////////////////////////////////////////////////////
+    struct binary_op;
+    struct unary_op;
+    struct nil {};
 
-struct binary_op
-{
-    binary_op(
-        char op
-      , expression_ast const& left
-      , expression_ast const& right)
-    : op(op), left(left), right(right) {}
-
-    char op;
-    expression_ast left;
-    expression_ast right;
-};
+    struct expression_ast
+    {
+        typedef
+            boost::variant<
+                nil // can't happen!
+              , unsigned int
+              , boost::recursive_wrapper<expression_ast>
+              , boost::recursive_wrapper<binary_op>
+              , boost::recursive_wrapper<unary_op>
+            >
+        type;
+
+        expression_ast()
+          : expr(nil()) {}
+
+        template <typename Expr>
+        expression_ast(Expr const& expr)
+          : expr(expr) {}
+
+        expression_ast& operator+=(expression_ast const& rhs);
+        expression_ast& operator-=(expression_ast const& rhs);
+        expression_ast& operator*=(expression_ast const& rhs);
+        expression_ast& operator/=(expression_ast const& rhs);
 
-struct unary_op
-{
-    unary_op(
-        char op
-      , expression_ast const& subject)
-    : op(op), subject(subject) {}
-
-    char op;
-    expression_ast subject;
-};
+        type expr;
+    };
 
-expression_ast& expression_ast::operator+=(expression_ast const& rhs)
-{
-    expr = binary_op('+', expr, rhs);
-    return *this;
-}
+    struct binary_op
+    {
+        binary_op(
+            char op
+          , expression_ast const& left
+          , expression_ast const& right)
+        : op(op), left(left), right(right) {}
+
+        char op;
+        expression_ast left;
+        expression_ast right;
+    };
 
-expression_ast& expression_ast::operator-=(expression_ast const& rhs)
-{
-    expr = binary_op('-', expr, rhs);
-    return *this;
-}
+    struct unary_op
+    {
+        unary_op(
+            char op
+          , expression_ast const& subject)
+        : op(op), subject(subject) {}
+
+        char op;
+        expression_ast subject;
+    };
 
-expression_ast& expression_ast::operator*=(expression_ast const& rhs)
-{
-    expr = binary_op('*', expr, rhs);
-    return *this;
-}
+    expression_ast& expression_ast::operator+=(expression_ast const& rhs)
+    {
+        expr = binary_op('+', expr, rhs);
+        return *this;
+    }
 
-expression_ast& expression_ast::operator/=(expression_ast const& rhs)
-{
-    expr = binary_op('/', expr, rhs);
-    return *this;
-}
+    expression_ast& expression_ast::operator-=(expression_ast const& rhs)
+    {
+        expr = binary_op('-', expr, rhs);
+        return *this;
+    }
 
-// We should be using expression_ast::operator-. There's a bug
-// in phoenix type deduction mechanism that prevents us from
-// doing so. Phoenix will be switching to BOOST_TYPEOF. In the
-// meantime, we will use a phoenix::function below:
-struct negate_expr
-{
-    template <typename T>
-    struct result { typedef T type; };
+    expression_ast& expression_ast::operator*=(expression_ast const& rhs)
+    {
+        expr = binary_op('*', expr, rhs);
+        return *this;
+    }
 
-    expression_ast operator()(expression_ast const& expr) const
+    expression_ast& expression_ast::operator/=(expression_ast const& rhs)
     {
-        return expression_ast(unary_op('-', expr));
+        expr = binary_op('/', expr, rhs);
+        return *this;
     }
-};
 
-boost::phoenix::function<negate_expr> neg;
+    // We should be using expression_ast::operator-. There's a bug
+    // in phoenix type deduction mechanism that prevents us from
+    // doing so. Phoenix will be switching to BOOST_TYPEOF. In the
+    // meantime, we will use a phoenix::function below:
+    struct negate_expr
+    {
+        template <typename T>
+        struct result { typedef T type; };
+
+        expression_ast operator()(expression_ast const& expr) const
+        {
+            return expression_ast(unary_op('-', expr));
+        }
+    };
 
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : grammar<Iterator, expression_ast(), space_type>
-{
-    calculator() : calculator::base_type(expression)
+    boost::phoenix::function<negate_expr> neg;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Walk the tree
+    ///////////////////////////////////////////////////////////////////////////
+    struct ast_print
     {
-        expression =
-            term                            [_val = _1]
-            >> *(   ('+' >> term            [_val += _1])
-                |   ('-' >> term            [_val -= _1])
-                )
-            ;
-
-        term =
-            factor                          [_val = _1]
-            >> *(   ('*' >> factor          [_val *= _1])
-                |   ('/' >> factor          [_val /= _1])
-                )
-            ;
-
-        factor =
-            uint_                           [_val = _1]
-            |   '(' >> expression           [_val = _1] >> ')'
-            |   ('-' >> factor              [_val = neg(_1)])
-            |   ('+' >> factor              [_val = _1])
-            ;
-    }
+        typedef void result_type;
+
+        void operator()(qi::info::nil) const {}
+        void operator()(int n) const { std::cout << n; }
 
-    rule<Iterator, expression_ast(), space_type> expression, term, factor;
-};
+        void operator()(expression_ast const& ast) const
+        {
+            boost::apply_visitor(*this, ast.expr);
+        }
+
+        void operator()(binary_op const& expr) const
+        {
+            std::cout << "op:" << expr.op << "(";
+            boost::apply_visitor(*this, expr.left.expr);
+            std::cout << ", ";
+            boost::apply_visitor(*this, expr.right.expr);
+            std::cout << ')';
+        }
+
+        void operator()(unary_op const& expr) const
+        {
+            std::cout << "op:" << expr.op << "(";
+            boost::apply_visitor(*this, expr.subject.expr);
+            std::cout << ')';
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, expression_ast(), ascii::space_type>
+    {
+        calculator() : calculator::base_type(expression)
+        {
+            using qi::_val;
+            using qi::_1;
+            using qi::uint_;
+
+            expression =
+                term                            [_val = _1]
+                >> *(   ('+' >> term            [_val += _1])
+                    |   ('-' >> term            [_val -= _1])
+                    )
+                ;
+
+            term =
+                factor                          [_val = _1]
+                >> *(   ('*' >> factor          [_val *= _1])
+                    |   ('/' >> factor          [_val /= _1])
+                    )
+                ;
+
+            factor =
+                uint_                           [_val = _1]
+                |   '(' >> expression           [_val = _1] >> ')'
+                |   ('-' >> factor              [_val = neg(_1)])
+                |   ('+' >> factor              [_val = _1])
+                ;
+        }
+
+        qi::rule<Iterator, expression_ast(), ascii::space_type>
+        expression, term, factor;
+    };
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -170,8 +209,12 @@
     std::cout << "/////////////////////////////////////////////////////////\n\n";
     std::cout << "Type an expression...or [q or Q] to quit\n\n";
 
+    using boost::spirit::ascii::space;
+    using client::expression_ast;
+    using client::ast_print;
+
     typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
+    typedef client::calculator<iterator_type> calculator;
 
     calculator calc; // Our grammar
 
@@ -183,13 +226,16 @@
 
         std::string::const_iterator iter = str.begin();
         std::string::const_iterator end = str.end();
-        bool r = phrase_parse(iter, end, calc, space);
+        expression_ast ast;
+        ast_print printer;
+        bool r = phrase_parse(iter, end, calc, space, ast);
 
         if (r && iter == end)
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
-            std::cout << "-------------------------\n";
+            printer(ast);
+            std::cout << "\n-------------------------\n";
         }
         else
         {
Modified: trunk/libs/spirit/example/qi/calc3.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc3.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc3.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -22,43 +22,48 @@
 #include <iostream>
 #include <string>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : grammar<Iterator, int(), space_type>
+namespace client
 {
-    calculator() : calculator::base_type(expression)
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, int(), ascii::space_type>
     {
-        expression =
-            term                            [_val = _1]
-            >> *(   ('+' >> term            [_val += _1])
-                |   ('-' >> term            [_val -= _1])
-                )
-            ;
-
-        term =
-            factor                          [_val = _1]
-            >> *(   ('*' >> factor          [_val *= _1])
-                |   ('/' >> factor          [_val /= _1])
-                )
-            ;
-
-        factor =
-            uint_                           [_val = _1]
-            |   '(' >> expression           [_val = _1] >> ')'
-            |   ('-' >> factor              [_val = -_1])
-            |   ('+' >> factor              [_val = _1])
-            ;
-    }
+        calculator() : calculator::base_type(expression)
+        {
+            using qi::_val;
+            using qi::_1;
+            using qi::uint_;
+
+            expression =
+                term                            [_val = _1]
+                >> *(   ('+' >> term            [_val += _1])
+                    |   ('-' >> term            [_val -= _1])
+                    )
+                ;
+
+            term =
+                factor                          [_val = _1]
+                >> *(   ('*' >> factor          [_val *= _1])
+                    |   ('/' >> factor          [_val /= _1])
+                    )
+                ;
+
+            factor =
+                uint_                           [_val = _1]
+                |   '(' >> expression           [_val = _1] >> ')'
+                |   ('-' >> factor              [_val = -_1])
+                |   ('+' >> factor              [_val = _1])
+                ;
+        }
 
-    rule<Iterator, int(), space_type> expression, term, factor;
-};
+        qi::rule<Iterator, int(), ascii::space_type> expression, term, factor;
+    };
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -71,8 +76,9 @@
     std::cout << "/////////////////////////////////////////////////////////\n\n";
     std::cout << "Type an expression...or [q or Q] to quit\n\n";
 
+    using boost::spirit::ascii::space;
     typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
+    typedef client::calculator<iterator_type> calculator;
 
     calculator calc; // Our grammar
 
@@ -85,7 +91,7 @@
 
         std::string::const_iterator iter = str.begin();
         std::string::const_iterator end = str.end();
-        bool r = phrase_parse(iter, end, calc, result, space);
+        bool r = phrase_parse(iter, end, calc, space, result);
 
         if (r && iter == end)
         {
Deleted: trunk/libs/spirit/example/qi/calc3_lexer.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc3_lexer.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,203 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2001-2009 Hartmut Kaiser
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-///////////////////////////////////////////////////////////////////////////////
-//
-//  A calculator example demonstrating the grammar and semantic actions
-//  using phoenix to do the actual expression evaluation. The parser is
-//  essentially an "interpreter" that evaluates expressions on the fly.
-//
-//  Additionally this examples shows how to build and use a lexer based on 
-//  Ben Hansons Lexertl (http://www.benhanson.net/lexertl.html). This way the
-//  parser matches the grammar against the tokens generated by the lexer 
-//  component and not against the input character stream.
-//
-//  Even if the benefits of using a lexer for this small calculator grammar may 
-//  not outweight the corresponding overhead, we provide this example because 
-//  it allows to concentrate on the essentials without having to understand
-//  the semantics first.
-//
-//  [ JDG June 29, 2002 ]   spirit1
-//  [ JDG March 5, 2007 ]   spirit2
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-
-#include <iostream>
-#include <string>
-
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::lex;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our token definition
-//  This class is used to define all the tokens to be recognized by the lexer. 
-///////////////////////////////////////////////////////////////////////////////
-template <typename Lexer>
-struct calculator_tokens : lexer_def<Lexer>
-{
-    template <typename Self>
-    void def (Self& self)
-    {
-        // unsigned integer token definition
-        ui = "[1-9][0-9]*";
-        
-        // whitespace token definitions
-        ws = "[ \\t\\f\\v]+";
-        c_comment = "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/";
-        
-        // build token set
-        skipper = ws | c_comment;                   // += is allowed as well
-        
-        // associate the tokens and the token set with the lexer
-        // default lexer state
-        self = token_def<>('+') | '-' | '*' | '/' | '(' | ')'; 
-        self += ui;                                 // still default state
-        
-        // The token_set 'skipper' get's assigned to a separate lexer state
-        // which allows to use it separately from the main tokenization
-        // (it is used as the skipper parser below)
-        self("SKIPPER") = skipper;                  // lexer state "SKIPPER"
-    }
-
-    // This are the tokens to be recognized by the lexer.
-    token_def<unsigned int> ui;   // matched tokens will have a unsigned int 
-    token_def<> ws, c_comment;    // attribute will not be used
-
-    // This is the only token set explicitly defined by this lexer because it
-    // needs to be accessible from the outside (used as skip parser below).
-    typename Lexer::token_set skipper;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar
-//
-//  The difference to the original example (calc3.cpp) is that we are 
-//  specifying a second template parameter referring to the lexer. Further, we 
-//  use a defined tokenset from above as the skip parser.
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator, typename Lexer>
-struct calculator : grammar<Iterator, int(), typename Lexer::token_set>
-{
-    template <typename TokenDef>
-    calculator(TokenDef const& tok) 
-      : calculator::base_type(expression)
-    {
-        // grammar
-        expression =
-            term                            [_val = _1]
-            >> *(   ('+' >> term            [_val += _1])
-                |   ('-' >> term            [_val -= _1])
-                )
-            ;
-
-        term =
-            factor                          [_val = _1]
-            >> *(   ('*' >> factor          [_val *= _1])
-                |   ('/' >> factor          [_val /= _1])
-                )
-            ;
-
-        factor =
-            tok.ui                          [_val = _1]
-            |   '(' >> expression           [_val = _1] >> ')'
-            |   ('-' >> factor              [_val = -_1])
-            |   ('+' >> factor              [_val = _1])
-            ;
-    }
-
-    rule<Iterator, int(), typename Lexer::token_set> expression, term, factor;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//  Main program
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
-    std::cout << "/////////////////////////////////////////////////////////\n\n";
-    std::cout << "Expression parser...\n\n";
-    std::cout << "/////////////////////////////////////////////////////////\n\n";
-    std::cout << "Type an expression...or [q or Q] to quit\n\n";
-
-    // iterator type used to expose the underlying input stream
-    typedef std::string::const_iterator base_iterator_type;
-    
-    // This is the lexer token type to use. The second template parameter lists 
-    // all attribute types used for token_def's during token definition (see 
-    // calculator_tokens<> above). Here we use the predefined lexertl token 
-    // type, but any compatible token type may be used.
-    typedef lexertl_token<
-        base_iterator_type, boost::mpl::vector<unsigned int> 
-    > token_type;
-    
-    // This is the lexer type to use to tokenize the input.
-    // Here we use the lexertl based lexer engine.
-    typedef lexertl_lexer<token_type> lexer_type;
-    
-    // This is the token definition type (derived from the given lexer type).
-    typedef calculator_tokens<lexer_type> calculator_tokens;
-    
-    // this is the iterator type exposed by the lexer 
-    typedef lexer<calculator_tokens>::iterator_type iterator_type;
-
-    // this is the type of the grammar to parse
-    typedef calculator<iterator_type, lexer_type> calculator;
-
-    // now we use the types defined above to create the lexer and grammar
-    // object instances needed to invoke the parsing process
-    calculator_tokens tokens;                       // Our token definition
-    calculator calc(tokens);                        // Our grammar definition
-
-    lexer<calculator_tokens> lex(tokens);           // Our lexer
-
-    // get input line by line and feed the parser to evaluate the expressions
-    // read in from the input
-    std::string str;
-    int result;
-    while (std::getline(std::cin, str))
-    {
-        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
-            break;
-
-        // At this point we generate the iterator pair used to expose the
-        // tokenized input stream.
-        iterator_type iter = lex.begin(str.begin(), str.end());
-        iterator_type end = lex.end();
-        
-        // Parsing is done based on the the token stream, not the character 
-        // stream read from the input.
-        // Note, how we use the token_set defined above as the skip parser.
-        bool r = phrase_parse(iter, end, calc, result, tokens.skipper);
-
-        if (r && iter == end)
-        {
-            std::cout << "-------------------------\n";
-            std::cout << "Parsing succeeded\n";
-            std::cout << "result = " << result << std::endl;
-            std::cout << "-------------------------\n";
-        }
-        else
-        {
-            std::cout << "-------------------------\n";
-            std::cout << "Parsing failed\n";
-            std::cout << "-------------------------\n";
-        }
-    }
-
-    std::cout << "Bye... :-) \n\n";
-    return 0;
-}
-
-
Modified: trunk/libs/spirit/example/qi/calc4.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc4.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc4.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,62 +21,69 @@
 #include <iostream>
 #include <string>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-using boost::phoenix::val;
-using boost::phoenix::construct;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : grammar<Iterator, int(), space_type>
+namespace client
 {
-    calculator() : calculator::base_type(expression)
+    namespace qi = boost::spirit::qi;
+    namespace phoenix = boost::phoenix;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar
+    ///////////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, int(), ascii::space_type>
     {
-        expression =
-            term                            [_val = _1]
-            >> *(   ('+' > term             [_val += _1])
-                |   ('-' > term             [_val -= _1])
-                )
-            ;
-
-        term =
-            factor                          [_val = _1]
-            >> *(   ('*' > factor           [_val *= _1])
-                |   ('/' > factor           [_val /= _1])
-                )
-            ;
-
-        factor =
-            uint_                           [_val = _1]
-            |   '(' > expression            [_val = _1] > ')'
-            |   ('-' > factor               [_val = -_1])
-            |   ('+' > factor               [_val = _1])
-            ;
-
-        expression.name("expression");
-        term.name("term");
-        factor.name("factor");
-
-        on_error<fail>
-        (   
-            expression
-          , std::cout
-                << val("Error! Expecting ")
-                << _4                               // what failed?
-                << val(" here: \"")
-                << construct<std::string>(_3, _2)   // iterators to error-pos, end
-                << val("\"")
-                << std::endl
-        );
-    }
+        calculator() : calculator::base_type(expression)
+        {
+            using namespace qi::labels;
+            using qi::uint_;
+            using qi::on_error;
+            using qi::fail;
+
+            using phoenix::construct;
+            using phoenix::val;
+
+            expression =
+                term                            [_val = _1]
+                >> *(   ('+' > term             [_val += _1])
+                    |   ('-' > term             [_val -= _1])
+                    )
+                ;
+
+            term =
+                factor                          [_val = _1]
+                >> *(   ('*' > factor           [_val *= _1])
+                    |   ('/' > factor           [_val /= _1])
+                    )
+                ;
+
+            factor =
+                uint_                           [_val = _1]
+                |   '(' > expression            [_val = _1] > ')'
+                |   ('-' > factor               [_val = -_1])
+                |   ('+' > factor               [_val = _1])
+                ;
+
+            expression.name("expression");
+            term.name("term");
+            factor.name("factor");
+
+            on_error<fail>
+            (
+                expression
+              , std::cout
+                    << val("Error! Expecting ")
+                    << _4                               // what failed?
+                    << val(" here: \"")
+                    << construct<std::string>(_3, _2)   // iterators to error-pos, end
+                    << val("\"")
+                    << std::endl
+            );
+        }
 
-    rule<Iterator, int(), space_type> expression, term, factor;
-};
+        qi::rule<Iterator, int(), ascii::space_type> expression, term, factor;
+    };
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -89,10 +96,10 @@
     std::cout << "/////////////////////////////////////////////////////////\n\n";
     std::cout << "Type an expression...or [q or Q] to quit\n\n";
 
+    using boost::spirit::ascii::space;
     typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
+    typedef client::calculator<iterator_type> calculator;
 
-    calculator def; //  Our grammar definition
     calculator calc; // Our grammar
 
     std::string str;
@@ -104,7 +111,7 @@
 
         std::string::const_iterator iter = str.begin();
         std::string::const_iterator end = str.end();
-        bool r = phrase_parse(iter, end, calc, result, space);
+        bool r = phrase_parse(iter, end, calc, space, result);
 
         if (r && iter == end)
         {
Added: trunk/libs/spirit/example/qi/calc4_debug.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/example/qi/calc4_debug.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,140 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Same as cal4, but with debugging enabled.
+//
+//  [ JDG June 29, 2002 ]   spirit1
+//  [ JDG March 5, 2007 ]   spirit2
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+
+#include <iostream>
+#include <string>
+
+namespace client
+{
+    namespace qi = boost::spirit::qi;
+    namespace phoenix = boost::phoenix;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar
+    ///////////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, int(), ascii::space_type>
+    {
+        calculator() : calculator::base_type(expression)
+        {
+            using namespace qi::labels;
+            using qi::uint_;
+            using qi::on_error;
+            using qi::fail;
+            using qi::debug;
+
+            using phoenix::construct;
+            using phoenix::val;
+
+            expression =
+                term                            [_val = _1]
+                >> *(   ('+' > term             [_val += _1])
+                    |   ('-' > term             [_val -= _1])
+                    )
+                ;
+
+            term =
+                factor                          [_val = _1]
+                >> *(   ('*' > factor           [_val *= _1])
+                    |   ('/' > factor           [_val /= _1])
+                    )
+                ;
+
+            factor =
+                uint_                           [_val = _1]
+                |   '(' > expression            [_val = _1] > ')'
+                |   ('-' > factor               [_val = -_1])
+                |   ('+' > factor               [_val = _1])
+                ;
+
+            expression.name("expression");
+            term.name("term");
+            factor.name("factor");
+
+            on_error<fail>
+            (
+                expression
+              , std::cout
+                    << val("Error! Expecting ")
+                    << _4                               // what failed?
+                    << val(" here: \"")
+                    << construct<std::string>(_3, _2)   // iterators to error-pos, end
+                    << val("\"")
+                    << std::endl
+            );
+
+            debug(expression);
+            debug(term);
+            debug(factor);
+        }
+
+        qi::rule<Iterator, int(), ascii::space_type> expression, term, factor;
+    };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//  Main program
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+    std::cout << "/////////////////////////////////////////////////////////\n\n";
+    std::cout << "Expression parser...\n\n";
+    std::cout << "/////////////////////////////////////////////////////////\n\n";
+    std::cout << "Type an expression...or [q or Q] to quit\n\n";
+
+    using boost::spirit::ascii::space;
+    typedef std::string::const_iterator iterator_type;
+    typedef client::calculator<iterator_type> calculator;
+
+    calculator calc; // Our grammar
+
+    std::string str;
+    int result;
+    while (std::getline(std::cin, str))
+    {
+        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
+            break;
+
+        std::string::const_iterator iter = str.begin();
+        std::string::const_iterator end = str.end();
+        bool r = phrase_parse(iter, end, calc, space, result);
+
+        if (r && iter == end)
+        {
+            std::cout << "-------------------------\n";
+            std::cout << "Parsing succeeded\n";
+            std::cout << "result = " << result << std::endl;
+            std::cout << "-------------------------\n";
+        }
+        else
+        {
+            std::cout << "-------------------------\n";
+            std::cout << "Parsing failed\n";
+            std::cout << "-------------------------\n";
+        }
+    }
+
+    std::cout << "Bye... :-) \n\n";
+    return 0;
+}
+
+
Modified: trunk/libs/spirit/example/qi/calc5.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc5.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc5.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -28,163 +28,170 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-using boost::phoenix::ref;
-using boost::phoenix::push_back;
-using boost::phoenix::val;
-using boost::phoenix::construct;
-
-///////////////////////////////////////////////////////////////////////////////
-//  The Virtual Machine
-///////////////////////////////////////////////////////////////////////////////
-enum byte_code
+namespace client
 {
-    op_neg,     //  negate the top stack entry
-    op_add,     //  add top two stack entries
-    op_sub,     //  subtract top two stack entries
-    op_mul,     //  multiply top two stack entries
-    op_div,     //  divide top two stack entries
-    op_int,     //  push constant integer into the stack
-};
-
-class vmachine
-{
-public:
-
-    vmachine(unsigned stackSize = 4096)
-      : stack(stackSize)
-      , stack_ptr(stack.begin())
-    {
-    }
+    namespace qi = boost::spirit::qi;
+    namespace phoenix = boost::phoenix;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  The Virtual Machine
+    ///////////////////////////////////////////////////////////////////////////
+    enum byte_code
+    {
+        op_neg,     //  negate the top stack entry
+        op_add,     //  add top two stack entries
+        op_sub,     //  subtract top two stack entries
+        op_mul,     //  multiply top two stack entries
+        op_div,     //  divide top two stack entries
+        op_int,     //  push constant integer into the stack
+    };
+
+    class vmachine
+    {
+    public:
+
+        vmachine(unsigned stackSize = 4096)
+          : stack(stackSize)
+          , stack_ptr(stack.begin())
+        {
+        }
 
-    int top() const { return stack_ptr[-1]; };
-    void execute(std::vector<int> const& code);
+        int top() const { return stack_ptr[-1]; };
+        void execute(std::vector<int> const& code);
 
-private:
+    private:
 
-    std::vector<int> stack;
-    std::vector<int>::iterator stack_ptr;
-};
+        std::vector<int> stack;
+        std::vector<int>::iterator stack_ptr;
+    };
 
-void vmachine::execute(std::vector<int> const& code)
-{
-    std::vector<int>::const_iterator pc = code.begin();
-    stack_ptr = stack.begin();
-
-    while (pc != code.end())
+    void vmachine::execute(std::vector<int> const& code)
     {
-        switch (*pc++)
+        std::vector<int>::const_iterator pc = code.begin();
+        stack_ptr = stack.begin();
+
+        while (pc != code.end())
         {
-            case op_neg:
-                stack_ptr[-1] = -stack_ptr[-1];
-                break;
-
-            case op_add:
-                --stack_ptr;
-                stack_ptr[-1] += stack_ptr[0];
-                break;
-
-            case op_sub:
-                --stack_ptr;
-                stack_ptr[-1] -= stack_ptr[0];
-                break;
-
-            case op_mul:
-                --stack_ptr;
-                stack_ptr[-1] *= stack_ptr[0];
-                break;
-
-            case op_div:
-                --stack_ptr;
-                stack_ptr[-1] /= stack_ptr[0];
-                break;
-
-            case op_int:
-                *stack_ptr++ = *pc++;
-                break;
+            switch (*pc++)
+            {
+                case op_neg:
+                    stack_ptr[-1] = -stack_ptr[-1];
+                    break;
+
+                case op_add:
+                    --stack_ptr;
+                    stack_ptr[-1] += stack_ptr[0];
+                    break;
+
+                case op_sub:
+                    --stack_ptr;
+                    stack_ptr[-1] -= stack_ptr[0];
+                    break;
+
+                case op_mul:
+                    --stack_ptr;
+                    stack_ptr[-1] *= stack_ptr[0];
+                    break;
+
+                case op_div:
+                    --stack_ptr;
+                    stack_ptr[-1] /= stack_ptr[0];
+                    break;
+
+                case op_int:
+                    *stack_ptr++ = *pc++;
+                    break;
+            }
         }
     }
-}
 
-///////////////////////////////////////////////////////////////////////////////
-//  Our calculator grammar and compiler
-///////////////////////////////////////////////////////////////////////////////
-template <typename Iterator>
-struct calculator : grammar<Iterator, space_type>
-{
-    calculator(std::vector<int>& code)
-      : calculator::base_type(expression)
-      , code(code)
-    {
-        expression =
-            term
-            >> *(   ('+' > term             [push_back(ref(code), op_add)])
-                |   ('-' > term             [push_back(ref(code), op_sub)])
-                )
-            ;
-
-        term =
-            factor
-            >> *(   ('*' > factor           [push_back(ref(code), op_mul)])
-                |   ('/' > factor           [push_back(ref(code), op_div)])
-                )
-            ;
-
-        factor =
-            uint_                           [
-                                                push_back(ref(code), op_int),
-                                                push_back(ref(code), _1)
-                                            ]
-            |   '(' > expression > ')'
-            |   ('-' > factor               [push_back(ref(code), op_neg)])
-            |   ('+' > factor)
-            ;
-
-        expression.name("expression");
-        term.name("term");
-        factor.name("factor");
-
-        on_error<fail>
-        (
-            expression
-          , std::cout
-                << val("Error! Expecting ")
-                << _4                               // what failed?
-                << val(" here: \"")
-                << construct<std::string>(_3, _2)   // iterators to error-pos, end
-                << val("\"")
-                << std::endl
-        );
-    }
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our calculator grammar and compiler
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Iterator>
+    struct calculator : qi::grammar<Iterator, ascii::space_type>
+    {
+        calculator(std::vector<int>& code)
+          : calculator::base_type(expression)
+          , code(code)
+        {
+            using namespace qi::labels;
+            using qi::uint_;
+            using qi::on_error;
+            using qi::fail;
+
+            using phoenix::val;
+            using phoenix::ref;
+            using phoenix::push_back;
+            using phoenix::construct;
+
+            expression =
+                term
+                >> *(   ('+' > term             [push_back(ref(code), op_add)])
+                    |   ('-' > term             [push_back(ref(code), op_sub)])
+                    )
+                ;
+
+            term =
+                factor
+                >> *(   ('*' > factor           [push_back(ref(code), op_mul)])
+                    |   ('/' > factor           [push_back(ref(code), op_div)])
+                    )
+                ;
+
+            factor =
+                uint_                           [
+                                                    push_back(ref(code), op_int),
+                                                    push_back(ref(code), _1)
+                                                ]
+                |   '(' > expression > ')'
+                |   ('-' > factor               [push_back(ref(code), op_neg)])
+                |   ('+' > factor)
+                ;
+
+            expression.name("expression");
+            term.name("term");
+            factor.name("factor");
+
+            on_error<fail>
+            (
+                expression
+              , std::cout
+                    << val("Error! Expecting ")
+                    << _4                               // what failed?
+                    << val(" here: \"")
+                    << construct<std::string>(_3, _2)   // iterators to error-pos, end
+                    << val("\"")
+                    << std::endl
+            );
+        }
 
-    rule<Iterator, space_type> expression, term, factor;
-    std::vector<int>& code;
-};
+        qi::rule<Iterator, ascii::space_type> expression, term, factor;
+        std::vector<int>& code;
+    };
+
+    template <typename Grammar>
+    bool compile(Grammar const& calc, std::string const& expr)
+    {
+        std::string::const_iterator iter = expr.begin();
+        std::string::const_iterator end = expr.end();
+        bool r = phrase_parse(iter, end, calc, ascii::space);
 
-template <typename Grammar>
-bool compile(Grammar const& calc, std::string const& expr)
-{
-    std::string::const_iterator iter = expr.begin();
-    std::string::const_iterator end = expr.end();
-    bool r = phrase_parse(iter, end, calc, space);
-
-    if (r && iter == end)
-    {
-        std::cout << "-------------------------\n";
-        std::cout << "Parsing succeeded\n";
-        std::cout << "-------------------------\n";
-        return true;
-    }
-    else
-    {
-        std::cout << "-------------------------\n";
-        std::cout << "Parsing failed\n";
-        std::cout << "-------------------------\n";
-        return false;
+        if (r && iter == end)
+        {
+            std::cout << "-------------------------\n";
+            std::cout << "Parsing succeeded\n";
+            std::cout << "-------------------------\n";
+            return true;
+        }
+        else
+        {
+            std::cout << "-------------------------\n";
+            std::cout << "Parsing failed\n";
+            std::cout << "-------------------------\n";
+            return false;
+        }
     }
 }
 
@@ -200,9 +207,9 @@
     std::cout << "Type an expression...or [q or Q] to quit\n\n";
 
     typedef std::string::const_iterator iterator_type;
-    typedef calculator<iterator_type> calculator;
+    typedef client::calculator<iterator_type> calculator;
 
-    vmachine mach;                  //  Our virtual machine
+    client::vmachine mach;          //  Our virtual machine
     std::vector<int> code;          //  Our VM code
     calculator calc(code);          //  Our grammar
 
@@ -213,7 +220,7 @@
             break;
 
         code.clear();
-        if (::compile(calc, str))
+        if (client::compile(calc, str))
         {
             mach.execute(code);
             std::cout << "\n\nresult = " << mach.top() << std::endl;
Modified: trunk/libs/spirit/example/qi/calc6/calc6.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,6 +21,8 @@
 template <typename Grammar>
 bool compile(Grammar const& calc, std::string const& expr)
 {
+    using ascii::space;
+
     std::string::const_iterator iter = expr.begin();
     std::string::const_iterator end = expr.end();
     bool r = phrase_parse(iter, end, calc, space);
Modified: trunk/libs/spirit/example/qi/calc6/calc6.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6.hpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -18,14 +18,14 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
 using boost::phoenix::function;
 using boost::phoenix::ref;
 
+using boost::spirit::qi::unused_type;
+
+namespace qi = boost::spirit::qi;
+namespace ascii = boost::spirit::ascii;
+
 ///////////////////////////////////////////////////////////////////////////////
 //  The Virtual Machine
 ///////////////////////////////////////////////////////////////////////////////
@@ -105,7 +105,7 @@
 
     template <typename Iterator>
     void operator()(
-        std::string const& what
+        qi::info const& what
       , Iterator err_pos, Iterator last) const
     {
         std::cout
@@ -125,16 +125,16 @@
 //  Our expression grammar and compiler
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Iterator>
-struct expression : grammar<Iterator, space_type>
+struct expression : qi::grammar<Iterator, ascii::space_type>
 {
-    expression(std::vector<int>& code, symbols<char, int>& vars);
+    expression(std::vector<int>& code, qi::symbols<char, int>& vars);
 
-    rule<Iterator, space_type>
+    qi::rule<Iterator, ascii::space_type>
         expr, additive_expr, multiplicative_expr
       , unary_expr, primary_expr, variable;
 
     std::vector<int>& code;
-    symbols<char, int>& vars;
+    qi::symbols<char, int>& vars;
     function<compile_op> op;
 };
 
@@ -146,7 +146,7 @@
     template <typename, typename>
     struct result { typedef void type; };
 
-    var_adder(symbols<char, int>& vars)
+    var_adder(qi::symbols<char, int>& vars)
       : vars(vars)
     {
     }
@@ -156,24 +156,24 @@
         vars.add(var.begin(), var.end(), nvars++);
     };
 
-    symbols<char, int>& vars;
+    qi::symbols<char, int>& vars;
 };
 
 template <typename Iterator>
-struct statement : grammar<Iterator, space_type>
+struct statement : qi::grammar<Iterator, ascii::space_type>
 {
     statement(std::vector<int>& code);
 
     std::vector<int>& code;
-    symbols<char, int> vars;
+    qi::symbols<char, int> vars;
     int nvars;
 
     expression<Iterator> expr;
-    rule<Iterator, space_type> start, var_decl;
-    rule<Iterator, std::string(), space_type> identifier;
-    rule<Iterator, int(), space_type> var_ref;
-    rule<Iterator, locals<int>, space_type> assignment;
-    rule<Iterator, void(int), space_type> assignment_rhs;
+    qi::rule<Iterator, ascii::space_type> start, var_decl;
+    qi::rule<Iterator, std::string(), ascii::space_type> identifier;
+    qi::rule<Iterator, int(), ascii::space_type> var_ref;
+    qi::rule<Iterator, qi::locals<int>, ascii::space_type> assignment;
+    qi::rule<Iterator, void(int), ascii::space_type> assignment_rhs;
 
     function<var_adder> add_var;
     function<compile_op> op;
Modified: trunk/libs/spirit/example/qi/calc6/calc6a.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6a.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6a.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/calc6/calc6b.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6b.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6b.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -11,7 +11,7 @@
 void instantiate_expression()
 {
     typedef std::string::const_iterator iterator_type;
-    symbols<char, int> vars;
+    qi::symbols<char, int> vars;
     std::vector<int> code;
     expression<iterator_type> g(code, vars);
 }
Modified: trunk/libs/spirit/example/qi/calc6/calc6b.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6b.hpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6b.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,12 +13,19 @@
 //  Our expression grammar and compiler
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Iterator>
-expression<Iterator>::expression(std::vector<int>& code, symbols<char, int>& vars)
+expression<Iterator>::expression(std::vector<int>& code, qi::symbols<char, int>& vars)
   : expression::base_type(expr)
   , code(code)
   , vars(vars)
   , op(code)
 {
+    using qi::lexeme;
+    using qi::uint_;
+    using namespace qi::labels;
+    using qi::on_error;
+    using qi::fail;
+    using ascii::alnum;
+
     expr =
         additive_expr.alias()
         ;
Modified: trunk/libs/spirit/example/qi/calc6/calc6c.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6c.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6c.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/calc6/calc6c.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc6/calc6c.hpp	(original)
+++ trunk/libs/spirit/example/qi/calc6/calc6c.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,6 +21,15 @@
   , add_var(vars)
   , op(code)
 {
+    using qi::lexeme;
+    using qi::lit;
+    using qi::raw;
+    using namespace qi::labels;
+    using qi::on_error;
+    using qi::fail;
+    using ascii::alnum;
+    using ascii::alpha;
+
     identifier %=
         raw[lexeme[alpha >> *(alnum | '_')]]
         ;
@@ -48,7 +57,7 @@
 
     assignment_rhs =
             expr
-        >   char_(';')      [op(op_store, _r1)]
+        >   lit(';')        [op(op_store, _r1)]
         ;
 
     start = +(var_decl | assignment);
@@ -62,4 +71,4 @@
     on_error<fail>(start, error_handler(_4, _3, _2));
 }
 
-#endif
\ No newline at end of file
+#endif
Modified: trunk/libs/spirit/example/qi/calc7/calc7.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -17,6 +17,8 @@
 template <typename Grammar>
 bool compile(Grammar const& calc, std::string const& expr)
 {
+    using ascii::space;
+
     std::string::const_iterator iter = expr.begin();
     std::string::const_iterator end = expr.end();
     bool r = phrase_parse(iter, end, calc, space);
Modified: trunk/libs/spirit/example/qi/calc7/calc7.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7.hpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -18,15 +18,15 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
 using boost::phoenix::function;
 using boost::phoenix::ref;
 using boost::phoenix::size;
 
+using boost::spirit::qi::unused_type;
+
+namespace qi = boost::spirit::qi;
+namespace ascii = boost::spirit::ascii;
+
 ///////////////////////////////////////////////////////////////////////////////
 //  The Virtual Machine
 ///////////////////////////////////////////////////////////////////////////////
@@ -124,7 +124,7 @@
 
     template <typename Iterator>
     void operator()(
-        std::string const& what
+        qi::info const& what
       , Iterator err_pos, Iterator last) const
     {
         std::cout
@@ -144,18 +144,18 @@
 //  Our expression grammar and compiler
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Iterator>
-struct expression : grammar<Iterator, space_type>
+struct expression : qi::grammar<Iterator, ascii::space_type>
 {
-    expression(std::vector<int>& code, symbols<char, int>& vars);
+    expression(std::vector<int>& code, qi::symbols<char, int>& vars);
 
-    rule<Iterator, space_type>
+    qi::rule<Iterator, ascii::space_type>
         expr, equality_expr, relational_expr
       , logical_expr, additive_expr, multiplicative_expr
       , unary_expr, primary_expr, variable
     ;
 
     std::vector<int>& code;
-    symbols<char, int>& vars;
+    qi::symbols<char, int>& vars;
     function<compile_op> op;
 };
 
@@ -167,7 +167,7 @@
     template <typename, typename>
     struct result { typedef void type; };
 
-    var_adder(symbols<char, int>& vars)
+    var_adder(qi::symbols<char, int>& vars)
       : vars(vars)
     {
     }
@@ -177,29 +177,29 @@
         vars.add(var.begin(), var.end(), nvars++);
     };
 
-    symbols<char, int>& vars;
+    qi::symbols<char, int>& vars;
 };
 
 template <typename Iterator>
-struct statement : grammar<Iterator, space_type>
+struct statement : qi::grammar<Iterator, ascii::space_type>
 {
     statement(std::vector<int>& code);
 
     std::vector<int>& code;
-    symbols<char, int> vars;
+    qi::symbols<char, int> vars;
     int nvars;
 
     expression<Iterator> expr;
-    rule<Iterator, space_type>
+    qi::rule<Iterator, ascii::space_type>
         statement_, statement_list, var_decl, compound_statement
     ;
 
-    rule<Iterator, locals<int>, space_type> if_statement;
-    rule<Iterator, locals<int, int>, space_type> while_statement;
-    rule<Iterator, std::string(), space_type> identifier;
-    rule<Iterator, int(), space_type> var_ref;
-    rule<Iterator, locals<int>, space_type> assignment;
-    rule<Iterator, void(int), space_type> assignment_rhs;
+    qi::rule<Iterator, qi::locals<int>, ascii::space_type> if_statement;
+    qi::rule<Iterator, qi::locals<int, int>, ascii::space_type> while_statement;
+    qi::rule<Iterator, std::string(), ascii::space_type> identifier;
+    qi::rule<Iterator, int(), ascii::space_type> var_ref;
+    qi::rule<Iterator, qi::locals<int>, ascii::space_type> assignment;
+    qi::rule<Iterator, void(int), ascii::space_type> assignment_rhs;
 
     function<var_adder> add_var;
     function<compile_op> op;
Modified: trunk/libs/spirit/example/qi/calc7/calc7a.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7a.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7a.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/calc7/calc7b.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7b.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7b.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -11,7 +11,7 @@
 void instantiate_expression()
 {
     typedef std::string::const_iterator iterator_type;
-    symbols<char, int> vars;
+    qi::symbols<char, int> vars;
     std::vector<int> code;
     expression<iterator_type> g(code, vars);
 }
Modified: trunk/libs/spirit/example/qi/calc7/calc7b.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7b.hpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7b.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,12 +13,20 @@
 //  Our expression grammar and compiler
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Iterator>
-expression<Iterator>::expression(std::vector<int>& code, symbols<char, int>& vars)
+expression<Iterator>::expression(std::vector<int>& code, qi::symbols<char, int>& vars)
   : expression::base_type(expr)
   , code(code)
   , vars(vars)
   , op(code)
 {
+    using qi::lexeme;
+    using qi::lit;
+    using qi::uint_;
+    using namespace qi::labels;
+    using qi::on_error;
+    using qi::fail;
+    using ascii::alnum;
+
     expr =
         equality_expr.alias()
         ;
Modified: trunk/libs/spirit/example/qi/calc7/calc7c.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7c.cpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7c.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/calc7/calc7c.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/calc7/calc7c.hpp	(original)
+++ trunk/libs/spirit/example/qi/calc7/calc7c.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,6 +21,15 @@
   , add_var(vars)
   , op(code)
 {
+    using qi::lexeme;
+    using qi::lit;
+    using qi::raw;
+    using namespace qi::labels;
+    using qi::on_error;
+    using qi::fail;
+    using ascii::alnum;
+    using ascii::alpha;
+
     identifier %=
         raw[lexeme[alpha >> *(alnum | '_')]]
         ;
@@ -48,7 +57,7 @@
 
     assignment_rhs =
             expr
-        >   char_(';')       [op(op_store, _r1)]
+        >   lit(';')        [op(op_store, _r1)]
         ;
 
     if_statement =
Modified: trunk/libs/spirit/example/qi/complex_number.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/complex_number.cpp	(original)
+++ trunk/libs/spirit/example/qi/complex_number.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -22,37 +22,40 @@
 #include <string>
 #include <complex>
 
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
 ///////////////////////////////////////////////////////////////////////////////
 //  Our complex number parser/compiler
 ///////////////////////////////////////////////////////////////////////////////
 //[tutorial_complex_number
-template <typename Iterator>
-bool parse_complex(Iterator first, Iterator last, std::complex<double>& c)
+namespace client
 {
-    double rN = 0.0;
-    double iN = 0.0;
-    bool r = phrase_parse(first, last,
-
-        //  Begin grammar
-        (
-                '(' >> double_[ref(rN) = _1]
-                    >> -(',' >> double_[ref(iN) = _1]) >> ')'
-            |   double_[ref(rN) = _1]
-        ),
-        //  End grammar
-
-        space);
-
-    if (!r || first != last) // fail if we did not get a full match
-        return false;
-    c = std::complex<double>(rN, iN);
-    return r;
+    template <typename Iterator>
+    bool parse_complex(Iterator first, Iterator last, std::complex<double>& c)
+    {
+        using boost::spirit::qi::double_;
+        using boost::spirit::qi::_1;
+        using boost::spirit::qi::phrase_parse;
+        using boost::spirit::ascii::space;
+        using boost::phoenix::ref;
+
+        double rN = 0.0;
+        double iN = 0.0;
+        bool r = phrase_parse(first, last,
+
+            //  Begin grammar
+            (
+                    '(' >> double_[ref(rN) = _1]
+                        >> -(',' >> double_[ref(iN) = _1]) >> ')'
+                |   double_[ref(rN) = _1]
+            ),
+            //  End grammar
+
+            space);
+
+        if (!r || first != last) // fail if we did not get a full match
+            return false;
+        c = std::complex<double>(rN, iN);
+        return r;
+    }
 }
 //]
 
@@ -76,7 +79,7 @@
             break;
 
         std::complex<double> c;
-        if (parse_complex(str.begin(), str.end(), c))
+        if (client::parse_complex(str.begin(), str.end(), c))
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
Modified: trunk/libs/spirit/example/qi/employee.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/employee.cpp	(original)
+++ trunk/libs/spirit/example/qi/employee.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -25,30 +25,32 @@
 #include <string>
 #include <complex>
 
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our employee struct
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_employee_struct
-struct employee
+namespace client
 {
-    int age;
-    std::string surname;
-    std::string forename;
-    double salary;
-};
-//]
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our employee struct
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_employee_struct
+    struct employee
+    {
+        int age;
+        std::string surname;
+        std::string forename;
+        double salary;
+    };
+    //]
+}
 
 // We need to tell fusion about our employee struct
-// to make it a first-class fusion citizen
+// to make it a first-class fusion citizen. This has to
+// be in global scope.
+
 //[tutorial_employee_adapt_struct
 BOOST_FUSION_ADAPT_STRUCT(
-    employee,
+    client::employee,
     (int, age)
     (std::string, surname)
     (std::string, forename)
@@ -56,32 +58,41 @@
 )
 //]
 
-///////////////////////////////////////////////////////////////////////////////
-//  Our employee parser
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_employee_parser
-template <typename Iterator>
-struct employee_parser : grammar<Iterator, employee(), space_type>
+namespace client
 {
-    employee_parser() : employee_parser::base_type(start)
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Our employee parser
+    ///////////////////////////////////////////////////////////////////////////////
+    //[tutorial_employee_parser
+    template <typename Iterator>
+    struct employee_parser : qi::grammar<Iterator, employee(), ascii::space_type>
     {
-        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
-
-        start %=
-            lit("employee")
-            >> '{'
-            >>  int_ >> ','
-            >>  quoted_string >> ','
-            >>  quoted_string >> ','
-            >>  double_
-            >>  '}'
-            ;
-    }
+        employee_parser() : employee_parser::base_type(start)
+        {
+            using qi::int_;
+            using qi::lit;
+            using qi::double_;
+            using qi::lexeme;
+            using ascii::char_;
+
+            quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
+
+            start %=
+                lit("employee")
+                >> '{'
+                >>  int_ >> ','
+                >>  quoted_string >> ','
+                >>  quoted_string >> ','
+                >>  double_
+                >>  '}'
+                ;
+        }
 
-    rule<Iterator, std::string(), space_type> quoted_string;
-    rule<Iterator, employee(), space_type> start;
-};
-//]
+        qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
+        qi::rule<Iterator, employee(), ascii::space_type> start;
+    };
+    //]
+}
 
 ////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -98,8 +109,9 @@
         << "employee{age, \"surname\", \"forename\", salary } \n";
     std::cout << "Type [q or Q] to quit\n\n";
 
+    using boost::spirit::ascii::space;
     typedef std::string::const_iterator iterator_type;
-    typedef employee_parser<iterator_type> employee_parser;
+    typedef client::employee_parser<iterator_type> employee_parser;
 
     employee_parser g; // Our grammar
     std::string str;
@@ -108,10 +120,10 @@
         if (str.empty() || str[0] == 'q' || str[0] == 'Q')
             break;
 
-        employee emp;
+        client::employee emp;
         std::string::const_iterator iter = str.begin();
         std::string::const_iterator end = str.end();
-        bool r = phrase_parse(iter, end, g, emp, space);
+        bool r = phrase_parse(iter, end, g, space, emp);
 
         if (r && iter == end)
         {
Modified: trunk/libs/spirit/example/qi/mini_c/mini_c.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_c.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_c.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -85,7 +85,7 @@
     {
         std::string fmain("main");
         std::string::iterator fbegin = fmain.begin();
-        function_info* f = prog.functions.lookup()->find(fbegin, fmain.end());
+        function_info* f = prog.functions.lookup->find(fbegin, fmain.end());
         if (f == 0)
         {
             std::cerr << "Error: main function not defined" << std::endl;
Modified: trunk/libs/spirit/example/qi/mini_c/mini_c.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_c.hpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_c.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -20,15 +20,14 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
 using boost::phoenix::function;
 using boost::phoenix::ref;
 using boost::phoenix::size;
 
+using namespace boost::spirit;
+using namespace boost::spirit::qi;
+using namespace boost::spirit::ascii;
+
 ///////////////////////////////////////////////////////////////////////////////
 //  The Virtual Machine
 ///////////////////////////////////////////////////////////////////////////////
@@ -152,7 +151,7 @@
 
     template <typename Iterator>
     void operator()(
-        std::string const& what
+        info const& what
       , Iterator err_pos, Iterator last) const
     {
         std::cout
Modified: trunk/libs/spirit/example/qi/mini_c/mini_ca.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_ca.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_ca.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/mini_c/mini_cb.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_cb.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_cb.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/mini_c/mini_cb.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_cb.hpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_cb.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -96,7 +96,7 @@
                 expr                        [++_b]
                 >> *(',' > expr             [++_b])
             )
-        >   char_(')')                      [op(_a, _b, pass)]
+        >   lit(')')                        [op(_a, _b, pass)]
         ;
 
     expr.name("expression");
@@ -110,7 +110,7 @@
     variable.name("variable");
     function_call.name("function-call");
 
-    on_error<fail>(expr, error_handler(_4, _3, _2));
+    on_error<fail>(expr, ::error_handler(_4, _3, _2)); // $$$ fix!
 }
 
 #endif
Modified: trunk/libs/spirit/example/qi/mini_c/mini_cc.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_cc.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_cc.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/mini_c/mini_cc.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_cc.hpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_cc.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -50,7 +50,7 @@
 
     assignment_rhs =
             expr
-        >   char_(';')      [op(op_store, _r1)]
+        >   lit(';')        [op(op_store, _r1)]
         ;
 
     if_statement =
@@ -137,7 +137,7 @@
     statement_.name("statement");
     statement_list.name("statement-list");
 
-    on_error<fail>(statement_list, error_handler(_4, _3, _2));
+    on_error<fail>(statement_list, ::error_handler(_4, _3, _2));
 }
 
 #endif
Modified: trunk/libs/spirit/example/qi/mini_c/mini_cd.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_cd.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_cd.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/example/qi/mini_c/mini_cd.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_c/mini_cd.hpp	(original)
+++ trunk/libs/spirit/example/qi/mini_c/mini_cd.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -42,7 +42,7 @@
                 >> *(',' > identifier           [add_var(_1)])
             )
         >   ')'
-        >   char_('{')                          [
+        >   lit('{')                            [
                                                     _b = size(ref(code)),
                                                     add_function(
                                                         _a     // function name
@@ -52,7 +52,7 @@
                                                     op(op_stk_adj, 0)   // adjust this later
                                                 ]
         >   statement
-        >   char_('}')                          [state_reset(_b)]
+        >   lit('}')                            [state_reset(_b)]
         ;
 
     start =
@@ -63,7 +63,7 @@
     function.name("function");
     start.name("program");
 
-    on_error<fail>(start, error_handler(_4, _3, _2));
+    on_error<fail>(start, ::error_handler(_4, _3, _2));
 }
 
 #endif
Modified: trunk/libs/spirit/example/qi/mini_xml1.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_xml1.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_xml1.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -27,147 +27,156 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-namespace fusion = boost::fusion;
-namespace phoenix = boost::phoenix;
-
-using phoenix::at_c;
-using phoenix::push_back;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our mini XML tree representation
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_xml1_structures
-struct mini_xml;
-
-typedef
-    boost::variant<
-        boost::recursive_wrapper<mini_xml>
-      , std::string
-    >
-mini_xml_node;
-
-struct mini_xml
+namespace client
 {
-    std::string name;                           // tag name
-    std::vector<mini_xml_node> children;        // children
-};
-//]
+    namespace fusion = boost::fusion;
+    namespace phoenix = boost::phoenix;
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our mini XML tree representation
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_xml1_structures
+    struct mini_xml;
+
+    typedef
+        boost::variant<
+            boost::recursive_wrapper<mini_xml>
+          , std::string
+        >
+    mini_xml_node;
+
+    struct mini_xml
+    {
+        std::string name;                           // tag name
+        std::vector<mini_xml_node> children;        // children
+    };
+    //]
+}
 
 // We need to tell fusion about our mini_xml struct
 // to make it a first-class fusion citizen
 //[tutorial_xml1_adapt_structures
 BOOST_FUSION_ADAPT_STRUCT(
-    mini_xml,
+    client::mini_xml,
     (std::string, name)
-    (std::vector<mini_xml_node>, children)
+    (std::vector<client::mini_xml_node>, children)
 )
 //]
 
-///////////////////////////////////////////////////////////////////////////////
-//  Print out the mini xml tree
-///////////////////////////////////////////////////////////////////////////////
-int const tabsize = 4;
-
-void tab(int indent)
+namespace client
 {
-    for (int i = 0; i < indent; ++i)
-        std::cout << ' ';
+    ///////////////////////////////////////////////////////////////////////////
+    //  Print out the mini xml tree
+    ///////////////////////////////////////////////////////////////////////////
+    int const tabsize = 4;
+
+    void tab(int indent)
+    {
+        for (int i = 0; i < indent; ++i)
+            std::cout << ' ';
+    }
+
+    struct mini_xml_printer
+    {
+        mini_xml_printer(int indent = 0)
+          : indent(indent)
+        {
+        }
+
+        void operator()(mini_xml const& xml) const;
+
+        int indent;
+    };
+
+    struct mini_xml_node_printer : boost::static_visitor<>
+    {
+        mini_xml_node_printer(int indent = 0)
+          : indent(indent)
+        {
+        }
+
+        void operator()(mini_xml const& xml) const
+        {
+            mini_xml_printer(indent+tabsize)(xml);
+        }
+
+        void operator()(std::string const& text) const
+        {
+            tab(indent+tabsize);
+            std::cout << "text: \"" << text << '"' << std::endl;
+        }
+
+        int indent;
+    };
+
+    void mini_xml_printer::operator()(mini_xml const& xml) const
+    {
+        tab(indent);
+        std::cout << "tag: " << xml.name << std::endl;
+        tab(indent);
+        std::cout << '{' << std::endl;
+
+        BOOST_FOREACH(mini_xml_node const& node, xml.children)
+        {
+            boost::apply_visitor(mini_xml_node_printer(indent), node);
+        }
+
+        tab(indent);
+        std::cout << '}' << std::endl;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our mini XML grammar definition
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_xml1_grammar
+    template <typename Iterator>
+    struct mini_xml_grammar : qi::grammar<Iterator, mini_xml(), ascii::space_type>
+    {
+        mini_xml_grammar() : mini_xml_grammar::base_type(xml)
+        {
+            using qi::lit;
+            using qi::lexeme;
+            using ascii::char_;
+            using ascii::string;
+            using namespace qi::labels;
+
+            using phoenix::at_c;
+            using phoenix::push_back;
+
+            text = lexeme[+(char_ - '<')        [_val += _1]];
+            node = (xml | text)                 [_val = _1];
+
+            start_tag =
+                    '<'
+                >>  !lit('/')
+                >>  lexeme[+(char_ - '>')       [_val += _1]]
+                >>  '>'
+            ;
+
+            end_tag =
+                    "</"
+                >>  string(_r1)
+                >>  '>'
+            ;
+
+            xml =
+                    start_tag                   [at_c<0>(_val) = _1]
+                >>  *node                       [push_back(at_c<1>(_val), _1)]
+                >>  end_tag(at_c<0>(_val))
+            ;
+        }
+
+        qi::rule<Iterator, mini_xml(), ascii::space_type> xml;
+        qi::rule<Iterator, mini_xml_node(), ascii::space_type> node;
+        qi::rule<Iterator, std::string(), ascii::space_type> text;
+        qi::rule<Iterator, std::string(), ascii::space_type> start_tag;
+        qi::rule<Iterator, void(std::string), ascii::space_type> end_tag;
+    };
+    //]
 }
 
-struct mini_xml_printer
-{
-    mini_xml_printer(int indent = 0)
-      : indent(indent)
-    {
-    }
-
-    void operator()(mini_xml const& xml) const;
-
-    int indent;
-};
-
-struct mini_xml_node_printer : boost::static_visitor<>
-{
-    mini_xml_node_printer(int indent = 0)
-      : indent(indent)
-    {
-    }
-
-    void operator()(mini_xml const& xml) const
-    {
-        mini_xml_printer(indent+tabsize)(xml);
-    }
-
-    void operator()(std::string const& text) const
-    {
-        tab(indent+tabsize);
-        std::cout << "text: \"" << text << '"' << std::endl;
-    }
-
-    int indent;
-};
-
-void mini_xml_printer::operator()(mini_xml const& xml) const
-{
-    tab(indent);
-    std::cout << "tag: " << xml.name << std::endl;
-    tab(indent);
-    std::cout << '{' << std::endl;
-
-    BOOST_FOREACH(mini_xml_node const& node, xml.children)
-    {
-        boost::apply_visitor(mini_xml_node_printer(indent), node);
-    }
-
-    tab(indent);
-    std::cout << '}' << std::endl;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our mini XML grammar definition
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_xml1_grammar
-template <typename Iterator>
-struct mini_xml_grammar : grammar<Iterator, mini_xml(), space_type>
-{
-    mini_xml_grammar() : mini_xml_grammar::base_type(xml)
-    {
-        text = lexeme[+(char_ - '<')        [_val += _1]];
-        node = (xml | text)                 [_val = _1];
-
-        start_tag =
-                '<'
-            >>  !char_('/')
-            >>  lexeme[+(char_ - '>')       [_val += _1]]
-            >>  '>'
-        ;
-
-        end_tag =
-                "</"
-            >>  lit(_r1)
-            >>  '>'
-        ;
-
-        xml =
-                start_tag                   [at_c<0>(_val) = _1]
-            >>  *node                       [push_back(at_c<1>(_val), _1)]
-            >>  end_tag(at_c<0>(_val))
-        ;
-    }
-
-    rule<Iterator, mini_xml(), space_type> xml;
-    rule<Iterator, mini_xml_node(), space_type> node;
-    rule<Iterator, std::string(), space_type> text;
-    rule<Iterator, std::string(), space_type> start_tag;
-    rule<Iterator, void(std::string), space_type> end_tag;
-};
-//]
-
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
 ///////////////////////////////////////////////////////////////////////////////
@@ -200,20 +209,21 @@
         std::istream_iterator<char>(),
         std::back_inserter(storage));
 
-    typedef mini_xml_grammar<std::string::const_iterator> mini_xml_grammar;
+    typedef client::mini_xml_grammar<std::string::const_iterator> mini_xml_grammar;
     mini_xml_grammar xml; // Our grammar
-    mini_xml ast; // our tree
+    client::mini_xml ast; // Our tree
 
+    using boost::spirit::ascii::space;
     std::string::const_iterator iter = storage.begin();
     std::string::const_iterator end = storage.end();
-    bool r = phrase_parse(iter, end, xml, ast, space);
+    bool r = phrase_parse(iter, end, xml, space, ast);
 
     if (r && iter == end)
     {
         std::cout << "-------------------------\n";
         std::cout << "Parsing succeeded\n";
         std::cout << "-------------------------\n";
-        mini_xml_printer printer;
+        client::mini_xml_printer printer;
         printer(ast);
         return 0;
     }
Modified: trunk/libs/spirit/example/qi/mini_xml2.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_xml2.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_xml2.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -27,145 +27,151 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-namespace fusion = boost::fusion;
-namespace phoenix = boost::phoenix;
-
-using phoenix::at_c;
-using phoenix::push_back;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our mini XML tree representation
-///////////////////////////////////////////////////////////////////////////////
-struct mini_xml;
-
-typedef
-    boost::variant<
-        boost::recursive_wrapper<mini_xml>
-      , std::string
-    >
-mini_xml_node;
-
-struct mini_xml
+namespace client
 {
-    std::string name;                           // tag name
-    std::vector<mini_xml_node> children;        // children
-};
+    namespace fusion = boost::fusion;
+    namespace phoenix = boost::phoenix;
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our mini XML tree representation
+    ///////////////////////////////////////////////////////////////////////////
+    struct mini_xml;
+
+    typedef
+        boost::variant<
+            boost::recursive_wrapper<mini_xml>
+          , std::string
+        >
+    mini_xml_node;
+
+    struct mini_xml
+    {
+        std::string name;                           // tag name
+        std::vector<mini_xml_node> children;        // children
+    };
+}
 
 // We need to tell fusion about our mini_xml struct
 // to make it a first-class fusion citizen
 BOOST_FUSION_ADAPT_STRUCT(
-    mini_xml,
+    client::mini_xml,
     (std::string, name)
-    (std::vector<mini_xml_node>, children)
+    (std::vector<client::mini_xml_node>, children)
 )
 
-///////////////////////////////////////////////////////////////////////////////
-//  Print out the mini xml tree
-///////////////////////////////////////////////////////////////////////////////
-int const tabsize = 4;
-
-void tab(int indent)
+namespace client
 {
-    for (int i = 0; i < indent; ++i)
-        std::cout << ' ';
+    ///////////////////////////////////////////////////////////////////////////
+    //  Print out the mini xml tree
+    ///////////////////////////////////////////////////////////////////////////
+    int const tabsize = 4;
+
+    void tab(int indent)
+    {
+        for (int i = 0; i < indent; ++i)
+            std::cout << ' ';
+    }
+
+    struct mini_xml_printer
+    {
+        mini_xml_printer(int indent = 0)
+          : indent(indent)
+        {
+        }
+
+        void operator()(mini_xml const& xml) const;
+
+        int indent;
+    };
+
+    struct mini_xml_node_printer : boost::static_visitor<>
+    {
+        mini_xml_node_printer(int indent = 0)
+          : indent(indent)
+        {
+        }
+
+        void operator()(mini_xml const& xml) const
+        {
+            mini_xml_printer(indent+tabsize)(xml);
+        }
+
+        void operator()(std::string const& text) const
+        {
+            tab(indent+tabsize);
+            std::cout << "text: \"" << text << '"' << std::endl;
+        }
+
+        int indent;
+    };
+
+    void mini_xml_printer::operator()(mini_xml const& xml) const
+    {
+        tab(indent);
+        std::cout << "tag: " << xml.name << std::endl;
+        tab(indent);
+        std::cout << '{' << std::endl;
+
+        BOOST_FOREACH(mini_xml_node const& node, xml.children)
+        {
+            boost::apply_visitor(mini_xml_node_printer(indent), node);
+        }
+
+        tab(indent);
+        std::cout << '}' << std::endl;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our mini XML grammar definition
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_xml2_grammar
+    template <typename Iterator>
+    struct mini_xml_grammar
+      : qi::grammar<Iterator, mini_xml(), qi::locals<std::string>, ascii::space_type>
+    {
+        mini_xml_grammar()
+          : mini_xml_grammar::base_type(xml)
+        {
+            using qi::lit;
+            using qi::lexeme;
+            using ascii::char_;
+            using ascii::string;
+            using namespace qi::labels;
+
+            text %= lexeme[+(char_ - '<')];
+            node %= xml | text;
+
+            start_tag %=
+                    '<'
+                >>  !lit('/')
+                >>  lexeme[+(char_ - '>')]
+                >>  '>'
+            ;
+
+            end_tag =
+                    "</"
+                >>  string(_r1)
+                >>  '>'
+            ;
+
+            xml %=
+                    start_tag[_a = _1]
+                >>  *node
+                >>  end_tag(_a)
+            ;
+        }
+
+        qi::rule<Iterator, mini_xml(), qi::locals<std::string>, ascii::space_type> xml;
+        qi::rule<Iterator, mini_xml_node(), ascii::space_type> node;
+        qi::rule<Iterator, std::string(), ascii::space_type> text;
+        qi::rule<Iterator, std::string(), ascii::space_type> start_tag;
+        qi::rule<Iterator, void(std::string), ascii::space_type> end_tag;
+    };
+    //]
 }
 
-struct mini_xml_printer
-{
-    mini_xml_printer(int indent = 0)
-      : indent(indent)
-    {
-    }
-
-    void operator()(mini_xml const& xml) const;
-
-    int indent;
-};
-
-struct mini_xml_node_printer : boost::static_visitor<>
-{
-    mini_xml_node_printer(int indent = 0)
-      : indent(indent)
-    {
-    }
-
-    void operator()(mini_xml const& xml) const
-    {
-        mini_xml_printer(indent+tabsize)(xml);
-    }
-
-    void operator()(std::string const& text) const
-    {
-        tab(indent+tabsize);
-        std::cout << "text: \"" << text << '"' << std::endl;
-    }
-
-    int indent;
-};
-
-void mini_xml_printer::operator()(mini_xml const& xml) const
-{
-    tab(indent);
-    std::cout << "tag: " << xml.name << std::endl;
-    tab(indent);
-    std::cout << '{' << std::endl;
-
-    BOOST_FOREACH(mini_xml_node const& node, xml.children)
-    {
-        boost::apply_visitor(mini_xml_node_printer(indent), node);
-    }
-
-    tab(indent);
-    std::cout << '}' << std::endl;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our mini XML grammar definition
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_xml2_grammar
-template <typename Iterator>
-struct mini_xml_grammar
-  : grammar<Iterator, mini_xml(), locals<std::string>, space_type>
-{
-    mini_xml_grammar()
-      : mini_xml_grammar::base_type(xml)
-    {
-        text %= lexeme[+(char_ - '<')];
-        node %= xml | text;
-
-        start_tag %=
-                '<'
-            >>  !char_('/')
-            >>  lexeme[+(char_ - '>')]
-            >>  '>'
-        ;
-
-        end_tag =
-                "</"
-            >>  lit(_r1)
-            >>  '>'
-        ;
-
-        xml %=
-                start_tag[_a = _1]
-            >>  *node
-            >>  end_tag(_a)
-        ;
-    }
-
-    rule<Iterator, mini_xml(), locals<std::string>, space_type> xml;
-    rule<Iterator, mini_xml_node(), space_type> node;
-    rule<Iterator, std::string(), space_type> text;
-    rule<Iterator, std::string(), space_type> start_tag;
-    rule<Iterator, void(std::string), space_type> end_tag;
-};
-//]
-
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
 ///////////////////////////////////////////////////////////////////////////////
@@ -198,20 +204,21 @@
         std::istream_iterator<char>(),
         std::back_inserter(storage));
 
-    typedef mini_xml_grammar<std::string::const_iterator> mini_xml_grammar;
+    typedef client::mini_xml_grammar<std::string::const_iterator> mini_xml_grammar;
     mini_xml_grammar xml; // Our grammar
-    mini_xml ast; // our tree
+    client::mini_xml ast; // Our tree
 
+    using boost::spirit::ascii::space;
     std::string::const_iterator iter = storage.begin();
     std::string::const_iterator end = storage.end();
-    bool r = phrase_parse(iter, end, xml, ast, space);
+    bool r = phrase_parse(iter, end, xml, space, ast);
 
     if (r && iter == end)
     {
         std::cout << "-------------------------\n";
         std::cout << "Parsing succeeded\n";
         std::cout << "-------------------------\n";
-        mini_xml_printer printer;
+        client::mini_xml_printer printer;
         printer(ast);
         return 0;
     }
Modified: trunk/libs/spirit/example/qi/mini_xml3.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/mini_xml3.cpp	(original)
+++ trunk/libs/spirit/example/qi/mini_xml3.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -28,165 +28,174 @@
 #include <string>
 #include <vector>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-namespace fusion = boost::fusion;
-namespace phoenix = boost::phoenix;
-
-using phoenix::at_c;
-using phoenix::push_back;
-using phoenix::val;
-using phoenix::construct;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our mini XML tree representation
-///////////////////////////////////////////////////////////////////////////////
-struct mini_xml;
-
-typedef
-    boost::variant<
-        boost::recursive_wrapper<mini_xml>
-      , std::string
-    >
-mini_xml_node;
-
-struct mini_xml
+namespace client
 {
-    std::string name;                           // tag name
-    std::vector<mini_xml_node> children;        // children
-};
+    namespace fusion = boost::fusion;
+    namespace phoenix = boost::phoenix;
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our mini XML tree representation
+    ///////////////////////////////////////////////////////////////////////////
+    struct mini_xml;
+
+    typedef
+        boost::variant<
+            boost::recursive_wrapper<mini_xml>
+          , std::string
+        >
+    mini_xml_node;
+
+    struct mini_xml
+    {
+        std::string name;                           // tag name
+        std::vector<mini_xml_node> children;        // children
+    };
+}
 
 // We need to tell fusion about our mini_xml struct
 // to make it a first-class fusion citizen
 BOOST_FUSION_ADAPT_STRUCT(
-    mini_xml,
+    client::mini_xml,
     (std::string, name)
-    (std::vector<mini_xml_node>, children)
+    (std::vector<client::mini_xml_node>, children)
 )
 
-///////////////////////////////////////////////////////////////////////////////
-//  Print out the mini xml tree
-///////////////////////////////////////////////////////////////////////////////
-int const tabsize = 4;
-
-void tab(int indent)
+namespace client
 {
-    for (int i = 0; i < indent; ++i)
-        std::cout << ' ';
+    ///////////////////////////////////////////////////////////////////////////
+    //  Print out the mini xml tree
+    ///////////////////////////////////////////////////////////////////////////
+    int const tabsize = 4;
+
+    void tab(int indent)
+    {
+        for (int i = 0; i < indent; ++i)
+            std::cout << ' ';
+    }
+
+    struct mini_xml_printer
+    {
+        mini_xml_printer(int indent = 0)
+          : indent(indent)
+        {
+        }
+
+        void operator()(mini_xml const& xml) const;
+
+        int indent;
+    };
+
+    struct mini_xml_node_printer : boost::static_visitor<>
+    {
+        mini_xml_node_printer(int indent = 0)
+          : indent(indent)
+        {
+        }
+
+        void operator()(mini_xml const& xml) const
+        {
+            mini_xml_printer(indent+tabsize)(xml);
+        }
+
+        void operator()(std::string const& text) const
+        {
+            tab(indent+tabsize);
+            std::cout << "text: \"" << text << '"' << std::endl;
+        }
+
+        int indent;
+    };
+
+    void mini_xml_printer::operator()(mini_xml const& xml) const
+    {
+        tab(indent);
+        std::cout << "tag: " << xml.name << std::endl;
+        tab(indent);
+        std::cout << '{' << std::endl;
+
+        BOOST_FOREACH(mini_xml_node const& node, xml.children)
+        {
+            boost::apply_visitor(mini_xml_node_printer(indent), node);
+        }
+
+        tab(indent);
+        std::cout << '}' << std::endl;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our mini XML grammar definition
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_xml3_grammar
+    template <typename Iterator>
+    struct mini_xml_grammar
+      : qi::grammar<Iterator, mini_xml(), qi::locals<std::string>, ascii::space_type>
+    {
+        mini_xml_grammar()
+          : mini_xml_grammar::base_type(xml, "xml")
+        {
+            using qi::lit;
+            using qi::lexeme;
+            using qi::on_error;
+            using qi::fail;
+            using ascii::char_;
+            using ascii::string;
+            using namespace qi::labels;
+
+            using phoenix::construct;
+            using phoenix::val;
+
+            text %= lexeme[+(char_ - '<')];
+            node %= xml | text;
+
+            start_tag %=
+                    '<'
+                >>  !lit('/')
+                >   lexeme[+(char_ - '>')]
+                >   '>'
+            ;
+
+            end_tag =
+                    "</"
+                >   string(_r1)
+                >   '>'
+            ;
+
+            xml %=
+                    start_tag[_a = _1]
+                >   *node
+                >   end_tag(_a)
+            ;
+
+            xml.name("xml");
+            node.name("node");
+            text.name("text");
+            start_tag.name("start_tag");
+            end_tag.name("end_tag");
+
+            on_error<fail>
+            (
+                xml
+              , std::cout
+                    << val("Error! Expecting ")
+                    << _4                               // what failed?
+                    << val(" here: \"")
+                    << construct<std::string>(_3, _2)   // iterators to error-pos, end
+                    << val("\"")
+                    << std::endl
+            );
+        }
+
+        qi::rule<Iterator, mini_xml(), qi::locals<std::string>, ascii::space_type> xml;
+        qi::rule<Iterator, mini_xml_node(), ascii::space_type> node;
+        qi::rule<Iterator, std::string(), ascii::space_type> text;
+        qi::rule<Iterator, std::string(), ascii::space_type> start_tag;
+        qi::rule<Iterator, void(std::string), ascii::space_type> end_tag;
+    };
+    //]
 }
 
-struct mini_xml_printer
-{
-    mini_xml_printer(int indent = 0)
-      : indent(indent)
-    {
-    }
-
-    void operator()(mini_xml const& xml) const;
-
-    int indent;
-};
-
-struct mini_xml_node_printer : boost::static_visitor<>
-{
-    mini_xml_node_printer(int indent = 0)
-      : indent(indent)
-    {
-    }
-
-    void operator()(mini_xml const& xml) const
-    {
-        mini_xml_printer(indent+tabsize)(xml);
-    }
-
-    void operator()(std::string const& text) const
-    {
-        tab(indent+tabsize);
-        std::cout << "text: \"" << text << '"' << std::endl;
-    }
-
-    int indent;
-};
-
-void mini_xml_printer::operator()(mini_xml const& xml) const
-{
-    tab(indent);
-    std::cout << "tag: " << xml.name << std::endl;
-    tab(indent);
-    std::cout << '{' << std::endl;
-
-    BOOST_FOREACH(mini_xml_node const& node, xml.children)
-    {
-        boost::apply_visitor(mini_xml_node_printer(indent), node);
-    }
-
-    tab(indent);
-    std::cout << '}' << std::endl;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our mini XML grammar definition
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_xml3_grammar
-template <typename Iterator>
-struct mini_xml_grammar
-  : grammar<Iterator, mini_xml(), locals<std::string>, space_type>
-{
-    mini_xml_grammar()
-      : mini_xml_grammar::base_type(xml, "xml")
-    {
-        text %= lexeme[+(char_ - '<')];
-        node %= xml | text;
-
-        start_tag %=
-                '<'
-            >>  !char_('/')
-            >   lexeme[+(char_ - '>')]
-            >   '>'
-        ;
-
-        end_tag =
-                "</"
-            >   lit(_r1)
-            >   '>'
-        ;
-
-        xml %=
-                start_tag[_a = _1]
-            >   *node
-            >   end_tag(_a)
-        ;
-
-        xml.name("xml");
-        node.name("node");
-        text.name("text");
-        start_tag.name("start_tag");
-        end_tag.name("end_tag");
-
-        on_error<fail>
-        (
-            xml
-          , std::cout
-                << val("Error! Expecting ")
-                << _4                               // what failed?
-                << val(" here: \"")
-                << construct<std::string>(_3, _2)   // iterators to error-pos, end
-                << val("\"")
-                << std::endl
-        );
-    }
-
-    rule<Iterator, mini_xml(), locals<std::string>, space_type> xml;
-    rule<Iterator, mini_xml_node(), space_type> node;
-    rule<Iterator, std::string(), space_type> text;
-    rule<Iterator, std::string(), space_type> start_tag;
-    rule<Iterator, void(std::string), space_type> end_tag;
-};
-//]
-
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
 ///////////////////////////////////////////////////////////////////////////////
@@ -219,20 +228,21 @@
         std::istream_iterator<char>(),
         std::back_inserter(storage));
 
-    typedef mini_xml_grammar<std::string::const_iterator> mini_xml_grammar;
+    typedef client::mini_xml_grammar<std::string::const_iterator> mini_xml_grammar;
     mini_xml_grammar xml; // Our grammar
-    mini_xml ast; // our tree
+    client::mini_xml ast; // Our tree
 
+    using boost::spirit::ascii::space;
     std::string::const_iterator iter = storage.begin();
     std::string::const_iterator end = storage.end();
-    bool r = phrase_parse(iter, end, xml, ast, space);
+    bool r = phrase_parse(iter, end, xml, space, ast);
 
     if (r && iter == end)
     {
         std::cout << "-------------------------\n";
         std::cout << "Parsing succeeded\n";
         std::cout << "-------------------------\n";
-        mini_xml_printer printer;
+        client::mini_xml_printer printer;
         printer(ast);
         return 0;
     }
Modified: trunk/libs/spirit/example/qi/num_list1.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/num_list1.cpp	(original)
+++ trunk/libs/spirit/example/qi/num_list1.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,30 +21,34 @@
 #include <string>
 #include <vector>
 
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our number list parser
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_numlist1
-template <typename Iterator>
-bool parse_numbers(Iterator first, Iterator last)
+namespace client
 {
-    bool r = phrase_parse(
-        first,                          /*< start iterator >*/
-        last,                           /*< end iterator >*/
-        double_ >> *(',' >> double_),   /*< the parser >*/
-        space                           /*< the skip-parser >*/
-    );
-    if (first != last) // fail if we did not get a full match
-        return false;
-    return r;
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our number list parser
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_numlist1
+    template <typename Iterator>
+    bool parse_numbers(Iterator first, Iterator last)
+    {
+        using qi::double_;
+        using qi::phrase_parse;
+        using ascii::space;
+
+        bool r = phrase_parse(
+            first,                          /*< start iterator >*/
+            last,                           /*< end iterator >*/
+            double_ >> *(',' >> double_),   /*< the parser >*/
+            space                           /*< the skip-parser >*/
+        );
+        if (first != last) // fail if we did not get a full match
+            return false;
+        return r;
+    }
+    //]
 }
-//]
 
 ////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -65,7 +69,7 @@
         if (str.empty() || str[0] == 'q' || str[0] == 'Q')
             break;
 
-        if (parse_numbers(str.begin(), str.end()))
+        if (client::parse_numbers(str.begin(), str.end()))
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
Modified: trunk/libs/spirit/example/qi/num_list2.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/num_list2.cpp	(original)
+++ trunk/libs/spirit/example/qi/num_list2.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -24,36 +24,44 @@
 #include <string>
 #include <vector>
 
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our number list compiler
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_numlist2
-template <typename Iterator>
-bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
+namespace client
 {
-    bool r = phrase_parse(first, last,
-
-        //  Begin grammar
-        (
-            double_[push_back(ref(v), _1)]
-                >> *(',' >> double_[push_back(ref(v), _1)])
-        )
-        ,
-        //  End grammar
-
-        space);
-
-    if (first != last) // fail if we did not get a full match
-        return false;
-    return r;
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+    namespace phoenix = boost::phoenix;
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our number list compiler
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_numlist2
+    template <typename Iterator>
+    bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
+    {
+        using qi::double_;
+        using qi::phrase_parse;
+        using qi::_1;
+        using ascii::space;
+        using phoenix::push_back;
+        using phoenix::ref;
+
+        bool r = phrase_parse(first, last,
+
+            //  Begin grammar
+            (
+                double_[push_back(ref(v), _1)]
+                    >> *(',' >> double_[push_back(ref(v), _1)])
+            )
+            ,
+            //  End grammar
+
+            space);
+
+        if (first != last) // fail if we did not get a full match
+            return false;
+        return r;
+    }
+    //]
 }
-//]
 
 ////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -76,7 +84,7 @@
             break;
 
         std::vector<double> v;
-        if (parse_numbers(str.begin(), str.end(), v))
+        if (client::parse_numbers(str.begin(), str.end(), v))
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
Modified: trunk/libs/spirit/example/qi/num_list3.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/num_list3.cpp	(original)
+++ trunk/libs/spirit/example/qi/num_list3.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -24,35 +24,43 @@
 #include <string>
 #include <vector>
 
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our number list compiler
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_numlist3
-template <typename Iterator>
-bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
+namespace client
 {
-    bool r = phrase_parse(first, last,
-
-        //  Begin grammar
-        (
-            double_[push_back(ref(v), _1)] % ','
-        )
-        ,
-        //  End grammar
-
-        space);
-
-    if (first != last) // fail if we did not get a full match
-        return false;
-    return r;
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+    namespace phoenix = boost::phoenix;
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Our number list compiler
+    ///////////////////////////////////////////////////////////////////////////////
+    //[tutorial_numlist3
+    template <typename Iterator>
+    bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
+    {
+        using qi::double_;
+        using qi::phrase_parse;
+        using qi::_1;
+        using ascii::space;
+        using phoenix::push_back;
+        using phoenix::ref;
+
+        bool r = phrase_parse(first, last,
+
+            //  Begin grammar
+            (
+                double_[push_back(ref(v), _1)] % ','
+            )
+            ,
+            //  End grammar
+
+            space);
+
+        if (first != last) // fail if we did not get a full match
+            return false;
+        return r;
+    }
+    //]
 }
-//]
 
 ////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -75,7 +83,7 @@
             break;
 
         std::vector<double> v;
-        if (parse_numbers(str.begin(), str.end(), v))
+        if (client::parse_numbers(str.begin(), str.end(), v))
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
Modified: trunk/libs/spirit/example/qi/num_list4.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/num_list4.cpp	(original)
+++ trunk/libs/spirit/example/qi/num_list4.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -24,35 +24,40 @@
 #include <string>
 #include <vector>
 
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our number list compiler
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_numlist4
-template <typename Iterator>
-bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
+namespace client
 {
-    bool r = phrase_parse(first, last,
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
 
-        //  Begin grammar
-        (
-            double_ % ','
-        )
-        ,
-        //  End grammar
-
-        v, space);
-
-    if (first != last) // fail if we did not get a full match
-        return false;
-    return r;
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our number list compiler
+    ///////////////////////////////////////////////////////////////////////////
+    //[tutorial_numlist4
+    template <typename Iterator>
+    bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
+    {
+        using qi::double_;
+        using qi::phrase_parse;
+        using qi::_1;
+        using ascii::space;
+
+        bool r = phrase_parse(first, last,
+
+            //  Begin grammar
+            (
+                double_ % ','
+            )
+            ,
+            //  End grammar
+
+            space, v);
+
+        if (first != last) // fail if we did not get a full match
+            return false;
+        return r;
+    }
+    //]
 }
-//]
 
 ////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -75,7 +80,7 @@
             break;
 
         std::vector<double> v;
-        if (parse_numbers(str.begin(), str.end(), v))
+        if (client::parse_numbers(str.begin(), str.end(), v))
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
Modified: trunk/libs/spirit/example/qi/roman.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/roman.cpp	(original)
+++ trunk/libs/spirit/example/qi/roman.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,113 +21,119 @@
 #include <iostream>
 #include <string>
 
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-using boost::phoenix::ref;
-
-///////////////////////////////////////////////////////////////////////////////
-//  Parse roman hundreds (100..900) numerals using the symbol table.
-//  Notice that the data associated with each slot is the parser's attribute
-//  (which is passed to attached semantic actions).
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_roman_hundreds
-struct hundreds_ : symbols<char, unsigned>
+namespace client
 {
-    hundreds_()
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Parse roman hundreds (100..900) numerals using the symbol table.
+    //  Notice that the data associated with each slot is the parser's attribute
+    //  (which is passed to attached semantic actions).
+    ///////////////////////////////////////////////////////////////////////////////
+    //[tutorial_roman_hundreds
+    struct hundreds_ : qi::symbols<char, unsigned>
     {
-        add
-            ("C"    , 100)
-            ("CC"   , 200)
-            ("CCC"  , 300)
-            ("CD"   , 400)
-            ("D"    , 500)
-            ("DC"   , 600)
-            ("DCC"  , 700)
-            ("DCCC" , 800)
-            ("CM"   , 900)
-        ;
-    }
+        hundreds_()
+        {
+            add
+                ("C"    , 100)
+                ("CC"   , 200)
+                ("CCC"  , 300)
+                ("CD"   , 400)
+                ("D"    , 500)
+                ("DC"   , 600)
+                ("DCC"  , 700)
+                ("DCCC" , 800)
+                ("CM"   , 900)
+            ;
+        }
 
-} hundreds;
-//]
+    } hundreds;
+    //]
 
-///////////////////////////////////////////////////////////////////////////////
-//  Parse roman tens (10..90) numerals using the symbol table.
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_roman_tens
-struct tens_ : symbols<char, unsigned>
-{
-    tens_()
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Parse roman tens (10..90) numerals using the symbol table.
+    ///////////////////////////////////////////////////////////////////////////////
+    //[tutorial_roman_tens
+    struct tens_ : qi::symbols<char, unsigned>
     {
-        add
-            ("X"    , 10)
-            ("XX"   , 20)
-            ("XXX"  , 30)
-            ("XL"   , 40)
-            ("L"    , 50)
-            ("LX"   , 60)
-            ("LXX"  , 70)
-            ("LXXX" , 80)
-            ("XC"   , 90)
-        ;
-    }
+        tens_()
+        {
+            add
+                ("X"    , 10)
+                ("XX"   , 20)
+                ("XXX"  , 30)
+                ("XL"   , 40)
+                ("L"    , 50)
+                ("LX"   , 60)
+                ("LXX"  , 70)
+                ("LXXX" , 80)
+                ("XC"   , 90)
+            ;
+        }
 
-} tens;
-//]
+    } tens;
+    //]
 
-///////////////////////////////////////////////////////////////////////////////
-//  Parse roman ones (1..9) numerals using the symbol table.
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_roman_ones
-struct ones_ : symbols<char, unsigned>
-{
-    ones_()
+    ///////////////////////////////////////////////////////////////////////////////
+    //  Parse roman ones (1..9) numerals using the symbol table.
+    ///////////////////////////////////////////////////////////////////////////////
+    //[tutorial_roman_ones
+    struct ones_ : qi::symbols<char, unsigned>
     {
-        add
-            ("I"    , 1)
-            ("II"   , 2)
-            ("III"  , 3)
-            ("IV"   , 4)
-            ("V"    , 5)
-            ("VI"   , 6)
-            ("VII"  , 7)
-            ("VIII" , 8)
-            ("IX"   , 9)
-        ;
-    }
+        ones_()
+        {
+            add
+                ("I"    , 1)
+                ("II"   , 2)
+                ("III"  , 3)
+                ("IV"   , 4)
+                ("V"    , 5)
+                ("VI"   , 6)
+                ("VII"  , 7)
+                ("VIII" , 8)
+                ("IX"   , 9)
+            ;
+        }
 
-} ones;
-//]
+    } ones;
+    //]
 
-///////////////////////////////////////////////////////////////////////////////
-//  roman (numerals) grammar
-//
-//      Note the use of the || operator. The expression
-//      a || b reads match a or b and in sequence. Try
-//      defining the roman numerals grammar in YACC or
-//      PCCTS. Spirit rules! :-)
-///////////////////////////////////////////////////////////////////////////////
-//[tutorial_roman_grammar
-template <typename Iterator>
-struct roman : grammar<Iterator, unsigned()>
-{
-    roman() : roman::base_type(start)
+    ///////////////////////////////////////////////////////////////////////////////
+    //  roman (numerals) grammar
+    //
+    //      Note the use of the || operator. The expression
+    //      a || b reads match a or b and in sequence. Try
+    //      defining the roman numerals grammar in YACC or
+    //      PCCTS. Spirit rules! :-)
+    ///////////////////////////////////////////////////////////////////////////////
+    //[tutorial_roman_grammar
+    template <typename Iterator>
+    struct roman : qi::grammar<Iterator, unsigned()>
     {
-        start = eps             [_val = 0] >>
-            (
-                +char_('M')     [_val += 1000]
-                ||  hundreds    [_val += _1]
-                ||  tens        [_val += _1]
-                ||  ones        [_val += _1]
-            )
-        ;
-    }
+        roman() : roman::base_type(start)
+        {
+            using qi::eps;
+            using qi::lit;
+            using qi::_val;
+            using qi::_1;
+            using ascii::char_;
+
+            start = eps             [_val = 0] >>
+                (
+                    +lit('M')       [_val += 1000]
+                    ||  hundreds    [_val += _1]
+                    ||  tens        [_val += _1]
+                    ||  ones        [_val += _1]
+                )
+            ;
+        }
 
-    rule<Iterator, unsigned()> start;
-};
-//]
+        qi::rule<Iterator, unsigned()> start;
+    };
+    //]
+}
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -141,7 +147,7 @@
     std::cout << "Type a Roman Numeral ...or [q or Q] to quit\n\n";
 
     typedef std::string::const_iterator iterator_type;
-    typedef roman<iterator_type> roman;
+    typedef client::roman<iterator_type> roman;
 
     roman roman_parser; // Our grammar
 
Modified: trunk/libs/spirit/example/qi/sum.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/sum.cpp	(original)
+++ trunk/libs/spirit/example/qi/sum.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2002-2007 Joel de Guzman
+    Copyright (c) 2002-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -22,38 +22,44 @@
 #include <string>
 //]
 
-//[tutorial_adder_using
-using namespace boost::phoenix;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
-//]
-
-///////////////////////////////////////////////////////////////////////////////
-//  Our adder
-///////////////////////////////////////////////////////////////////////////////
-
-//[tutorial_adder
-template <typename Iterator>
-bool adder(Iterator first, Iterator last, double& n)
+namespace client
 {
-    bool r = phrase_parse(first, last,
+    //[tutorial_adder_using
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+    namespace phoenix = boost::phoenix;
+
+    using qi::double_;
+    using qi::_1;
+    using ascii::space;
+    using phoenix::ref;
+    //]
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  Our adder
+    ///////////////////////////////////////////////////////////////////////////
+
+    //[tutorial_adder
+    template <typename Iterator>
+    bool adder(Iterator first, Iterator last, double& n)
+    {
+        bool r = qi::phrase_parse(first, last,
 
-        //  Begin grammar
-        (
-            double_[ref(n) = _1] >> *(',' >> double_[ref(n) += _1])
-        )
-        ,
-        //  End grammar
-
-        space);
-
-    if (first != last) // fail if we did not get a full match
-        return false;
-    return r;
+            //  Begin grammar
+            (
+                double_[ref(n) = _1] >> *(',' >> double_[ref(n) += _1])
+            )
+            ,
+            //  End grammar
+
+            space);
+
+        if (first != last) // fail if we did not get a full match
+            return false;
+        return r;
+    }
+    //]
 }
-//]
 
 ////////////////////////////////////////////////////////////////////////////
 //  Main program
@@ -76,7 +82,7 @@
             break;
 
         double n;
-        if (adder(str.begin(), str.end(), n))
+        if (client::adder(str.begin(), str.end(), n))
         {
             std::cout << "-------------------------\n";
             std::cout << "Parsing succeeded\n";
Modified: trunk/libs/spirit/test/CMakeLists.txt
==============================================================================
--- trunk/libs/spirit/test/CMakeLists.txt	(original)
+++ trunk/libs/spirit/test/CMakeLists.txt	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,3 +1,11 @@
+#   Copyright (c) 2001-2009 Joel de Guzman
+#   Copyright (c) 2001-2009 Hartmut Kaiser
+#
+#   Use, modification and distribution is subject to the Boost Software
+#   License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+#   http://www.boost.org/LICENSE_1_0.txt)
+#==============================================================================
+
 boost_additional_test_dependencies(spirit BOOST_DEPENDS test variant function_types intrusive lambda assign iostreams math random dynamic_bitset fusion)
 message(STATUS "Boost/libs/spirit/test needs GCC C++ -ftemplate-depth-300 flag")
 
@@ -7,57 +15,63 @@
   SET(test_compile_flags "-ftemplate-depth-300")
 ENDIF(CMAKE_COMPILER_IS_GNUCC)
 
+# run Qi tests
 boost_test_run(qi_actions qi/actions.cpp COMPILE_FLAGS ${test_compile_flags} BOOST_LIB spirit COMPILE_FLAGS ${test_compile_flags} )
+boost_test_run(qi_alternative qi/alternative.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_and_predicate qi/and_predicate.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_binary qi/binary.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_char qi/char.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_char_class qi/char_class.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_lit qi/lit.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_int qi/int.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_uint qi/uint.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_real qi/real.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_difference qi/difference.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_end qi/end.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_eps qi/eps.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_none qi/none.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_expect qi/expect.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_grammar qi/grammar.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_int qi/int.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_kleene qi/kleene.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_lazy qi/lazy.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_tst qi/tst.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_symbols qi/symbols.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_range_run qi/range_run.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_no_case qi/no_case.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_lexeme qi/lexeme.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_raw qi/raw.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_sequence qi/sequence.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_alternative qi/alternative.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_sequential_or qi/sequential_or.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_permutation qi/permutation.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_difference qi/difference.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_uint qi/uint.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_lit qi/lit.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_list qi/list.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_match_manip qi/match_manip.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_match_manip_attr qi/match_manip_attr.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_no_case qi/no_case.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_not_predicate qi/not_predicate.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_optional qi/optional.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_kleene qi/kleene.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_parse_attr qi/parse_attr.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_permutation qi/permutation.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_plus qi/plus.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_and_predicate qi/and_predicate.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_not_predicate qi/not_predicate.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_expect qi/expect.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_range_run qi/range_run.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_raw qi/raw.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_real qi/real.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_repeat qi/repeat.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(qi_rule qi/rule.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_grammar qi/grammar.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_functor qi/functor.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_match_manip qi/match_manip.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_binary qi/binary.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_debug qi/debug.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(qi_end qi/end.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_sequence qi/sequence.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_sequential_or qi/sequential_or.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_skip qi/skip.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_symbols qi/symbols.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_terminal_ex qi/terminal_ex.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_tst qi/tst.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(qi_uint qi/uint.cpp COMPILE_FLAGS ${test_compile_flags})
 
-boost_test_compile_fail(qi_grammar_fail qi/grammar_fail.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_compile_fail(qi_rule_fail qi/rule_fail.cpp COMPILE_FLAGS ${test_compile_flags})
+# boost_test_compile_fail(qi_grammar_fail qi/grammar_fail.cpp COMPILE_FLAGS ${test_compile_flags})
+# boost_test_compile_fail(qi_rule_fail qi/rule_fail.cpp COMPILE_FLAGS ${test_compile_flags})
 
-    # run Karma tests
+# run Karma tests
 boost_test_run(karma_actions karma/actions.cpp COMPILE_FLAGS ${test_compile_flags}) #              : : : : karma_actions ]
+boost_test_run(karma_and_attribute karma/and_attribute.cpp COMPILE_FLAGS ${test_compile_flags}) #              : : : : karma_actions ]
 boost_test_run(karma_alternative karma/alternative.cpp COMPILE_FLAGS ${test_compile_flags}) #              : : : : karma_alternative ]
 boost_test_run(karma_binary karma/binary.cpp COMPILE_FLAGS ${test_compile_flags}) #                   : : : : karma_binary ]
 boost_test_run(karma_case_handling karma/case_handling.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_center_alignment karma/center_alignment.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_char karma/char.cpp COMPILE_FLAGS ${test_compile_flags}) #                     : : : : karma_char ]
-boost_test_run(karma_delimieter karma/delimiter.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(karma_delimiter karma/delimiter.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_eol karma/eol.cpp COMPILE_FLAGS ${test_compile_flags}) #                      : : : : karma_eol ]
 boost_test_run(karma_eps karma/eps.cpp COMPILE_FLAGS ${test_compile_flags}) #                      : : : : karma_eps ]
 boost_test_run(karma_format_manip karma/format_manip.cpp COMPILE_FLAGS ${test_compile_flags})
-boost_test_run(karma_functor karma/functor.cpp COMPILE_FLAGS ${test_compile_flags}) #                  : : : : karma_functor ]
+boost_test_run(karma_format_manip_attr karma/format_manip_attr.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(karma_generate_attr karma/generate_attr.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_grammar karma/grammar.cpp COMPILE_FLAGS ${test_compile_flags}) #                  : : : : karma_grammar ]
 boost_test_run(karma_int_numerics karma/int_numerics.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_kleene karma/kleene.cpp COMPILE_FLAGS ${test_compile_flags}) #                   : : : : karma_kleene ]
@@ -65,23 +79,21 @@
 boost_test_run(karma_left_alignment karma/left_alignment.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_list karma/list.cpp COMPILE_FLAGS ${test_compile_flags}) #                     : : : : karma_list ]
 boost_test_run(karma_lit karma/lit.cpp COMPILE_FLAGS ${test_compile_flags}) #                      : : : : karma_lit ]
-boost_test_run(karma_none karma/none.cpp COMPILE_FLAGS ${test_compile_flags}) #                     : : : : karma_none ]
+boost_test_run(karma_maxwidth karma/maxwidth.cpp COMPILE_FLAGS ${test_compile_flags}) #                      : : : : karma_lit ]
 boost_test_run(karma_optional karma/optional.cpp COMPILE_FLAGS ${test_compile_flags}) #                 : : : : karma_optional ]
 boost_test_run(karma_pattern karma/pattern.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(karma_pattern2 karma/pattern2.cpp COMPILE_FLAGS ${test_compile_flags})
+boost_test_run(karma_plus karma/plus.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_real_numerics karma/real_numerics.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_right_alignment karma/right_alignment.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(karma_sequence karma/sequence.cpp COMPILE_FLAGS ${test_compile_flags}) #                 : : : : karma_sequence ]
+boost_test_run(karma_stream karma/stream.cpp COMPILE_FLAGS ${test_compile_flags}) #                 : : : : karma_sequence ]
+boost_test_run(karma_tricky_alignment karma/tricky_alignment.cpp COMPILE_FLAGS ${test_compile_flags}) #                 : : : : karma_sequence ]
 
 boost_test_compile_fail(karma_grammar_fail karma/grammar_fail.cpp COMPILE_FLAGS ${test_compile_flags}) #   : : karma_grammar_fail ]
 boost_test_compile_fail(karma_rule_fail karma/rule_fail.cpp COMPILE_FLAGS ${test_compile_flags}) #      : : karma_rule_fail ]
 
-    # run support tests
-boost_test_run(support_hold_any support/hold_any.cpp COMPILE_FLAGS ${test_compile_flags})
-# the multi_pass tests are not completed yet
-#    [ run support/multi_pass_compile.cpp COMPILE_FLAGS ${test_compile_flags}      : : : : ]
-#    [ run support/multi_pass.cpp COMPILE_FLAGS ${test_compile_flags}              : : : : ]
-
-    # run lexer tests
+# run lexer tests
 boost_test_run(lex_lexertl1 lex/lexertl1.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(lex_lexertl2 lex/lexertl2.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(lex_lexertl3 lex/lexertl3.cpp COMPILE_FLAGS ${test_compile_flags})
@@ -89,6 +101,12 @@
 boost_test_run(lex_lexertl5 lex/lexertl5.cpp COMPILE_FLAGS ${test_compile_flags})
 boost_test_run(lex_state_switcher_test lex/state_switcher_test.cpp COMPILE_FLAGS ${test_compile_flags})
 
+# run support tests
+# boost_test_run(support_hold_any support/hold_any.cpp COMPILE_FLAGS ${test_compile_flags})
+# the multi_pass tests are not completed yet
+#    [ run support/multi_pass_compile.cpp COMPILE_FLAGS ${test_compile_flags}      : : : : ]
+#    [ run support/multi_pass.cpp COMPILE_FLAGS ${test_compile_flags}              : : : : ]
+
 
 
 
Modified: trunk/libs/spirit/test/Jamfile
==============================================================================
--- trunk/libs/spirit/test/Jamfile	(original)
+++ trunk/libs/spirit/test/Jamfile	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,15 +1,21 @@
 #==============================================================================
-#   Copyright (c) 2001-2007 Joel de Guzman
-#   Copyright (c) 2001-2008 Hartmut Kaiser
+#   Copyright (c) 2001-2009 Joel de Guzman
+#   Copyright (c) 2001-2009 Joel de Guzman
+#   Copyright (c) 2001-2009 Hartmut Kaiser
 #
 #   Use, modification and distribution is subject to the Boost Software
 #   License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
 #   http://www.boost.org/LICENSE_1_0.txt)
 #==============================================================================
-project # spirit_v2-tests
-    : requirements 
+project spirit_v2x/test
+    : requirements
+        <include>.
         <toolset>gcc:<cxxflags>-ftemplate-depth-300
         <toolset>darwin:<cxxflags>-ftemplate-depth-300
+        <toolset>gcc:<linkflags>-Wl,--enable-auto-import
+        <toolset>darwin:<linkflags>-Wl,--enable-auto-import
+    :
+    :
     ;
 
 # bring in rules for testing
@@ -25,13 +31,13 @@
     [ run qi/binary.cpp                     : : : : ]
     [ run qi/char.cpp                       : : : : ]
     [ run qi/char_class.cpp                 : : : : ]
-    [ run qi/confix.cpp                     : : : : ]
-    [ run qi/debug.cpp                      : : : : ]
+    #[ run qi/confix.cpp                     : : : : ]
+    #[ run qi/debug.cpp                      : : : : ]
     [ run qi/difference.cpp                 : : : : ]
     [ run qi/end.cpp                        : : : : ]
     [ run qi/eps.cpp                        : : : : ]
     [ run qi/expect.cpp                     : : : : ]
-    [ run qi/functor.cpp                    : : : : ]
+    #[ run qi/functor.cpp                    : : : : ]
     [ run qi/grammar.cpp                    : : : : ]
     [ run qi/int.cpp                        : : : : ]
     [ run qi/kleene.cpp                     : : : : ]
@@ -39,39 +45,43 @@
     [ run qi/lexeme.cpp                     : : : : ]
     [ run qi/lit.cpp                        : : : : ]
     [ run qi/list.cpp                       : : : : ]
+    [ run qi/match_manip.cpp                : : : : ]
+    [ run qi/match_manip_attr.cpp           : : : : ]
     [ run qi/no_case.cpp                    : : : : ]
-    [ run qi/none.cpp                       : : : : ]
     [ run qi/not_predicate.cpp              : : : : ]
     [ run qi/optional.cpp                   : : : : ]
+    [ run qi/parse_attr.cpp                 : : : : ]
     [ run qi/permutation.cpp                : : : : ]
     [ run qi/plus.cpp                       : : : : ]
     [ run qi/range_run.cpp                  : : : : ]
     [ run qi/raw.cpp                        : : : : ]
     [ run qi/real.cpp                       : : : : ]
+    [ run qi/repeat.cpp                     : : : : ]
     [ run qi/rule.cpp                       : : : : ]
     [ run qi/sequence.cpp                   : : : : ]
     [ run qi/sequential_or.cpp              : : : : ]
+    [ run qi/skip.cpp                       : : : : ]
     [ run qi/symbols.cpp                    : : : : ]
+    [ run qi/terminal_ex.cpp                : : : : ]
     [ run qi/tst.cpp                        : : : : ]
     [ run qi/uint.cpp                       : : : : ]
-    [ run qi/match_manip.cpp                : : : : ]
-
-    [ compile-fail qi/grammar_fail.cpp      : : ]
-    [ compile-fail qi/rule_fail.cpp         : : ]
 
     # run Karma tests
     [ run karma/actions.cpp                 : : : : karma_actions ]
+    [ run karma/and_attribute.cpp           : : : : karma_and_attribute ]
     [ run karma/alternative.cpp             : : : : karma_alternative ]
     [ run karma/binary.cpp                  : : : : karma_binary ]
     [ run karma/case_handling.cpp           : : : : ]
     [ run karma/center_alignment.cpp        : : : : ]
     [ run karma/char.cpp                    : : : : karma_char ]
-    [ run karma/confix.cpp                  : : : : karma_confix ]
+#    [ run karma/confix.cpp                  : : : : karma_confix ]
     [ run karma/delimiter.cpp               : : : : ]
     [ run karma/eol.cpp                     : : : : karma_eol ]
     [ run karma/eps.cpp                     : : : : karma_eps ]
     [ run karma/format_manip.cpp            : : : : ]
-    [ run karma/functor.cpp                 : : : : karma_functor ]
+    [ run karma/format_manip_attr.cpp       : : : : ]
+#    [ run karma/functor.cpp                 : : : : karma_functor ]
+    [ run karma/generate_attr.cpp           : : : : ]
     [ run karma/grammar.cpp                 : : : : karma_grammar ]
     [ run karma/int_numerics.cpp            : : : : ]
     [ run karma/kleene.cpp                  : : : : karma_kleene ]
@@ -79,24 +89,21 @@
     [ run karma/left_alignment.cpp          : : : : ]
     [ run karma/list.cpp                    : : : : karma_list ]
     [ run karma/lit.cpp                     : : : : karma_lit ]
-    [ run karma/none.cpp                    : : : : karma_none ]
+    [ run karma/maxwidth.cpp                : : : : ]
     [ run karma/optional.cpp                : : : : karma_optional ]
     [ run karma/pattern.cpp                 : : : : karma_pattern ]
     [ run karma/pattern2.cpp                : : : : karma_pattern2 ]
+    [ run karma/plus.cpp                    : : : : karma_plus ]
     [ run karma/real_numerics.cpp           : : : : ]
     [ run karma/right_alignment.cpp         : : : : ]
     [ run karma/sequence.cpp                : : : : karma_sequence ]
+    [ run karma/stream.cpp                  : : : : karma_stream ]
+    [ run karma/tricky_alignment.cpp        : : : : ]
 
     [ compile-fail karma/grammar_fail.cpp   : : karma_grammar_fail ]
     [ compile-fail karma/rule_fail.cpp      : : karma_rule_fail ]
 
-    # run support tests
-    [ run support/hold_any.cpp              : : : : ]
-# the multi_pass tests are not completed yet
-#    [ run support/multi_pass_compile.cpp    : : : : ]
-#    [ run support/multi_pass.cpp            : : : : ]
-
-    # run lexer tests
+    # run Lex tests
     [ run lex/lexertl1.cpp                  : : : : ]
     [ run lex/lexertl2.cpp                  : : : : ]
     [ run lex/lexertl3.cpp                  : : : : ]
@@ -108,4 +115,3 @@
 
 }
 
-
Modified: trunk/libs/spirit/test/karma/actions.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/actions.cpp	(original)
+++ trunk/libs/spirit/test/karma/actions.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2008 Hartmut Kaiser
-    Copyright (c) 2001-2008 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,16 +9,19 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-#include <boost/spirit/include/karma.hpp>
-#include <boost/lambda/lambda.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
 #include <boost/bind.hpp>
-#include <boost/function_output_iterator.hpp>
+#include <boost/lambda/lambda.hpp>
 
 #include <sstream>
 #include "test.hpp"
 
 using namespace spirit_test;
-using namespace boost::spirit;
+using boost::spirit::unused_type;
 
 void read1(int& i)
 {
@@ -35,6 +38,12 @@
     i = 42;
 }
 
+void read3_fail(int& i, unused_type, bool& pass)
+{
+    i = 42;
+    pass = false;
+}
+
 struct read_action
 {
     void operator()(int& i, unused_type, unused_type) const
@@ -46,32 +55,68 @@
 ///////////////////////////////////////////////////////////////////////////////
 int main()
 {
-    using namespace boost::spirit::ascii;
+    using boost::spirit::karma::int_;
+    {
+        BOOST_TEST(test("42", int_[&read1]));
+        BOOST_TEST(test_delimited("42 ", int_[&read1], ' '));
+        BOOST_TEST(test("42", int_[&read2]));
+        BOOST_TEST(test_delimited("42 ", int_[&read2], ' '));
+        BOOST_TEST(test("42", int_[&read3]));
+        BOOST_TEST(test_delimited("42 ", int_[&read3], ' '));
+        BOOST_TEST(!test("42", int_[&read3_fail]));
+        BOOST_TEST(!test_delimited("42 ", int_[&read3_fail], ' '));
+    }
+
+    {
+        BOOST_TEST(test("42", int_[read_action()]));
+        BOOST_TEST(test_delimited("42 ", int_[read_action()], ' '));
+    }
+
+    {
+        BOOST_TEST(test("42", int_[boost::bind(&read1, _1)]));
+        BOOST_TEST(test_delimited("42 ", int_[boost::bind(&read1, _1)], ' '));
+        BOOST_TEST(test("42", int_[boost::bind(&read2, _1, _2)]));
+        BOOST_TEST(test_delimited("42 ", int_[boost::bind(&read2, _1, _2)], ' '));
+        BOOST_TEST(test("42", int_[boost::bind(&read3, _1, _2, _3)]));
+        BOOST_TEST(test_delimited("42 ", int_[boost::bind(&read3, _1, _2, _3)], ' '));
+    }
+
+    {
+        namespace lambda = boost::lambda;
+        {
+            std::stringstream strm("42");
+            BOOST_TEST(test("42", int_[strm >> lambda::_1]));
+        }
+        {
+            std::stringstream strm("42");
+            BOOST_TEST(test_delimited("42 ", int_[strm >> lambda::_1], ' '));
+        }
+    }
 
     {
         BOOST_TEST(test("{42}", '{' << int_[&read1] << '}'));
-        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[&read1] << '}', space));
+        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[&read1] << '}', ' '));
         BOOST_TEST(test("{42}", '{' << int_[&read2] << '}'));
-        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[&read2] << '}', space));
+        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[&read2] << '}', ' '));
         BOOST_TEST(test("{42}", '{' << int_[&read3] << '}'));
-        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[&read3] << '}', space));
+        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[&read3] << '}', ' '));
     }
 
     {
         BOOST_TEST(test("{42}", '{' << int_[read_action()] << '}'));
-        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[read_action()] << '}', space));
+        BOOST_TEST(test_delimited("{ 42 } ", '{' << int_[read_action()] << '}', ' '));
     }
 
     {
         BOOST_TEST(test("{42}", '{' << int_[boost::bind(&read1, _1)] << '}'));
         BOOST_TEST(test_delimited("{ 42 } ", 
-            '{' << int_[boost::bind(&read1, _1)] << '}', space));
+            '{' << int_[boost::bind(&read1, _1)] << '}', ' '));
         BOOST_TEST(test("{42}", '{' << int_[boost::bind(&read2, _1, _2)] << '}'));
         BOOST_TEST(test_delimited("{ 42 } ", 
-            '{' << int_[boost::bind(&read2, _1, _2)] << '}', space));
+            '{' << int_[boost::bind(&read2, _1, _2)] << '}', ' '));
         BOOST_TEST(test("{42}", '{' << int_[boost::bind(&read3, _1, _2, _3)] << '}'));
         BOOST_TEST(test_delimited("{ 42 } ", 
-            '{' << int_[boost::bind(&read3, _1, _2, _3)] << '}', space));
+            '{' << int_[boost::bind(&read3, _1, _2, _3)] << '}', ' '));
     }
 
     {
@@ -83,7 +128,7 @@
         {
             std::stringstream strm("42");
             BOOST_TEST(test_delimited("{ 42 } ", 
-                '{' << int_[strm >> lambda::_1] << '}', space));
+                '{' << int_[strm >> lambda::_1] << '}', ' '));
         }
     }
 
Modified: trunk/libs/spirit/test/karma/alternative.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/alternative.cpp	(original)
+++ trunk/libs/spirit/test/karma/alternative.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -25,65 +25,89 @@
 {
     using namespace boost;
     using namespace boost::spirit;
-    
+    using namespace boost::spirit::ascii;
+
+    {
+        BOOST_TEST(test("x", char_('x') | char_('i')));
+        BOOST_TEST(test("xi", char_('x') << char_('i') | char_('i')));
+        BOOST_TEST(test("i", char_('i') | char_('x') << char_('i')));
+
+        variant<int, char> v (10);
+        BOOST_TEST(test("10", char_ | int_, v));
+        BOOST_TEST(test("10", int_ | char_, v));
+        BOOST_TEST(test("a", char_('a') | char_ | int_, v));
+        BOOST_TEST(test("a", char_ | char_('a') | int_, v));
+        BOOST_TEST(test("10", int_ | char_('a') | char_, v));
+
+        v = 'c';
+        BOOST_TEST(test("c", char_ | int_, v));
+        BOOST_TEST(test("a", char_('a') | char_ | int_, v));
+        BOOST_TEST(test("c", char_ | char_('a') | int_, v));
+        BOOST_TEST(test("a", int_ | char_('a') | char_, v));
+        BOOST_TEST(test("c", int_ | char_ | char_('a'), v));
+    }
+
+    {
+        // test if alternatives with all components having unused 
+        // attribute generate first alternative 
+        fusion::vector<char, char> v('a', 'b');
+        BOOST_TEST(test("axb", char_ << (char_('x') | char_('i')) << char_, v));
+        BOOST_TEST(test("axib", 
+            char_ << (char_('x') << char_('i') | char_('i')) << char_, v));
+    }
+
     {
-        {
-            BOOST_TEST(test("x", char_('x') | char_('i')));
-            BOOST_TEST(test("xi", char_('x') << char_('i') | char_('i')));
-
-            variant<int, char> v (10);
-            BOOST_TEST(test("10", char_ | int_, v));
-            BOOST_TEST(test("a", char_('a') | char_ | int_, v));
-
-            v = 'c';
-            BOOST_TEST(test("c", char_ | int_, v));
-            BOOST_TEST(test("a", char_('a') | char_ | int_, v));
-        }
-
-        {
-            // test if alternatives with all components having unused 
-            // parameter return attributes them self
-            fusion::vector<char, char> v('a', 'b');
-            BOOST_TEST(test("axb", char_ << (char_('x') | char_('i')) << char_, v));
-            BOOST_TEST(test("axib", 
-                char_ << (char_('x') << char_('i') | char_('i')) << char_, v));
-        }
-
-        {
-            BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
-            BOOST_TEST(test_delimited("x i ", 
-                char_('x') << char_('i') | char_('i'), char_(' ')));
-
-            variant<int, char> v (10);
-            BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
-
-            v = 'c';
-            BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
-        }
-
-        {
-            // if nothing matches, the first explicit alternative will be chosen
-            variant<double, char const*> v (10.0);
-            BOOST_TEST(test("11", char_ | int_(11), v));
-            BOOST_TEST(test("10.0", double_ | int_(11), v));
-            BOOST_TEST(!test("", char_ | int_, v));
-
-            v = "c";
-            BOOST_TEST(test("11", char_ | int_(11), v));
-            BOOST_TEST(test("11", double_ | int_(11), v));
-            BOOST_TEST(!test("", char_ | int_, v));
-        }
-
-        {
-            // if nothing matches, the first explicit alternative will be chosen
-            variant<double, char const*> v (10.0);
-            BOOST_TEST(test_delimited("11 ", char_ | int_(11), v, char_(' ')));
-
-            v = "c";
-            BOOST_TEST(test_delimited("11 ", char_ | int_(11), v, char_(' ')));
-        }
+        BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
+        BOOST_TEST(test_delimited("x i ", 
+            char_('x') << char_('i') | char_('i'), char_(' ')));
+        BOOST_TEST(test_delimited("i ", 
+            char_('i') | char_('x') << char_('i'), char_(' ')));
+
+        variant<int, char> v (10);
+        BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
+        BOOST_TEST(test_delimited("10 ", int_ | char_, v, char_(' ')));
+        BOOST_TEST(test_delimited("a ", char_('a') | char_ | int_, v, char_(' ')));
+        BOOST_TEST(test_delimited("a ", char_ | char_('a') | int_, v, char_(' ')));
+        BOOST_TEST(test_delimited("10 ", int_ | char_('a') | char_, v, char_(' ')));
+
+        v = 'c';
+        BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
+        BOOST_TEST(test_delimited("a ", char_('a') | char_ | int_, v, char_(' ')));
+        BOOST_TEST(test_delimited("c ", char_ | char_('a') | int_, v, char_(' ')));
+        BOOST_TEST(test_delimited("a ", int_ | char_('a') | char_, v, char_(' ')));
+        BOOST_TEST(test_delimited("c ", int_ | char_ | char_('a'), v, char_(' ')));
     }
-    
+
+    {
+        // if nothing matches, the first explicit alternative will be chosen
+        variant<double, char const*> v (10.0);
+        BOOST_TEST(test("11", char_ | int_(11), v));
+        BOOST_TEST(test("11", int_(11) | char_ , v));
+        BOOST_TEST(test("10.0", double_ | int_(11), v));
+        BOOST_TEST(test("11", int_(11) | double_, v));
+        BOOST_TEST(!test("", char_ | int_, v));
+
+        v = "c";
+        BOOST_TEST(test("11", char_ | int_(11), v));
+        BOOST_TEST(test("11", double_ | int_(11), v));
+        BOOST_TEST(!test("", char_ | int_, v));
+    }
+
+    {
+        // if nothing matches, the first explicit alternative will be chosen
+        variant<double, char const*> v (10.0);
+        BOOST_TEST(test_delimited("11 ", char_ | int_(11), v, char_(' ')));
+        BOOST_TEST(test_delimited("11 ", int_(11) | char_ , v, char_(' ')));
+        BOOST_TEST(test_delimited("10.0 ", double_ | int_(11), v, char_(' ')));
+        BOOST_TEST(test_delimited("11 ", int_(11) | double_, v, char_(' ')));
+        BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
+
+        v = "c";
+        BOOST_TEST(test_delimited("11 ", char_ | int_(11), v, char_(' ')));
+        BOOST_TEST(test_delimited("11 ", double_ | int_(11), v, char_(' ')));
+        BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
+    }
+
     return boost::report_errors();
 }
 
Added: trunk/libs/spirit/test/karma/and_attribute.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/and_attribute.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,27 @@
+//  Copyright (c) 2001-2007 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+
+#include <iostream>
+#include "test.hpp"
+
+int
+main()
+{
+    using namespace spirit_test;
+    using namespace boost::spirit;
+
+    {
+        BOOST_TEST(test("1", int_(1) << &(int_(2) << &int_(3) << int_(4))));
+    }
+    
+    return boost::report_errors();
+}
Modified: trunk/libs/spirit/test/karma/binary.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/binary.cpp	(original)
+++ trunk/libs/spirit/test/karma/binary.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -6,7 +6,6 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/karma_binary.hpp>
 #include <boost/spirit/include/karma_generate.hpp>
 
@@ -20,11 +19,10 @@
 {
     using namespace boost::spirit;
     using namespace boost::phoenix;
-    using namespace boost::spirit::arg_names;
 
     {   // test native endian binaries
 #ifdef BOOST_LITTLE_ENDIAN
-        BOOST_TEST(binary_test("\x01", 1, byte, 0x01));
+        BOOST_TEST(binary_test("\x01", 1, byte_, 0x01));
         BOOST_TEST(binary_test("\x01\x02", 2, word, 0x0201));
         BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, 0x04030201));
 #ifdef BOOST_HAS_LONG_LONG
@@ -32,7 +30,7 @@
             0x0807060504030201LL));
 #endif
 
-        BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte, 0x01, pad(4)));
+        BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte_, 0x01, pad(4)));
         BOOST_TEST(binary_test_delimited("\x01\x02\x00\x00", 4, word, 0x0201, pad(4)));
         BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04", 4, dword, 0x04030201, pad(4)));
 #ifdef BOOST_HAS_LONG_LONG
@@ -42,7 +40,7 @@
 
 #else // BOOST_LITTLE_ENDIAN
 
-        BOOST_TEST(binary_test("\x01", 1, byte, 0x01));
+        BOOST_TEST(binary_test("\x01", 1, byte_, 0x01));
         BOOST_TEST(binary_test("\x01\x02", 2, word, 0x0102));
         BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, 0x01020304));
 #ifdef BOOST_HAS_LONG_LONG
@@ -50,7 +48,7 @@
             0x0102030405060708LL));
 #endif
 
-        BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte, 0x01, pad(4)));
+        BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte_, 0x01, pad(4)));
         BOOST_TEST(binary_test_delimited("\x01\x02\x00\x00", 4, word, 0x0102, pad(4)));
         BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04", 4, dword, 0x01020304, pad(4)));
 #ifdef BOOST_HAS_LONG_LONG
@@ -62,7 +60,7 @@
 
     {   // test native endian binaries
 #ifdef BOOST_LITTLE_ENDIAN
-        BOOST_TEST(binary_test("\x01", 1, byte(0x01)));
+        BOOST_TEST(binary_test("\x01", 1, byte_(0x01)));
         BOOST_TEST(binary_test("\x01\x02", 2, word(0x0201)));
         BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword(0x04030201)));
 #ifdef BOOST_HAS_LONG_LONG
@@ -70,7 +68,7 @@
             qword(0x0807060504030201LL)));
 #endif
 #else
-        BOOST_TEST(binary_test("\x01", 1, byte(0x01)));
+        BOOST_TEST(binary_test("\x01", 1, byte_(0x01)));
         BOOST_TEST(binary_test("\x01\x02", 2, word(0x0102)));
         BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword(0x01020304)));
 #ifdef BOOST_HAS_LONG_LONG
@@ -86,6 +84,8 @@
 #ifdef BOOST_HAS_LONG_LONG
         BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, big_qword,
             0x0102030405060708LL));
+        BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 
+            10, big_qword, 0x0102030405060708LL, pad(10)));
 #endif
     }
 
@@ -95,6 +95,8 @@
 #ifdef BOOST_HAS_LONG_LONG
         BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
             big_qword(0x0102030405060708LL)));
+        BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 
+            10, big_qword(0x0102030405060708LL), pad(10)));
 #endif
     }
 
@@ -104,6 +106,8 @@
 #ifdef BOOST_HAS_LONG_LONG
         BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, little_qword,
             0x0807060504030201LL));
+        BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 
+            10, little_qword, 0x0807060504030201LL, pad(10)));
 #endif
     }
 
@@ -113,6 +117,8 @@
 #ifdef BOOST_HAS_LONG_LONG
         BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
             little_qword(0x0807060504030201LL)));
+        BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 
+            10, little_qword(0x0807060504030201LL), pad(10)));
 #endif
     }
 
Modified: trunk/libs/spirit/test/karma/case_handling.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/case_handling.cpp	(original)
+++ trunk/libs/spirit/test/karma/case_handling.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -23,11 +23,9 @@
 
     {
         using namespace boost::spirit::ascii;
-        
+
         BOOST_TEST(test("x", lower['X']));
         BOOST_TEST(test("x", lower['x']));
-        BOOST_TEST(test(L"x", lower[L'X']));
-        BOOST_TEST(test(L"x", lower[L'x']));
 
         BOOST_TEST(test("x", lower[char_], 'X'));
         BOOST_TEST(test("x", lower[char_], 'x'));
@@ -36,141 +34,225 @@
 
         BOOST_TEST(test(" ", lower[space]));
         BOOST_TEST(test("\t", lower[space], '\t'));
-        BOOST_TEST(test("\t", lower[space('\t')]));
-        
+
         BOOST_TEST(test("x", lower[lower['X']]));
         BOOST_TEST(test("x", lower[lower['x']]));
-        BOOST_TEST(test(L"x", lower[lower[L'X']]));
-        BOOST_TEST(test(L"x", lower[lower[L'x']]));
 
         BOOST_TEST(test("x", lower[lower[char_]], 'X'));
         BOOST_TEST(test("x", lower[lower[char_]], 'x'));
         BOOST_TEST(test("x", lower[lower[char_('X')]]));
         BOOST_TEST(test("x", lower[lower[char_('x')]]));
-        
+
         BOOST_TEST(test(" ", lower[lower[space]]));
         BOOST_TEST(test("\t", lower[lower[space]], '\t'));
-        BOOST_TEST(test("\t", lower[lower[space('\t')]]));
 
         BOOST_TEST(test("X", upper[lower['X']]));
         BOOST_TEST(test("X", upper[lower['x']]));
-        BOOST_TEST(test(L"X", upper[lower[L'X']]));
-        BOOST_TEST(test(L"X", upper[lower[L'x']]));
 
         BOOST_TEST(test("X", upper[lower[char_]], 'X'));
         BOOST_TEST(test("X", upper[lower[char_]], 'x'));
         BOOST_TEST(test("X", upper[lower[char_('X')]]));
         BOOST_TEST(test("X", upper[lower[char_('x')]]));
-        
+
         BOOST_TEST(test(" ", upper[lower[space]]));
         BOOST_TEST(test("\t", upper[lower[space]], '\t'));
-        BOOST_TEST(test("\t", upper[lower[space('\t')]]));
 
         BOOST_TEST(test("X", upper['X']));
         BOOST_TEST(test("X", upper['x']));
-        BOOST_TEST(test(L"X", upper[L'X']));
-        BOOST_TEST(test(L"X", upper[L'x']));
 
         BOOST_TEST(test("X", upper[char_], 'X'));
         BOOST_TEST(test("X", upper[char_], 'x'));
         BOOST_TEST(test("X", upper[char_('X')]));
         BOOST_TEST(test("X", upper[char_('x')]));
-        
+
         BOOST_TEST(test(" ", upper[space]));
         BOOST_TEST(test("\t", upper[space], '\t'));
-        BOOST_TEST(test("\t", upper[space('\t')]));
 
         BOOST_TEST(test("x", lower[upper['X']]));
         BOOST_TEST(test("x", lower[upper['x']]));
-        BOOST_TEST(test(L"x", lower[upper[L'X']]));
-        BOOST_TEST(test(L"x", lower[upper[L'x']]));
 
         BOOST_TEST(test("x", lower[upper[char_]], 'X'));
         BOOST_TEST(test("x", lower[upper[char_]], 'x'));
         BOOST_TEST(test("x", lower[upper[char_('X')]]));
         BOOST_TEST(test("x", lower[upper[char_('x')]]));
-        
+
         BOOST_TEST(test(" ", lower[upper[space]]));
         BOOST_TEST(test("\t", lower[upper[space]], '\t'));
-        BOOST_TEST(test("\t", lower[upper[space('\t')]]));
 
         BOOST_TEST(test("X", upper[upper['X']]));
         BOOST_TEST(test("X", upper[upper['x']]));
-        BOOST_TEST(test(L"X", upper[upper[L'X']]));
-        BOOST_TEST(test(L"X", upper[upper[L'x']]));
 
         BOOST_TEST(test("X", upper[upper[char_]], 'X'));
         BOOST_TEST(test("X", upper[upper[char_]], 'x'));
         BOOST_TEST(test("X", upper[upper[char_('X')]]));
         BOOST_TEST(test("X", upper[upper[char_('x')]]));
-        
+
         BOOST_TEST(test(" ", upper[upper[space]]));
         BOOST_TEST(test("\t", upper[upper[space]], '\t'));
-        BOOST_TEST(test("\t", upper[upper[space('\t')]]));
+    }
+
+    {
+        using namespace boost::spirit::standard_wide;
+
+        BOOST_TEST(test(L"x", lower[L'X']));
+        BOOST_TEST(test(L"x", lower[L'x']));
+
+        BOOST_TEST(test(L"x", lower[char_], L'X'));
+        BOOST_TEST(test(L"x", lower[char_], L'x'));
+        BOOST_TEST(test(L"x", lower[char_(L'X')]));
+        BOOST_TEST(test(L"x", lower[char_(L'x')]));
+
+        BOOST_TEST(test(L" ", lower[space]));
+        BOOST_TEST(test(L"\t", lower[space], L'\t'));
+
+        BOOST_TEST(test(L"x", lower[lower[L'X']]));
+        BOOST_TEST(test(L"x", lower[lower[L'x']]));
+
+        BOOST_TEST(test(L"x", lower[lower[char_]], L'X'));
+        BOOST_TEST(test(L"x", lower[lower[char_]], L'x'));
+        BOOST_TEST(test(L"x", lower[lower[char_(L'X')]]));
+        BOOST_TEST(test(L"x", lower[lower[char_(L'x')]]));
+
+        BOOST_TEST(test(L" ", lower[lower[space]]));
+        BOOST_TEST(test(L"\t", lower[lower[space]], L'\t'));
+
+        BOOST_TEST(test(L"X", upper[lower[L'X']]));
+        BOOST_TEST(test(L"X", upper[lower[L'x']]));
+
+        BOOST_TEST(test(L"X", upper[lower[char_]], L'X'));
+        BOOST_TEST(test(L"X", upper[lower[char_]], L'x'));
+        BOOST_TEST(test(L"X", upper[lower[char_(L'X')]]));
+        BOOST_TEST(test(L"X", upper[lower[char_(L'x')]]));
+
+        BOOST_TEST(test(L" ", upper[lower[space]]));
+        BOOST_TEST(test(L"\t", upper[lower[space]], L'\t'));
+
+        BOOST_TEST(test(L"X", upper[L'X']));
+        BOOST_TEST(test(L"X", upper[L'x']));
+
+        BOOST_TEST(test(L"X", upper[char_], L'X'));
+        BOOST_TEST(test(L"X", upper[char_], L'x'));
+        BOOST_TEST(test(L"X", upper[char_(L'X')]));
+        BOOST_TEST(test(L"X", upper[char_(L'x')]));
+
+        BOOST_TEST(test(L" ", upper[space]));
+        BOOST_TEST(test(L"\t", upper[space], L'\t'));
+
+        BOOST_TEST(test(L"x", lower[upper[L'X']]));
+        BOOST_TEST(test(L"x", lower[upper[L'x']]));
+
+        BOOST_TEST(test(L"x", lower[upper[char_]], L'X'));
+        BOOST_TEST(test(L"x", lower[upper[char_]], L'x'));
+        BOOST_TEST(test(L"x", lower[upper[char_(L'X')]]));
+        BOOST_TEST(test(L"x", lower[upper[char_(L'x')]]));
+
+        BOOST_TEST(test(L" ", lower[upper[space]]));
+        BOOST_TEST(test(L"\t", lower[upper[space]], L'\t'));
+
+        BOOST_TEST(test(L"X", upper[upper[L'X']]));
+        BOOST_TEST(test(L"X", upper[upper[L'x']]));
+
+        BOOST_TEST(test(L"X", upper[upper[char_]], L'X'));
+        BOOST_TEST(test(L"X", upper[upper[char_]], L'x'));
+        BOOST_TEST(test(L"X", upper[upper[char_(L'X')]]));
+        BOOST_TEST(test(L"X", upper[upper[char_(L'x')]]));
+
+        BOOST_TEST(test(L" ", upper[upper[space]]));
+        BOOST_TEST(test(L"\t", upper[upper[space]], L'\t'));
+    }
+
+    {
+        using namespace boost::spirit::iso8859_1;
+
+        BOOST_TEST(test("ä", lower['Ä']));
+        BOOST_TEST(test("ä", lower['ä']));
+
+        BOOST_TEST(test("Ä", upper['Ä']));
+        BOOST_TEST(test("Ä", upper['ä']));
     }
 
     {
         using namespace boost::spirit::ascii;
-        
+
         BOOST_TEST(test("a1- ", lower["a1- "]));
         BOOST_TEST(test("a1- ", lower["a1- "]));
         BOOST_TEST(test("a1- ", lower["a1- "]));
         BOOST_TEST(test("a1- ", lower["A1- "]));
-        
-        BOOST_TEST(test("a1- ", lower[lit], "a1- "));
-        BOOST_TEST(test("a1- ", lower[lit], "A1- "));
+
+        BOOST_TEST(test("a1- ", lower[string], "a1- "));
+        BOOST_TEST(test("a1- ", lower[string], "A1- "));
         BOOST_TEST(test("a1- ", lower[lit("a1- ")]));
         BOOST_TEST(test("a1- ", lower[lit("A1- ")]));
+        BOOST_TEST(test("a1- ", lower[string("a1- ")]));
+        BOOST_TEST(test("a1- ", lower[string("A1- ")]));
 
         BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
         BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
         BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
         BOOST_TEST(test("a1- ", lower[lower["A1- "]]));
-        
-        BOOST_TEST(test("a1- ", lower[lower[lit]], "a1- "));
-        BOOST_TEST(test("a1- ", lower[lower[lit]], "A1- "));
+
+        BOOST_TEST(test("a1- ", lower[lower[string]], "a1- "));
+        BOOST_TEST(test("a1- ", lower[lower[string]], "A1- "));
         BOOST_TEST(test("a1- ", lower[lower[lit("a1- ")]]));
         BOOST_TEST(test("a1- ", lower[lower[lit("A1- ")]]));
-        
+        BOOST_TEST(test("a1- ", lower[lower[string("a1- ")]]));
+        BOOST_TEST(test("a1- ", lower[lower[string("A1- ")]]));
+
         BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
         BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
         BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
         BOOST_TEST(test("A1- ", upper[lower["A1- "]]));
-        
-        BOOST_TEST(test("A1- ", upper[lower[lit]], "a1- "));
-        BOOST_TEST(test("A1- ", upper[lower[lit]], "A1- "));
+
+        BOOST_TEST(test("A1- ", upper[lower[string]], "a1- "));
+        BOOST_TEST(test("A1- ", upper[lower[string]], "A1- "));
         BOOST_TEST(test("A1- ", upper[lower[lit("a1- ")]]));
         BOOST_TEST(test("A1- ", upper[lower[lit("A1- ")]]));
-        
+        BOOST_TEST(test("A1- ", upper[lower[string("a1- ")]]));
+        BOOST_TEST(test("A1- ", upper[lower[string("A1- ")]]));
+
         BOOST_TEST(test("A1- ", upper["a1- "]));
         BOOST_TEST(test("A1- ", upper["a1- "]));
         BOOST_TEST(test("A1- ", upper["a1- "]));
         BOOST_TEST(test("A1- ", upper["A1- "]));
-        
-        BOOST_TEST(test("A1- ", upper[lit], "a1- "));
-        BOOST_TEST(test("A1- ", upper[lit], "A1- "));
+
+        BOOST_TEST(test("A1- ", upper[string], "a1- "));
+        BOOST_TEST(test("A1- ", upper[string], "A1- "));
         BOOST_TEST(test("A1- ", upper[lit("a1- ")]));
         BOOST_TEST(test("A1- ", upper[lit("A1- ")]));
-        
+
         BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
         BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
         BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
         BOOST_TEST(test("a1- ", lower[upper["A1- "]]));
-        
-        BOOST_TEST(test("a1- ", lower[upper[lit]], "a1- "));
-        BOOST_TEST(test("a1- ", lower[upper[lit]], "A1- "));
+
+        BOOST_TEST(test("a1- ", lower[upper[string]], "a1- "));
+        BOOST_TEST(test("a1- ", lower[upper[string]], "A1- "));
         BOOST_TEST(test("a1- ", lower[upper[lit("a1- ")]]));
         BOOST_TEST(test("a1- ", lower[upper[lit("A1- ")]]));
-        
+        BOOST_TEST(test("a1- ", lower[upper[string("a1- ")]]));
+        BOOST_TEST(test("a1- ", lower[upper[string("A1- ")]]));
+
         BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
         BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
         BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
         BOOST_TEST(test("A1- ", upper[upper["A1- "]]));
-        
-        BOOST_TEST(test("A1- ", upper[upper[lit]], "a1- "));
-        BOOST_TEST(test("A1- ", upper[upper[lit]], "A1- "));
+
+        BOOST_TEST(test("A1- ", upper[upper[string]], "a1- "));
+        BOOST_TEST(test("A1- ", upper[upper[string]], "A1- "));
         BOOST_TEST(test("A1- ", upper[upper[lit("a1- ")]]));
         BOOST_TEST(test("A1- ", upper[upper[lit("A1- ")]]));
+        BOOST_TEST(test("A1- ", upper[upper[string("a1- ")]]));
+        BOOST_TEST(test("A1- ", upper[upper[string("A1- ")]]));
+    }
+
+    {
+        using namespace boost::spirit::iso8859_1;
+
+        BOOST_TEST(test("ää", lower["Ää"]));
+        BOOST_TEST(test("ää", lower["Ää"]));
+
+        BOOST_TEST(test("ÄÄ", upper["Ää"]));
+        BOOST_TEST(test("ÄÄ", upper["Ää"]));
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/karma/center_alignment.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/center_alignment.cpp	(original)
+++ trunk/libs/spirit/test/karma/center_alignment.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -17,13 +17,13 @@
 
 #include "test.hpp"
 
-using namespace spirit_test;
-
 ///////////////////////////////////////////////////////////////////////////////
 int 
 main()
 {
+    using namespace spirit_test;
     using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
 
     {
         BOOST_TEST(test("     x    ", center[char_('x')]));
@@ -45,18 +45,21 @@
         BOOST_TEST(test("     x     ", center(11)[char_('x')]));
 
         BOOST_TEST(test("    abc   ", center[lit("abc")]));
-        BOOST_TEST(test("    abc   ", center[lit], "abc"));
+        BOOST_TEST(test("    abc   ", center[string], "abc"));
                               
         BOOST_TEST(test("    abc   ", center(10)[lit("abc")]));
-        BOOST_TEST(test("    abc   ", center(10)[lit], "abc"));
+        BOOST_TEST(test("    abc   ", center(10)[string], "abc"));
         BOOST_TEST(test("    abc   ", center(10)["abc"]));
 
+        BOOST_TEST(test("    abc    ", center(11)[lit("abc")]));
+        BOOST_TEST(test("     ab    ", center(11)[lit("ab")]));
+
         BOOST_TEST(test("****abc***", center(10, char_('*'))[lit("abc")]));
-        BOOST_TEST(test("****abc***", center(10, '*')[lit], "abc"));
+        BOOST_TEST(test("****abc***", center(10, '*')[string], "abc"));
         BOOST_TEST(test("****abc***", center(10, '*')["abc"]));
 
         BOOST_TEST(test("****abc***", center(char_('*'))[lit("abc")]));
-        BOOST_TEST(test("****abc***", center(char_('*'))[lit], "abc"));
+        BOOST_TEST(test("****abc***", center(char_('*'))[string], "abc"));
         BOOST_TEST(test("****abc***", center(char_('*'))["abc"]));
 
         BOOST_TEST(test("    abc    ", center(11)[lit("abc")]));
Modified: trunk/libs/spirit/test/karma/char.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/char.cpp	(original)
+++ trunk/libs/spirit/test/karma/char.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -8,7 +8,6 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_generate.hpp>
 #include <boost/spirit/include/karma_action.hpp>
@@ -27,50 +26,59 @@
 {
     using namespace boost::spirit;
     using namespace boost::phoenix;
-    using namespace boost::spirit::arg_names;
-            
+
     {
         using namespace boost::spirit::ascii;
-        
-        BOOST_TEST(test(" ", space));
-        BOOST_TEST(test(L" ", space));
-        BOOST_TEST(!test("\t", space));
-        BOOST_TEST(!test(L"\t", space));
-        
-        BOOST_TEST(test(" ", space(' ')));
-        BOOST_TEST(test(L" ", space(L' ')));
-        BOOST_TEST(test("\t", space('\t')));
-        BOOST_TEST(test(L"\t", space(L'\t')));
-        
-        BOOST_TEST(test(" ", space(' '), '\t'));
-        BOOST_TEST(test(L" ", space(' '), L'\t'));
-        BOOST_TEST(test("\t", space('\t'), ' '));
-        BOOST_TEST(test(L"\t", space('\t'), L' '));
-        
-        BOOST_TEST(test(" ", space, ' '));
-        BOOST_TEST(test(L" ", space, L' '));
-        BOOST_TEST(test("\t", space, '\t'));
-        BOOST_TEST(test(L"\t", space, L'\t'));
-    }
-    
-    {
+
         BOOST_TEST(test("x", 'x'));
         BOOST_TEST(test(L"x", L'x'));
         BOOST_TEST(!test("x", 'y'));
         BOOST_TEST(!test(L"x", L'y'));
-        
+
+        BOOST_TEST(test("x", "x"));
+        BOOST_TEST(test(L"x", L"x"));
+        BOOST_TEST(!test("x", "y"));
+        BOOST_TEST(!test(L"x", L"y"));
+
         BOOST_TEST(test("x", char_, 'x'));
         BOOST_TEST(test(L"x", char_, L'x'));
         BOOST_TEST(!test("x", char_, 'y'));
         BOOST_TEST(!test(L"x", char_, L'y'));
-        
+
         BOOST_TEST(test("x", char_('x')));
         BOOST_TEST(!test("x", char_('y')));
+
+        BOOST_TEST(test("x", char_("x")));
+
+#if defined(KARMA_FAIL_COMPILATION)
+        BOOST_TEST(test("x", char_));           // anychar without a parameter doesn't make any sense
+#endif
+    }
+
+    {
+        using namespace boost::spirit::standard_wide;
+
+        BOOST_TEST(test(L"x", 'x'));
+        BOOST_TEST(test(L"x", L'x'));
+        BOOST_TEST(!test(L"x", 'y'));
+        BOOST_TEST(!test(L"x", L'y'));
+
+        BOOST_TEST(test(L"x", "x"));
+        BOOST_TEST(test(L"x", L"x"));
+        BOOST_TEST(!test(L"x", "y"));
+        BOOST_TEST(!test(L"x", L"y"));
+
+        BOOST_TEST(test(L"x", char_, 'x'));
+        BOOST_TEST(test(L"x", char_, L'x'));
+        BOOST_TEST(!test(L"x", char_, 'y'));
+        BOOST_TEST(!test(L"x", char_, L'y'));
+
+        BOOST_TEST(test(L"x", char_('x')));
         BOOST_TEST(test(L"x", char_(L'x')));
+        BOOST_TEST(!test(L"x", char_('y')));
         BOOST_TEST(!test(L"x", char_(L'y')));
 
-//         BOOST_TEST(test("x", char_("x")));
-//         BOOST_TEST(test(L"x", char_(L"x")));
+        BOOST_TEST(test(L"x", char_(L"x")));
 
 #if defined(KARMA_FAIL_COMPILATION)
         BOOST_TEST(test("x", char_));           // anychar without a parameter doesn't make any sense
@@ -78,74 +86,95 @@
     }
 
     {
-        BOOST_TEST(test(L"x", L'x'));
-        BOOST_TEST(test(L"x", 'x'));
+        using namespace boost::spirit::ascii;
 
-        BOOST_TEST(test(L"x", wchar, L'x'));
-        BOOST_TEST(test(L"x", wchar, 'x'));
+        BOOST_TEST(test(" ", space));
+        BOOST_TEST(test(L" ", space));
+        BOOST_TEST(!test("\t", space));
+        BOOST_TEST(!test(L"\t", space));
+
+        BOOST_TEST(test(" ", space, ' '));
+        BOOST_TEST(test(L" ", space, L' '));
+        BOOST_TEST(test("\t", space, '\t'));
+        BOOST_TEST(test(L"\t", space, L'\t'));
+    }
+
+    {
+        using namespace boost::spirit::standard_wide;
 
-        BOOST_TEST(test(L"x", wchar(L'x')));
-        BOOST_TEST(test(L"x", wchar('x')));
+        BOOST_TEST(test(" ", space));
+        BOOST_TEST(test(L" ", space));
+        BOOST_TEST(!test("\t", space));
+        BOOST_TEST(!test(L"\t", space));
+
+        BOOST_TEST(test(" ", space, ' '));
+        BOOST_TEST(test(L" ", space, L' '));
+        BOOST_TEST(test("\t", space, '\t'));
+        BOOST_TEST(test(L"\t", space, L'\t'));
     }
-    
+
     {
         using namespace boost::spirit::ascii;
-        
+
         BOOST_TEST(test_delimited("x ", 'x', ' '));
         BOOST_TEST(test_delimited(L"x ", L'x', L' '));
         BOOST_TEST(!test_delimited("x ", 'y', ' '));
         BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
 
-        BOOST_TEST(test_delimited("x ", 'x', space));
-        BOOST_TEST(test_delimited(L"x ", L'x', space(L' ')));
-        BOOST_TEST(!test_delimited("x ", 'y', space));
-        BOOST_TEST(!test_delimited(L"x ", L'y', space(L' ')));
-
-        BOOST_TEST(test_delimited("x ", char_, 'x', space));
-        BOOST_TEST(test_delimited(L"x ", char_, L'x', space(L' ')));
-        BOOST_TEST(!test_delimited("x ", char_, 'y', space));
-        BOOST_TEST(!test_delimited(L"x ", char_, L'y', space(L' ')));
-
-        BOOST_TEST(test_delimited("x ", char_('x'), space));
-        BOOST_TEST(!test_delimited("x ", char_('y'), space(L' ')));
-        BOOST_TEST(test_delimited(L"x ", char_(L'x'), space));
-        BOOST_TEST(!test_delimited(L"x ", char_(L'y'), space(L' ')));
-        
-//         BOOST_TEST(test_delimited("x ", char_("x"), space));
+        BOOST_TEST(test_delimited("x ", 'x', ' '));
+        BOOST_TEST(test_delimited(L"x ", L'x', L' '));
+        BOOST_TEST(!test_delimited("x ", 'y', ' '));
+        BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
 
-#if defined(KARMA_FAIL_COMPILATION)
-        BOOST_TEST(test_delimited("x ", char_, space));   // anychar without a parameter doesn't make any sense
-#endif
-    }
-    
-    {
-        BOOST_TEST(test_delimited(L"x ", L'x', wchar(' ')));
-        BOOST_TEST(test_delimited(L"x ", 'x', wchar(' ')));
+        BOOST_TEST(test_delimited("x ", char_, 'x', ' '));
+        BOOST_TEST(test_delimited(L"x ", char_, L'x', L' '));
+        BOOST_TEST(!test_delimited("x ", char_, 'y', ' '));
+        BOOST_TEST(!test_delimited(L"x ", char_, L'y', L' '));
+
+        BOOST_TEST(test_delimited("x ", char_('x'), ' '));
+        BOOST_TEST(!test_delimited("x ", char_('y'), ' '));
 
-        BOOST_TEST(test_delimited(L"x ", wchar, L'x', wchar(' ')));
-        BOOST_TEST(test_delimited(L"x ", wchar, 'x', wchar(' ')));
+        BOOST_TEST(test_delimited("x ", char_("x"), ' '));
 
-        BOOST_TEST(test_delimited(L"x ", wchar(L'x'), wchar(' ')));
-        BOOST_TEST(test_delimited(L"x ", wchar('x'), wchar(' ')));
-        
 #if defined(KARMA_FAIL_COMPILATION)
-        BOOST_TEST(test_delimited("x ", char_, space));   // anychar without a parameter doesn't make any sense
+        BOOST_TEST(test_delimited("x ", char_, ' '));   // anychar without a parameter doesn't make any sense
 #endif
     }
-    
+
+    {   // pre-delimiting
+        {
+            std::string generated;
+            std::back_insert_iterator<std::string> it(generated);
+            BOOST_TEST(karma::generate_delimited(it, '_', '^'
+              , karma::delimit_flag::predelimit));
+            BOOST_TEST(generated == "^_^");
+        }
+        {
+            using namespace boost::spirit::standard_wide;
+            std::basic_string<wchar_t> generated;
+            std::back_insert_iterator<std::basic_string<wchar_t> > it(generated);
+            BOOST_TEST(karma::generate_delimited(it, char_, L'.'
+              , karma::delimit_flag::predelimit, L'x'));
+            BOOST_TEST(generated == L".x.");
+        }
+    }
+
     // action tests
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test("x", char_[_1 = val('x')]));
-        BOOST_TEST(test(L"x", wchar[_1 = val(L'x')]));
         BOOST_TEST(!test("x", char_[_1 = val('y')]));
-        BOOST_TEST(!test(L"x", wchar[_1 = val(L'y')]));
     }
 
     {   // lazy chars
+        namespace ascii = boost::spirit::ascii;
+        namespace wide = boost::spirit::standard_wide;
 
         using namespace boost::phoenix;
-        BOOST_TEST((test("x", char_(val('x')))));
-        BOOST_TEST((test(L"x", char_(val(L'x')))));
+
+        BOOST_TEST((test("x", ascii::char_(val('x')))));
+        BOOST_TEST((test(L"x", wide::char_(val(L'x')))));
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/karma/delimiter.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/delimiter.cpp	(original)
+++ trunk/libs/spirit/test/karma/delimiter.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -22,7 +22,8 @@
 main()
 {
     using namespace boost::spirit;
-    
+    using namespace boost::spirit::ascii;
+
     {
         BOOST_TEST(test("a b ", delimit[char_('a') << 'b']));
         BOOST_TEST(test("a*b*", delimit('*')[char_('a') << 'b']));
@@ -40,7 +41,7 @@
         BOOST_TEST(test_delimited("a b*c*d ", 
             char_('a') << delimit('*')[char_('b') << 'c'] << 'd', char_(' ')));
     }
-    
+
     {
         BOOST_TEST(test("ab", verbatim[char_('a') << 'b']));
         BOOST_TEST(test("abcd", 
@@ -51,6 +52,15 @@
         BOOST_TEST(test_delimited("a bc d ", 
             char_('a') << verbatim[char_('b') << 'c'] << 'd', char_(' ')));
     }
-    
+
+    {
+        // The doubled delimiters at the end are generated by the 'b' generator 
+        // and the verbatim[] directive. Currently, there is no easy way to 
+        // avoid this.
+        BOOST_TEST(test("a b  ", delimit[verbatim[delimit[char_('a') << 'b']]]));
+        BOOST_TEST(test_delimited("a*b**", 
+            verbatim[delimit[char_('a') << 'b']], char_('*')));
+    }
+
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/karma/eps.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/eps.cpp	(original)
+++ trunk/libs/spirit/test/karma/eps.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -5,7 +5,12 @@
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
+
 #include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 
 #include <iostream>
@@ -14,19 +19,41 @@
 int
 main()
 {
-    using spirit_test::test;
+    using namespace spirit_test;
     using namespace boost::spirit;
 
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test("", eps));
+        BOOST_TEST(test_delimited(" ", eps, space));
+
+        BOOST_TEST(!test("", !eps));
+        BOOST_TEST(!test_delimited(" ", !eps, space));
     }
 
-    {   // test action
+    {   // test direct argument
+        using namespace boost::phoenix;
+
+        BOOST_TEST(test("", eps(true)));
+        BOOST_TEST(!test("", eps(false)));
+    }
 
+    {   // test action
         using namespace boost::phoenix;
+
         BOOST_TEST(test("", eps(val(true))));
         BOOST_TEST(!test("", eps(val(false))));
     }
 
+    {   // test no delimiter when argument is false
+        using namespace boost::spirit::ascii;
+
+        std::string generated;
+        std::back_insert_iterator<std::string> outit(generated);
+        BOOST_TEST(!karma::generate_delimited(outit, eps(false), space));
+        BOOST_TEST(generated.empty());
+    }
+
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/karma/format_manip.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/format_manip.cpp	(original)
+++ trunk/libs/spirit/test/karma/format_manip.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -24,30 +24,20 @@
 template <typename Char, typename Expr>
 bool test(Char const *expected, Expr const& xpr)
 {
-    namespace spirit = boost::spirit;
-    typedef 
-        spirit::traits::is_component<spirit::karma::domain, Expr> 
-    is_component;
-
-    // report invalid expression error as early as possible
-    BOOST_MPL_ASSERT_MSG(is_component::value,
-        xpr_is_not_convertible_to_a_generator, ());
-
-    typedef
-        typename spirit::result_of::as_component<spirit::karma::domain, Expr>::type
-    component;
-    typedef typename component::director director;
-
-    component c = spirit::as_component(spirit::karma::domain(), xpr);
+    // Report invalid expression error as early as possible.
+    // If you got an error_invalid_expression error message here,
+    // then the expression (expr) is not a valid spirit karma expression.
+    BOOST_SPIRIT_ASSERT_MATCH(boost::spirit::karma::domain, Expr)
 
     std::ostringstream ostrm;
-    ostrm << c;
+    ostrm << boost::spirit::compile<boost::spirit::karma::domain>(xpr);
     return ostrm.good() && ostrm.str() == expected;
 }
 
-template <typename Char, typename Expr, typename Parameter, typename Delimiter>
+template <typename Char, typename Expr, typename Copy, typename Delimiter
+  , typename Attribute>
 bool test(Char const *expected, 
-    boost::spirit::karma::detail::format_manip<Expr, Parameter, Delimiter> const& fm)
+    boost::spirit::karma::detail::format_manip<Expr, Copy, Delimiter, Attribute> const& fm)
 {
     std::ostringstream ostrm;
     ostrm << fm;
@@ -60,7 +50,6 @@
 {
     using namespace boost::spirit;
     using namespace boost::spirit::ascii;
-    using namespace boost::spirit::arg_names;
     using namespace boost::spirit::karma;
 
     namespace fusion = boost::fusion;
@@ -68,6 +57,9 @@
 
     {
         BOOST_TEST(test( "a", 
+            char_('a')
+        ));
+        BOOST_TEST(test( "a", 
             char_[_1 = val('a')]
         ));
         BOOST_TEST(test( "a", 
@@ -80,10 +72,10 @@
             format(char_, 'a') 
         ));
         BOOST_TEST(test( "a ", 
-            format_delimited(char_, 'a', space) 
+            format_delimited(char_, space, 'a') 
         ));
     }
-    
+
     {
         BOOST_TEST(test( "ab", 
             char_[_1 = val('a')] << char_[_1 = val('b')] 
@@ -94,17 +86,17 @@
         BOOST_TEST(test( "a b ", 
             format_delimited(char_[_1 = val('a')] << char_[_1 = val('b')], space) 
         ));
-        
+
         fusion::vector<char, char> t('a', 'b');
 
         BOOST_TEST(test( "ab", 
             format(char_ << char_, t) 
         ));
         BOOST_TEST(test( "a b ", 
-            format_delimited(char_ << char_, t, space) 
+            format_delimited(char_ << char_, space, t) 
         ));
     }
-    
+
     {
         BOOST_TEST(test( "abc", 
             char_[_1 = 'a'] << char_[_1 = 'b'] << char_[_1 = 'c']
@@ -122,7 +114,7 @@
             format(char_ << char_ << char_, t) 
         ));
         BOOST_TEST(test( "a b c ", 
-            format_delimited(char_ << char_ << char_, t, space) 
+            format_delimited(char_ << char_ << char_, space, t) 
         ));
     }
 
@@ -137,7 +129,7 @@
             format(char_ << int_, t) 
         ));
         BOOST_TEST(test( "a 2 ", 
-            format_delimited(char_ << int_, t, space) 
+            format_delimited(char_ << int_, space, t) 
         ));
     }
     
@@ -147,7 +139,7 @@
         // output all elements of a vector
         std::vector<char> v;
         v += 'a', 'b', 'c';
-        
+
         BOOST_TEST(test( "abc", 
             (*char_)[_1 = v] 
         ));
@@ -155,7 +147,7 @@
             format(*char_, v)
         ));
         BOOST_TEST(test( "a b c ", 
-            format_delimited(*char_, v, space)
+            format_delimited(*char_, space, v)
         ));
 
         // output a comma separated list of vector elements
@@ -172,13 +164,13 @@
             format(char_ % ',', v)
         ));
         BOOST_TEST(test( "a , b , c ", 
-            format_delimited(char_ % ',', v, space)
+            format_delimited(char_ % ',', space, v)
         ));
 
         // output all elements of a list
         std::list<char> l;
         l += 'a', 'b', 'c';
-        
+
 //         BOOST_TEST(test( "abc", 
 //             (*char_)[_1 = l] 
 //         ));
@@ -192,7 +184,7 @@
             format(*char_, l)
         ));
         BOOST_TEST(test( "a b c ", 
-            format_delimited(*char_, l, space)
+            format_delimited(*char_, space, l)
         ));
     }
 
Added: trunk/libs/spirit/test/karma/format_manip_attr.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/format_manip_attr.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,171 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//#define KARMA_FAIL_COMPILATION
+
+#define SPIRIT_ARGUMENTS_LIMIT 10
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+
+#include "test_manip_attr.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+    using namespace boost::spirit;
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test("1", char_, '1'));
+        BOOST_TEST(test("12", char_ << char_, '1', '2'));
+        BOOST_TEST(test("123", char_ << char_ << char_, '1', '2', '3'));
+        BOOST_TEST(test("1234"
+          , char_ << char_ << char_ << char_
+          , '1', '2', '3', '4'));
+        BOOST_TEST(test("12345"
+          , char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5'));
+        BOOST_TEST(test("123456"
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test("1234567"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test("12345678"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test("123456789"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test("1234567890"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test_delimited("1 ", char_, space, '1'));
+        BOOST_TEST(test_delimited("1 2 "
+          , char_ << char_, space, '1', '2'));
+        BOOST_TEST(test_delimited("1 2 3 "
+          , char_ << char_ << char_, space, '1', '2', '3'));
+        BOOST_TEST(test_delimited("1 2 3 4 "
+          , char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 "
+          , char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 "
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 8 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 8 9 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 8 9 0 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::karma::delimit_flag;
+
+        BOOST_TEST(test_predelimited(" 1 ", char_, space
+          , delimit_flag::predelimit, '1'));
+        BOOST_TEST(test_predelimited(" 1 2 "
+          , char_ << char_, space, delimit_flag::predelimit
+          , '1', '2'));
+        BOOST_TEST(test_predelimited(" 1 2 3 "
+          , char_ << char_ << char_, space
+          , delimit_flag::predelimit, '1', '2', '3'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 "
+          , char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit, '1', '2', '3', '4'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 "
+          , char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 "
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 8 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 8 9 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 8 9 0 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::karma::delimit_flag;
+
+        BOOST_TEST(test_predelimited("1 ", char_, space
+          , delimit_flag::dont_predelimit, '1'));
+        BOOST_TEST(test_predelimited("1 2 "
+          , char_ << char_, space, delimit_flag::dont_predelimit
+          , '1', '2'));
+        BOOST_TEST(test_predelimited("1 2 3 "
+          , char_ << char_ << char_, space
+          , delimit_flag::dont_predelimit, '1', '2', '3'));
+        BOOST_TEST(test_predelimited("1 2 3 4 "
+          , char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit, '1', '2', '3', '4'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 "
+          , char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 "
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 8 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 8 9 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 8 9 0 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/karma/generate_attr.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/generate_attr.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,169 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//#define KARMA_FAIL_COMPILATION
+
+#define SPIRIT_ARGUMENTS_LIMIT 10
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_generate_attr.hpp>
+
+#include "test_attr.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+    using namespace boost::spirit;
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test("1", char_, '1'));
+        BOOST_TEST(test("12", char_ << char_, '1', '2'));
+        BOOST_TEST(test("123", char_ << char_ << char_, '1', '2', '3'));
+        BOOST_TEST(test("1234"
+          , char_ << char_ << char_ << char_
+          , '1', '2', '3', '4'));
+        BOOST_TEST(test("12345"
+          , char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5'));
+        BOOST_TEST(test("123456"
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test("1234567"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test("12345678"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test("123456789"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test("1234567890"
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test_delimited("1 ", char_, space, '1'));
+        BOOST_TEST(test_delimited("1 2 "
+          , char_ << char_, space, '1', '2'));
+        BOOST_TEST(test_delimited("1 2 3 "
+          , char_ << char_ << char_, space, '1', '2', '3'));
+        BOOST_TEST(test_delimited("1 2 3 4 "
+          , char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 "
+          , char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 "
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 8 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 8 9 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_delimited("1 2 3 4 5 6 7 8 9 0 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::karma::delimit_flag;
+
+        BOOST_TEST(test_predelimited(" 1 ", char_, space
+          , delimit_flag::predelimit, '1'));
+        BOOST_TEST(test_predelimited(" 1 2 "
+          , char_ << char_, space, delimit_flag::predelimit
+          , '1', '2'));
+        BOOST_TEST(test_predelimited(" 1 2 3 "
+          , char_ << char_ << char_, space
+          , delimit_flag::predelimit, '1', '2', '3'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 "
+          , char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit, '1', '2', '3', '4'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 "
+          , char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 "
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 8 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 8 9 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_predelimited(" 1 2 3 4 5 6 7 8 9 0 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::karma::delimit_flag;
+
+        BOOST_TEST(test_predelimited("1 ", char_, space
+          , delimit_flag::dont_predelimit, '1'));
+        BOOST_TEST(test_predelimited("1 2 "
+          , char_ << char_, space, delimit_flag::dont_predelimit
+          , '1', '2'));
+        BOOST_TEST(test_predelimited("1 2 3 "
+          , char_ << char_ << char_, space
+          , delimit_flag::dont_predelimit, '1', '2', '3'));
+        BOOST_TEST(test_predelimited("1 2 3 4 "
+          , char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit, '1', '2', '3', '4'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 "
+          , char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 "
+          , char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 8 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 8 9 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_predelimited("1 2 3 4 5 6 7 8 9 0 "
+          , char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_ << char_
+          , space, delimit_flag::dont_predelimit
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/karma/grammar.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/grammar.cpp	(original)
+++ trunk/libs/spirit/test/karma/grammar.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -6,9 +6,6 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-// include this first to make rules have placeholders (e.g. r._1)
-#include <boost/spirit/include/support_argument.hpp>
-
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_string.hpp>
@@ -52,7 +49,6 @@
     }
 
     { // direct access to the rules
-
         num_list def;
         BOOST_TEST(test_delimited("123 ", def.num1, space));
         BOOST_TEST(test_delimited("123 , 456 , 789 ", def.start, space));
Modified: trunk/libs/spirit/test/karma/grammar_fail.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/grammar_fail.cpp	(original)
+++ trunk/libs/spirit/test/karma/grammar_fail.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -6,6 +6,7 @@
 =============================================================================*/
 
 #include <boost/config/warning_disable.hpp>
+
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_string.hpp>
@@ -19,29 +20,27 @@
 using namespace boost::spirit::karma;
 using namespace boost::spirit::ascii;
 
-struct num_list : grammar<char const*, rule<char const*> >
+typedef spirit_test::output_iterator<char>::type outiter_type;
+
+struct num_list : grammar<outiter_type, rule<outiter_type> >
 {
-    num_list()
+    num_list() : num_list::base_type(start)
     {
-        using boost::spirit::int_;
         start = int_(1) << ',' << int_(0);
     }
 
-    rule<char const*, rule<char const*> > start;
+    rule<outiter_type, rule<outiter_type> > start;
 };
 
-// this test must fail compiling
+// this test must fail compiling as the rule is used with an incompatible 
+// delimiter type
 int main()
 {
-    using boost::make_function_output_iterator;
-    using spirit_test::make_string_appender;
-    
     std::string generated;
-    
+
+    std::back_insert_iterator<std::string> outit(generated);
     num_list def;
-    bool r = generate_delimited(
-                make_function_output_iterator(make_string_appender(generated)), 
-                make_generator(def), char_('%') << '\n');
+    bool r = generate_delimited(outit, def, char_('%') << '\n');
 
     return 0;
 }
Modified: trunk/libs/spirit/test/karma/int_numerics.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/int_numerics.cpp	(original)
+++ trunk/libs/spirit/test/karma/int_numerics.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -12,14 +12,13 @@
 #include <boost/mpl/for_each.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/bool.hpp>
+
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
 
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
 #include <boost/spirit/include/karma_directive.hpp>
 #include <boost/spirit/include/karma_action.hpp>
 
@@ -36,24 +35,23 @@
     {
         using namespace boost::spirit;
         using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        
+
         T minval = (std::numeric_limits<T>::min)();
         T maxval = (std::numeric_limits<T>::max)();
-        
+
         std::string expected_minval = boost::lexical_cast<std::string>(minval); 
         std::string expected_maxval = boost::lexical_cast<std::string>(maxval);
-        
+
         // create a correct generator type from the given integer type
         typedef typename
             boost::mpl::if_<
                 boost::mpl::bool_<std::numeric_limits<T>::is_signed>,
-                karma::int_spec<T>,
-                karma::uint_spec<T>
+                karma::int_generator<T>,
+                karma::uint_generator<T>
             >::type
-        int_spec_type;
-        
-        int_spec_type const gen = int_spec_type();
+        int_generator_type;
+
+        int_generator_type const gen = int_generator_type();
 
         BOOST_TEST(test(expected_maxval, gen, maxval));
         BOOST_TEST(test(expected_minval, gen, minval));
@@ -76,10 +74,10 @@
 main()
 {
     using namespace boost::spirit;
-    
+
     {
         using namespace boost::spirit::ascii;
-        
+
         ///////////////////////////////////////////////////////////////////////
         // this is currently ambiguous with character literals
 //         BOOST_TEST(test("0", 0));
@@ -136,11 +134,24 @@
         BOOST_TEST(test_delimited("-123 ", upper[int_(-123)], char_(' ')));
     }
 
+    {   // lazy numerics
+        using namespace boost::phoenix;
+
+        BOOST_TEST(test("0", int_(val(0))));
+        BOOST_TEST(test("123", int_(val(123))));
+        BOOST_TEST(test("-123", int_(val(-123))));
+
+        int i1 = 0, i2 = 123, i3 = -123;
+        BOOST_TEST(test("0", int_(ref(i1))));
+        BOOST_TEST(test("123", int_(ref(i2))));
+        BOOST_TEST(test("-123", int_(ref(i3))));
+    }
+
     {
         using namespace boost::spirit::ascii;
-        
-        karma::int_spec<int, 10, true> const signed_int =
-            karma::int_spec<int, 10, true>();
+
+        karma::int_generator<int, 10, true> const signed_int =
+            karma::int_generator<int, 10, true>();
 
         ///////////////////////////////////////////////////////////////////////
         BOOST_TEST(test(" 0", signed_int, 0));
@@ -191,54 +202,64 @@
         BOOST_TEST(test_delimited(" 0 ", upper[signed_int(0)], char_(' ')));
         BOOST_TEST(test_delimited("+123 ", upper[signed_int(123)], char_(' ')));
         BOOST_TEST(test_delimited("-123 ", upper[signed_int(-123)], char_(' ')));
+
+        using namespace boost::phoenix;
+
+        BOOST_TEST(test(" 0", signed_int(val(0))));
+        BOOST_TEST(test("+123", signed_int(val(123))));
+        BOOST_TEST(test("-123", signed_int(val(-123))));
+
+        int i1 = 0, i2 = 123, i3 = -123;
+        BOOST_TEST(test(" 0", signed_int(ref(i1))));
+        BOOST_TEST(test("+123", signed_int(ref(i2))));
+        BOOST_TEST(test("-123", signed_int(ref(i3))));
     }
 
     {
         ///////////////////////////////////////////////////////////////////////
-        using boost::spirit::uint_;
         using namespace boost::spirit::ascii;
-        
+
         BOOST_TEST(test("1234", uint_, 1234));
         BOOST_TEST(test("ff", hex, 0xff));
         BOOST_TEST(test("1234", oct, 01234));
         BOOST_TEST(test("11110000", bin, 0xf0));
-        
+
         BOOST_TEST(test_delimited("1234 ", uint_, 1234, char_(' ')));
         BOOST_TEST(test_delimited("ff ", hex, 0xff, char_(' ')));
         BOOST_TEST(test_delimited("1234 ", oct, 01234, char_(' ')));
         BOOST_TEST(test_delimited("11110000 ", bin, 0xf0, char_(' ')));
-        
+
         BOOST_TEST(test("1234", lower[uint_], 1234));
         BOOST_TEST(test("ff", lower[hex], 0xff));
         BOOST_TEST(test("1234", lower[oct], 01234));
         BOOST_TEST(test("11110000", lower[bin], 0xf0));
-        
+
         BOOST_TEST(test_delimited("1234 ", lower[uint_], 1234, char_(' ')));
         BOOST_TEST(test_delimited("ff ", lower[hex], 0xff, char_(' ')));
         BOOST_TEST(test_delimited("1234 ", lower[oct], 01234, char_(' ')));
         BOOST_TEST(test_delimited("11110000 ", lower[bin], 0xf0, char_(' ')));
-        
+
         BOOST_TEST(test("1234", upper[uint_], 1234));
         BOOST_TEST(test("FF", upper[hex], 0xff));
         BOOST_TEST(test("1234", upper[oct], 01234));
         BOOST_TEST(test("11110000", upper[bin], 0xf0));
-        
+
         BOOST_TEST(test_delimited("1234 ", upper[uint_], 1234, char_(' ')));
         BOOST_TEST(test_delimited("FF ", upper[hex], 0xff, char_(' ')));
         BOOST_TEST(test_delimited("1234 ", upper[oct], 01234, char_(' ')));
         BOOST_TEST(test_delimited("11110000 ", upper[bin], 0xf0, char_(' ')));
-        
+
         // no generator transformation should occur for uint_'s
         BOOST_TEST(test("1234", upper[upper[uint_]], 1234));
         BOOST_TEST(test("1234", upper[lower[uint_]], 1234));
         BOOST_TEST(test("1234", lower[upper[uint_]], 1234));
         BOOST_TEST(test("1234", lower[lower[uint_]], 1234));
-        
+
         BOOST_TEST(test_delimited("1234 ", upper[upper[uint_]], 1234, char_(' ')));
         BOOST_TEST(test_delimited("1234 ", upper[lower[uint_]], 1234, char_(' ')));
         BOOST_TEST(test_delimited("1234 ", lower[upper[uint_]], 1234, char_(' ')));
         BOOST_TEST(test_delimited("1234 ", lower[lower[uint_]], 1234, char_(' ')));
-        
+
         BOOST_TEST(test("FF", upper[upper[hex]], 0xff));
         BOOST_TEST(test("FF", upper[lower[hex]], 0xff));
         BOOST_TEST(test("ff", lower[upper[hex]], 0xff));
@@ -254,7 +275,7 @@
         BOOST_TEST(test("ff", hex(0xff)));
         BOOST_TEST(test("1234", oct(01234)));
         BOOST_TEST(test("11110000", bin(0xf0)));
-        
+
         BOOST_TEST(test_delimited("1234 ", uint_(1234), char_(' ')));
         BOOST_TEST(test_delimited("ff ", hex(0xff), char_(' ')));
         BOOST_TEST(test_delimited("1234 ", oct(01234), char_(' ')));
@@ -264,22 +285,22 @@
         BOOST_TEST(test("ff", lower[hex(0xff)]));
         BOOST_TEST(test("1234", lower[oct(01234)]));
         BOOST_TEST(test("11110000", lower[bin(0xf0)]));
-        
+
         BOOST_TEST(test_delimited("1234 ", lower[uint_(1234)], char_(' ')));
         BOOST_TEST(test_delimited("ff ", lower[hex(0xff)], char_(' ')));
         BOOST_TEST(test_delimited("1234 ", lower[oct(01234)], char_(' ')));
         BOOST_TEST(test_delimited("11110000 ", lower[bin(0xf0)], char_(' ')));
-        
+
         BOOST_TEST(test("1234", upper[uint_(1234)]));
         BOOST_TEST(test("FF", upper[hex(0xff)]));
         BOOST_TEST(test("1234", upper[oct(01234)]));
         BOOST_TEST(test("11110000", upper[bin(0xf0)]));
-        
+
         BOOST_TEST(test_delimited("1234 ", upper[uint_(1234)], char_(' ')));
         BOOST_TEST(test_delimited("FF ", upper[hex(0xff)], char_(' ')));
         BOOST_TEST(test_delimited("1234 ", upper[oct(01234)], char_(' ')));
         BOOST_TEST(test_delimited("11110000 ", upper[bin(0xf0)], char_(' ')));
-        
+
         BOOST_TEST(test("FF", upper[upper[hex(0xff)]]));
         BOOST_TEST(test("FF", upper[lower[hex(0xff)]]));
         BOOST_TEST(test("ff", lower[upper[hex(0xff)]]));
@@ -301,7 +322,7 @@
         long, unsigned long
     > integer_types;
     boost::mpl::for_each<integer_types>(test_minmax());
-    
+
     return boost::report_errors();
 }
 
Modified: trunk/libs/spirit/test/karma/kleene.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/kleene.cpp	(original)
+++ trunk/libs/spirit/test/karma/kleene.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -8,8 +8,6 @@
 
 #include <boost/assign/std/vector.hpp>
 
-#include <boost/spirit/include/support_argument.hpp>
-// #include <boost/spirit/include/support_pack.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_string.hpp>
 #include <boost/spirit/include/karma_numeric.hpp>
@@ -17,7 +15,6 @@
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_action.hpp>
 #include <boost/fusion/include/vector.hpp>
-#include <boost/spirit/include/support_unused.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
@@ -30,8 +27,19 @@
 int main()
 {
     using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
     namespace fusion = boost::fusion;
-    
+
+    {
+        std::string s1("aaaa");
+        BOOST_TEST(test("aaaa", *char_, s1));
+        BOOST_TEST(test_delimited("a a a a ", *char_, s1, ' '));
+
+        std::string s2("");
+        BOOST_TEST(test("", *char_, s2));
+        BOOST_TEST(test_delimited("", *char_, s2, ' '));
+    }
+
     {
         using namespace boost::assign;
 
@@ -41,72 +49,35 @@
         BOOST_TEST(test("abc", *char_, v));
         BOOST_TEST(test_delimited("a b c ", *char_, v, ' '));
     }
-    
-    {
-        using namespace boost::assign;
 
-        std::vector<char> v;
-        
-        // these need to fail, because the return value should be false
-        BOOST_TEST(!test("", +char_, v));
-        BOOST_TEST(!test_delimited("", +char_, v, ' '));
-        
-        v += 'a', 'b', 'c';
-
-        BOOST_TEST(test("abc", +char_, v));
-        BOOST_TEST(test_delimited("a b c ", +char_, v, ' '));
-    }
-    
     {
         using namespace boost::assign;
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        
+
         std::vector<int> v;
         v += 10, 20, 30;
 
         BOOST_TEST(test("102030", *int_, v));
         BOOST_TEST(test_delimited("10, 20, 30, ", *int_, v, lit(", ")));
 
-        typedef fusion::vector<int> fvec;
-        std::vector<fvec> sv;
-        sv += fvec(10), fvec(20), fvec(30);
-
-        BOOST_TEST(test("10,20,30,", *(int_ << ','), sv));
-        BOOST_TEST(test_delimited("10 , 20 , 30 , ", *(int_ << ','), sv, lit(" ")));
+        BOOST_TEST(test("10,20,30,", *(int_ << ','), v));
+        BOOST_TEST(test_delimited("10 , 20 , 30 , ", *(int_ << ','), v, lit(" ")));
  
         fusion::vector<char, char> cc ('a', 'c');
         BOOST_TEST(test("ac", char_ << *(char_(' ') << ',') << char_, cc));
         BOOST_TEST(test_delimited("a c ", 
             char_ << *(char_(' ') << ',') << char_, cc, " "));
     }
-    
-    {
-        using namespace boost::assign;
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        
-        std::vector<int> v;
-
-        BOOST_TEST(!test("", +int_, v));
-        BOOST_TEST(!test_delimited("", +int_, v, lit(", ")));
 
-        v += 10, 20, 30;
-
-        BOOST_TEST(test("102030", +int_, v));
-        BOOST_TEST(test_delimited("10, 20, 30, ", +int_, v, lit(", ")));
-
-        typedef fusion::vector<int> fvec;
-        std::vector<fvec> sv;
-        sv += fvec(10), fvec(20), fvec(30);
+    { // actions
+        using namespace boost::assign;
+        namespace phx = boost::phoenix;
 
-        BOOST_TEST(test("10,20,30,", +(int_ << ','), sv));
-        BOOST_TEST(test_delimited("10 , 20 , 30 , ", +(int_ << ','), sv, lit(" ")));
+        std::vector<char> v;
+        v += 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h';
 
-        fusion::vector<char, char> cc ('a', 'c');
-        BOOST_TEST(!test("", char_ << +(char_(' ') << ',') << char_, cc));
-        BOOST_TEST(!test_delimited("", 
-            char_ << +(char_(' ') << ',') << char_, cc, " "));
+        BOOST_TEST(test("abcdefgh", (*char_)[_1 = phx::ref(v)]));
+        BOOST_TEST(test_delimited("a b c d e f g h ", 
+            (*char_ )[_1 = phx::ref(v)], space));
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/karma/lazy.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/lazy.cpp	(original)
+++ trunk/libs/spirit/test/karma/lazy.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -10,8 +10,8 @@
 #include <boost/spirit/include/karma_numeric.hpp>
 #include <boost/spirit/include/karma_auxiliary.hpp>
 #include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
+// #include <boost/spirit/include/karma_nonterminal.hpp>
+// #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
@@ -22,31 +22,31 @@
 int
 main()
 {
+    namespace karma = boost::spirit::karma;
     using spirit_test::test;
     using namespace boost::spirit;
     using namespace boost::spirit::karma;
-    using namespace boost::spirit::arg_names;
     namespace phx = boost::phoenix;
 
     {
-        BOOST_TEST(test("123", lazy(phx::val(int_)), 123));
+        BOOST_TEST(test("123", karma::lazy(phx::val(int_)), 123));
     }
 
     {
         int result = 123;
-        BOOST_TEST(test("123", lazy(phx::val(int_))[_1 = phx::ref(result)]));
+        BOOST_TEST(test("123", karma::lazy(phx::val(int_))[_1 = phx::ref(result)]));
     }
 
-    {
-        typedef spirit_test::output_iterator<char>::type outiter_type;
-        rule<outiter_type, void(std::string)> r;
-
-        r = char_('<') << lazy(_r1) << '>' <<  "</" << lazy(_r1) << '>';
-
-        std::string tag("tag"), foo("foo");
-        BOOST_TEST(test("<tag></tag>", r (phx::ref(tag))));
-        BOOST_TEST(!test("<foo></bar>", r (phx::ref(foo))));
-    }
+//     {
+//         typedef spirit_test::output_iterator<char>::type outiter_type;
+//         rule<outiter_type, void(std::string)> r;
+// 
+//         r = char_('<') << karma::lazy(_r1) << '>' <<  "</" << karma::lazy(_r1) << '>';
+// 
+//         std::string tag("tag"), foo("foo");
+//         BOOST_TEST(test("<tag></tag>", r (phx::ref(tag))));
+//         BOOST_TEST(!test("<foo></bar>", r (phx::ref(foo))));
+//     }
 
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/karma/left_alignment.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/left_alignment.cpp	(original)
+++ trunk/libs/spirit/test/karma/left_alignment.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -14,19 +14,19 @@
 
 #include "test.hpp"
 
-using namespace spirit_test;
-
 ///////////////////////////////////////////////////////////////////////////////
 int 
 main()
 {
+    using namespace spirit_test;
     using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
 
     {
         BOOST_TEST(test("x         ", left_align[char_('x')]));
         BOOST_TEST(test("x         ", left_align[char_], 'x'));
         BOOST_TEST(test("x         ", left_align['x']));
-        
+
         BOOST_TEST(test("x         ", left_align(10)[char_('x')]));
         BOOST_TEST(test("x         ", left_align(10)[char_], 'x'));
         BOOST_TEST(test("x         ", left_align(10)['x']));
@@ -40,18 +40,18 @@
         BOOST_TEST(test("x*********", left_align(char_('*'))['x']));
 
         BOOST_TEST(test("abc       ", left_align[lit("abc")]));
-        BOOST_TEST(test("abc       ", left_align[lit], "abc"));
-        
+        BOOST_TEST(test("abc       ", left_align[string], "abc"));
+
         BOOST_TEST(test("abc       ", left_align(10)[lit("abc")]));
-        BOOST_TEST(test("abc       ", left_align(10)[lit], "abc"));
+        BOOST_TEST(test("abc       ", left_align(10)[string], "abc"));
         BOOST_TEST(test("abc       ", left_align(10)["abc"]));
 
         BOOST_TEST(test("abc*******", left_align(10, char_('*'))[lit("abc")]));
-        BOOST_TEST(test("abc*******", left_align(10, '*')[lit], "abc"));
+        BOOST_TEST(test("abc*******", left_align(10, '*')[string], "abc"));
         BOOST_TEST(test("abc*******", left_align(10, '*')["abc"]));
 
         BOOST_TEST(test("abc*******", left_align(char_('*'))[lit("abc")]));
-        BOOST_TEST(test("abc*******", left_align(char_('*'))[lit], "abc"));
+        BOOST_TEST(test("abc*******", left_align(char_('*'))[string], "abc"));
         BOOST_TEST(test("abc*******", left_align(char_('*'))["abc"]));
 
         BOOST_TEST(test("100       ", left_align[int_(100)]));
Modified: trunk/libs/spirit/test/karma/list.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/list.cpp	(original)
+++ trunk/libs/spirit/test/karma/list.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -5,7 +5,6 @@
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/utility/enable_if.hpp>
 
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_char.hpp>
@@ -13,11 +12,11 @@
 #include <boost/spirit/include/karma_numeric.hpp>
 #include <boost/spirit/include/karma_directive.hpp>
 #include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_object.hpp>
 #include <boost/spirit/include/phoenix_stl.hpp>
+
 #include <boost/assign/std/vector.hpp>
 
 #include <string>
@@ -38,7 +37,7 @@
 
     std::vector<char> v;
     v += 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h';
-    
+
     {
         BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ',', v));
         BOOST_TEST(test_delimited("a , b , c , d , e , f , g , h ", 
@@ -54,7 +53,6 @@
 
     { // actions
         namespace phx = boost::phoenix;
-        using boost::spirit::arg_names::_1;
 
         BOOST_TEST(test("a,b,c,d,e,f,g,h", (char_ % ',')[_1 = phx::ref(v)]));
         BOOST_TEST(test_delimited("a , b , c , d , e , f , g , h ", 
Modified: trunk/libs/spirit/test/karma/lit.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/lit.cpp	(original)
+++ trunk/libs/spirit/test/karma/lit.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -23,28 +23,38 @@
 main()
 {
     using namespace boost::spirit;
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test("a", lit('a')));
         BOOST_TEST(!test("a", lit('b')));
-        
+
         BOOST_TEST(test("abc", "abc"));
         BOOST_TEST(!test("abcd", "abc"));
 
         BOOST_TEST(test("abc", lit("abc")));
         BOOST_TEST(!test("abcd", lit("abc")));
 
-        BOOST_TEST(test("abc", lit, "abc"));
-        BOOST_TEST(!test("abcd", lit, "abc"));
+        BOOST_TEST(test("abc", string, "abc"));
+        BOOST_TEST(!test("abcd", string, "abc"));
+
+        BOOST_TEST(test("abc", string("abc")));
+        BOOST_TEST(!test("abcd", string("abc")));
     }
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         std::string str("abc");
         BOOST_TEST(test("abc", lit(str)));
         BOOST_TEST(!test("abcd", lit(str)));
 
-        BOOST_TEST(test("abc", lit, str));
-        BOOST_TEST(!test("abcd", lit, str));
+        BOOST_TEST(test("abc", string(str)));
+        BOOST_TEST(!test("abcd", string(str)));
+
+        BOOST_TEST(test("abc", string, str));
+        BOOST_TEST(!test("abcd", string, str));
 
         BOOST_TEST(test("abc", str));
         BOOST_TEST(!test("abcd", str));
@@ -53,85 +63,94 @@
         BOOST_TEST(test(L"abc", lit(wstr)));
         BOOST_TEST(!test(L"abcd", lit(wstr)));
 
-        BOOST_TEST(test(L"abc", lit, wstr));
-        BOOST_TEST(!test(L"abcd", lit, wstr));
+        BOOST_TEST(test(L"abc", string, wstr));
+        BOOST_TEST(!test(L"abcd", string, wstr));
 
         BOOST_TEST(test(L"abc", wstr));
         BOOST_TEST(!test(L"abcd", wstr));
     }
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test(L"a", lit(L'a')));
         BOOST_TEST(!test(L"a", lit(L'b')));
-        
+
         BOOST_TEST(test(L"abc", L"abc"));
         BOOST_TEST(test(L"abc", "abc"));
         BOOST_TEST(!test(L"abcd", L"abc"));
 
         BOOST_TEST(test(L"abc", lit(L"abc")));
-        BOOST_TEST(test(L"abc", wlit(L"abc")));
         BOOST_TEST(!test(L"abcd", lit(L"abc")));
 
-        BOOST_TEST(test(L"abc", lit, L"abc"));
-        BOOST_TEST(test(L"abc", wlit, L"abc"));
-        BOOST_TEST(!test(L"abcd", lit, L"abc"));
-
-        BOOST_TEST(test(L"abc", lit, "abc"));
-        BOOST_TEST(test(L"abc", wlit, "abc"));
-        BOOST_TEST(!test(L"abcd", lit, "abc"));
+        BOOST_TEST(test(L"abc", string(L"abc")));
+        BOOST_TEST(!test(L"abcd", string(L"abc")));
+
+        BOOST_TEST(test(L"abc", string, L"abc"));
+        BOOST_TEST(!test(L"abcd", string, L"abc"));
+
+        BOOST_TEST(test(L"abc", string, "abc"));
+        BOOST_TEST(!test(L"abcd", string, "abc"));
     }
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test_delimited("a ", lit('a'), ' '));
         BOOST_TEST(!test_delimited("a ", lit('b'), ' '));
-        
+
         BOOST_TEST(test_delimited("abc ", "abc", ' '));
         BOOST_TEST(!test_delimited("abcd ", "abc", ' '));
 
         BOOST_TEST(test_delimited("abc ", lit("abc"), ' '));
         BOOST_TEST(!test_delimited("abcd ", lit("abc"), ' '));
 
-        BOOST_TEST(test_delimited("abc ", lit, "abc", ' '));
-        BOOST_TEST(!test_delimited("abcd ", lit, "abc", ' '));
+        BOOST_TEST(test_delimited("abc ", string, "abc", ' '));
+        BOOST_TEST(!test_delimited("abcd ", string, "abc", ' '));
+
+        BOOST_TEST(test_delimited("abc ", string("abc"), ' '));
+        BOOST_TEST(!test_delimited("abcd ", string("abc"), ' '));
     }
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test_delimited(L"a ", lit(L'a'), ' '));
         BOOST_TEST(!test_delimited(L"a ", lit(L'b'), ' '));
-        
+
         BOOST_TEST(test_delimited(L"abc ", L"abc", ' '));
         BOOST_TEST(!test_delimited(L"abcd ", L"abc", ' '));
 
         BOOST_TEST(test_delimited(L"abc ", lit(L"abc"), ' '));
-        BOOST_TEST(test_delimited(L"abc ", wlit(L"abc"), ' '));
-        BOOST_TEST(test_delimited(L"abc ", wlit("abc"), ' '));
         BOOST_TEST(!test_delimited(L"abcd ", lit(L"abc"), ' '));
 
-        BOOST_TEST(test_delimited(L"abc ", lit, L"abc", ' '));
-        BOOST_TEST(test_delimited(L"abc ", wlit, L"abc", ' '));
-        BOOST_TEST(test_delimited(L"abc ", wlit, "abc", ' '));
-        BOOST_TEST(!test_delimited(L"abcd ", lit, L"abc", ' '));
+        BOOST_TEST(test_delimited(L"abc ", string, L"abc", ' '));
+        BOOST_TEST(!test_delimited(L"abcd ", string, L"abc", ' '));
+
+        BOOST_TEST(test_delimited(L"abc ", string(L"abc"), ' '));
+        BOOST_TEST(!test_delimited(L"abcd ", string(L"abc"), ' '));
     }
 
     {   // test action
-
         using namespace boost::phoenix;
-        using boost::spirit::arg_names::_1;
         using namespace boost::spirit::ascii;
-        
+
         std::string str("abc");
-        BOOST_TEST(test("abc", lit[_1 = ref(str)]));
-        BOOST_TEST(test_delimited("abc ", lit[_1 = ref(str)], space));
+        BOOST_TEST(test("abc", string[_1 = ref(str)]));
+        BOOST_TEST(test_delimited("abc ", string[_1 = ref(str)], space));
     }
 
     {   // lazy strings
-
         using namespace boost::phoenix;
+        using namespace boost::spirit::ascii;
+
         std::basic_string<char> s("abc");
         BOOST_TEST((test("abc", lit(val(s)))));
+        BOOST_TEST((test("abc", string(val(s)))));
 
         std::basic_string<wchar_t> ws(L"abc");
         BOOST_TEST((test(L"abc", lit(ref(ws)))));
+        BOOST_TEST((test(L"abc", string(ref(ws)))));
     }
 
     return boost::report_errors();
Added: trunk/libs/spirit/test/karma/maxwidth.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/maxwidth.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,77 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int 
+main()
+{
+    using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
+
+    {
+        BOOST_TEST(test("0123456789", maxwidth[lit("0123456789")]));
+        BOOST_TEST(test("012345678", maxwidth[lit("012345678")]));
+        BOOST_TEST(test("0123456789", maxwidth[lit("01234567890")]));
+
+        BOOST_TEST(test("0123456789", maxwidth[string], "0123456789"));
+        BOOST_TEST(test("012345678", maxwidth[string], "012345678"));
+        BOOST_TEST(test("0123456789", maxwidth[string], "01234567890"));
+    }
+
+    {
+        BOOST_TEST(test("01234567", maxwidth(8)[lit("01234567")]));
+        BOOST_TEST(test("0123456", maxwidth(8)[lit("0123456")]));
+        BOOST_TEST(test("01234567", maxwidth(8)[lit("012345678")]));
+
+        BOOST_TEST(test("01234567", maxwidth(8)[string], "01234567"));
+        BOOST_TEST(test("0123456", maxwidth(8)[string], "0123456"));
+        BOOST_TEST(test("01234567", maxwidth(8)[string], "012345678"));
+    }
+
+    {
+//         std::string str;
+//         BOOST_TEST(test("01234567", 
+//             maxwidth(8, std::back_inserter(str))[lit("01234567")]) &&
+//             str.empty());
+// 
+//         str = "";
+//         BOOST_TEST(test("0123456", 
+//             maxwidth(8, std::back_inserter(str))[lit("0123456")]) &&
+//             str.empty());
+// 
+//         str = "";
+//         BOOST_TEST(test("01234567", 
+//             maxwidth(8, std::back_inserter(str))[lit("012345678")]) &&
+//             str == "8");
+    }
+
+    {
+        using namespace boost::phoenix;
+
+        BOOST_TEST(test("01234567", maxwidth(val(8))[lit("01234567")]));
+        BOOST_TEST(test("0123456", maxwidth(val(8))[lit("0123456")]));
+        BOOST_TEST(test("01234567", maxwidth(val(8))[lit("012345678")]));
+
+        int w = 8;
+        BOOST_TEST(test("01234567", maxwidth(ref(w))[string], "01234567"));
+        BOOST_TEST(test("0123456", maxwidth(ref(w))[string], "0123456"));
+        BOOST_TEST(test("01234567", maxwidth(ref(w))[string], "012345678"));
+    }
+
+    return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/karma/none.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/none.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,33 +0,0 @@
-//  Copyright (c) 2001-2009 Hartmut Kaiser
-// 
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/karma_auxiliary.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-
-#include <iostream>
-#include "test.hpp"
-
-int
-main()
-{
-    using namespace spirit_test;
-    using namespace boost::spirit;
-    using namespace boost::spirit::ascii;
-
-    {
-        BOOST_TEST((!test("", none, 1)));
-        BOOST_TEST((!test("", none, "test")));
-    }
-
-    {
-        BOOST_TEST((!test_delimited(" ", none, 1, space)));
-        BOOST_TEST((!test_delimited(" ", none, "test", space)));
-    }
-
-    return boost::report_errors();
-}
Modified: trunk/libs/spirit/test/karma/optional.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/optional.cpp	(original)
+++ trunk/libs/spirit/test/karma/optional.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -10,7 +10,6 @@
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_numeric.hpp>
 #include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 
@@ -21,6 +20,7 @@
 {
     using namespace spirit_test;
     using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
 
     {
         boost::optional<int> opt;
@@ -36,8 +36,6 @@
     }
 
     {
-        using namespace boost::spirit::ascii;
-        
         boost::optional<int> opt;
         BOOST_TEST(test_delimited("", -int_, opt, space));
 
@@ -46,8 +44,6 @@
     }
 
     {
-        using namespace boost::spirit::ascii;
-
         int opt = 10;
         BOOST_TEST(test_delimited("10 ", -int_, opt, space));
     }
@@ -55,7 +51,6 @@
     {   // test action
         using namespace boost::phoenix;
         namespace phoenix = boost::phoenix;
-        using namespace boost::spirit::arg_names;
 
         boost::optional<int> n ;
         BOOST_TEST(test("", (-int_)[_1 = phoenix::ref(n)]));
@@ -67,7 +62,6 @@
     {   // test action
         using namespace boost::phoenix;
         namespace phoenix = boost::phoenix;
-        using namespace boost::spirit::arg_names;
 
         int n = 1234;
         BOOST_TEST(test("1234", (-int_)[_1 = phoenix::ref(n)]));
@@ -76,8 +70,6 @@
     {   // test action
         using namespace boost::phoenix;
         namespace phoenix = boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        using namespace boost::spirit::ascii;
 
         boost::optional<int> n;
         BOOST_TEST(test_delimited("", (-int_)[_1 = phoenix::ref(n)], space));
@@ -89,8 +81,6 @@
     {   // test action
         using namespace boost::phoenix;
         namespace phoenix = boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        using namespace boost::spirit::ascii;
 
         int n = 1234;
         BOOST_TEST(test_delimited("1234 ", (-int_)[_1 = phoenix::ref(n)], space));
Modified: trunk/libs/spirit/test/karma/pattern.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/pattern.cpp	(original)
+++ trunk/libs/spirit/test/karma/pattern.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -6,9 +6,6 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-// include this first to make rules have placeholders (e.g. _r1)
-#include <boost/spirit/include/support_argument.hpp>
-
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_auxiliary.hpp>
@@ -30,7 +27,6 @@
 {
     using namespace boost;
     using namespace boost::spirit;
-    using namespace boost::spirit::arg_names;
     using namespace boost::spirit::karma;
     using namespace boost::spirit::ascii;
 
@@ -39,7 +35,7 @@
     // test rule parameter propagation
     {
         using boost::phoenix::at_c;
-        
+
         rule<outiter_type, fusion::vector<char, int, double>()> start;
         fusion::vector<char, int, double> vec('a', 10, 12.4);
 
@@ -63,74 +59,115 @@
         BOOST_TEST(test("a1012.4", start, vec));
     }
 
-    // basic tests with delimiter
     {
-        rule<outiter_type, space_type> start;
+        using boost::phoenix::at_c;
+
+        rule<outiter_type, space_type, fusion::vector<char, int, double>()> start;
+        fusion::vector<char, int, double> vec('a', 10, 12.4);
+
+        start %= char_ << int_ << double_;
+        BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
 
-        start = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4];
-        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+        rule<outiter_type, space_type, char()> a;
+        rule<outiter_type, space_type, int()> b;
+        rule<outiter_type, space_type, double()> c;
 
-        start = (char_ << int_ << double_)[_1 = 'a', _2 = 10, _3 = 12.4];
-        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+        a %= char_ << eps;
+        b %= int_;
+        c %= double_;
+        start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
+        BOOST_TEST(test_delimited("a  10 12.4 ", start, vec, space));
 
-        rule<outiter_type, space_type> a, b, c;
-        a = char_[_1 = 'a'];
-        b = int_[_1 = 10];
-        c = double_[_1 = 12.4];
+        start = (a << b << c)[_1 = at_c<0>(_r0), _2 = at_c<1>(_r0), _3 = at_c<2>(_r0)];
+        BOOST_TEST(test_delimited("a  10 12.4 ", start, vec, space));
 
-        start = a << b << c;
-        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+        start %= a << b << c;
+        BOOST_TEST(test_delimited("a  10 12.4 ", start, vec, space));
     }
 
     // locals test
     {
         rule<outiter_type, locals<std::string> > start;
 
-        start = lit[_1 = "abc", _a = _1] << int_[_1 = 10] << lit[_1 = _a];
+        start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
         BOOST_TEST(test("abc10abc", start));
     }
 
-     //~ { // alias tests
-         //~ typedef variant<char, int, double> var_type;
-         //~ fusion::vector<unused_type, var_type> v (unused, 'a');
+    {
+        rule<outiter_type, space_type, locals<std::string> > start;
 
-         //~ rule<outiter_type, void(var_type)> d, start;
+        start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
+        BOOST_TEST(test_delimited("abc 10 abc ", start, space));
+    }
 
-         //~ d = start.alias();   // d will always track start
+    // alias tests
+    { 
+        typedef variant<char, int, double> var_type;
+
+        rule<outiter_type, var_type()> d, start;
+
+        d = start.alias();   // d will always track start
+
+        start = (char_ | int_ | double_)[_1 = _val];
+
+        var_type v ('a');
+        BOOST_TEST(test("a", d, v));
+        v = 10;
+        BOOST_TEST(test("10", d, v));
+        v = 12.4;
+        BOOST_TEST(test("12.4", d, v));
+    }
 
-         //~ start = (char_ | int_ | double_)[_1 = _r1];
-         //~ BOOST_TEST(test("a", d, v));
+    { 
+        typedef variant<char, int, double> var_type;
 
-         //~ v = fusion::vector<unused_type, var_type>(unused, 10);
-         //~ BOOST_TEST(test("10", d, v));
-         //~ v = fusion::vector<unused_type, var_type>(unused, 12.4);
-         //~ BOOST_TEST(test("12.4", d, v));
-     //~ }
+        rule<outiter_type, space_type, var_type()> d, start;
 
-     //~ { // copy tests
+        d = start.alias();   // d will always track start
 
-         //~ rule<char const*> a, b, c, start;
+        start = (char_ | int_ | double_)[_1 = _val];
 
-         //~ a = 'a';
-         //~ b = 'b';
-         //~ c = 'c';
+        var_type v ('a');
+        BOOST_TEST(test_delimited("a ", d, v, space));
+        v = 10;
+        BOOST_TEST(test_delimited("10 ", d, v, space));
+        v = 12.4;
+        BOOST_TEST(test_delimited("12.4 ", d, v, space));
+    }
 
-         //~ // The FF is the dynamic equivalent of start = *(a | b | c);
-         //~ start = a;
-         //~ start = start.copy() | b;
-         //~ start = start.copy() | c;
-         //~ start = *(start.copy());
+    {
+        typedef variant<char, int, double> var_type;
 
-         //~ BOOST_TEST(test("abcabcacb", start));
+        rule<outiter_type, var_type()> d, start;
 
-         //~ // The FF is the dynamic equivalent of start = (a | b) >> (start | b);
-         //~ start = b;
-         //~ start = a | copy(start);
-         //~ start = start.copy() >> (start | b);
+        d = start.alias();   // d will always track start
+
+        start %= char_ | int_ | double_;
+
+        var_type v ('a');
+        BOOST_TEST(test("a", d, v));
+        v = 10;
+        BOOST_TEST(test("10", d, v));
+        v = 12.4;
+        BOOST_TEST(test("12.4", d, v));
+    }
 
-         //~ BOOST_TEST(test("aaaabababaaabbb", start));
-         //~ BOOST_TEST(test("aaaabababaaabba", start, false));
-     //~ }
+    {
+        typedef variant<char, int, double> var_type;
+
+        rule<outiter_type, space_type, var_type()> d, start;
+
+        d = start.alias();   // d will always track start
+
+        start %= char_ | int_ | double_;
+
+        var_type v ('a');
+        BOOST_TEST(test_delimited("a ", d, v, space));
+        v = 10;
+        BOOST_TEST(test_delimited("10 ", d, v, space));
+        v = 12.4;
+        BOOST_TEST(test_delimited("12.4 ", d, v, space));
+    }
 
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/karma/pattern2.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/pattern2.cpp	(original)
+++ trunk/libs/spirit/test/karma/pattern2.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -6,9 +6,6 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-// include this first to make rules have placeholders (e.g. _r1)
-#include <boost/spirit/include/support_argument.hpp>
-
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_auxiliary.hpp>
@@ -30,7 +27,6 @@
 {
     using namespace boost;
     using namespace boost::spirit;
-    using namespace boost::spirit::arg_names;
     using namespace boost::spirit::karma;
     using namespace boost::spirit::ascii;
 
@@ -55,16 +51,35 @@
         BOOST_TEST(test("a1012.4", start));
     }
 
+    // basic tests with delimiter
+    {
+        rule<outiter_type, space_type> start;
+
+        start = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4];
+        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+
+        start = (char_ << int_ << double_)[_1 = 'a', _2 = 10, _3 = 12.4];
+        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+
+        rule<outiter_type, space_type> a, b, c;
+        a = char_[_1 = 'a'];
+        b = int_[_1 = 10];
+        c = double_[_1 = 12.4];
+
+        start = a << b << c;
+        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+    }
+
     // basic tests involving a direct parameter
     {
         typedef variant<char, int, double> var_type;
-        var_type v ('a');
 
         rule<outiter_type, var_type()> start;
 
         start = (char_ | int_ | double_)[_1 = _r0];
-        BOOST_TEST(test("a", start, v));
 
+        var_type v ('a');
+        BOOST_TEST(test("a", start, v));
         v = 10;
         BOOST_TEST(test("10", start, v));
         v = 12.4;
@@ -72,6 +87,21 @@
     }
 
     {
+        typedef variant<char, int, double> var_type;
+
+        rule<outiter_type, space_type, var_type()> start;
+
+        start = (char_ | int_ | double_)[_1 = _r0];
+
+        var_type v ('a');
+        BOOST_TEST(test_delimited("a ", start, v, space));
+        v = 10;
+        BOOST_TEST(test_delimited("10 ", start, v, space));
+        v = 12.4;
+        BOOST_TEST(test_delimited("12.4 ", start, v, space));
+    }
+
+    {
         rule<outiter_type, void(char, int, double)> start;
         fusion::vector<char, int, double> vec('a', 10, 12.4);
 
@@ -92,6 +122,64 @@
         BOOST_TEST(test("a1012.4", start('a', 10, 12.4)));
     }
 
+    {
+        rule<outiter_type, space_type, void(char, int, double)> start;
+        fusion::vector<char, int, double> vec('a', 10, 12.4);
+
+        start = char_[_1 = _r1] << int_[_1 = _r2] << double_[_1 = _r3];
+        BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
+
+        start = (char_ << int_ << double_)[_1 = _r1, _2 = _r2, _3 = _r3];
+        BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
+
+        rule<outiter_type, space_type, void(char)> a;
+        rule<outiter_type, space_type, void(int)> b;
+        rule<outiter_type, space_type, void(double)> c;
+
+        a = char_[_1 = _r1];
+        b = int_[_1 = _r1];
+        c = double_[_1 = _r1];
+        start = a(_r1) << b(_r2) << c(_r3);
+        BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
+    }
+
+    // copy tests
+    {
+        typedef variant<char, int, double> var_type;
+
+        rule<outiter_type> a, b, c, start;
+
+        a = 'a';
+        b = int_(10);
+        c = double_(12.4);
+
+        // The FF is the dynamic equivalent of start = a << b << c;
+        start = a;
+        start = start.copy() << b;
+        start = start.copy() << c;
+        start = start.copy();
+
+        BOOST_TEST(test("a1012.4", start));
+    }
+
+    {
+        typedef variant<char, int, double> var_type;
+
+        rule<outiter_type, space_type> a, b, c, start;
+
+        a = 'a';
+        b = int_(10);
+        c = double_(12.4);
+
+        // The FF is the dynamic equivalent of start = a << b << c;
+        start = a;
+        start = start.copy() << b;
+        start = start.copy() << c;
+        start = start.copy();
+
+        BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
+    }
+
     return boost::report_errors();
 }
 
Added: trunk/libs/spirit/test/karma/plus.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/plus.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,89 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/assign/std/vector.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+    using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
+    namespace fusion = boost::fusion;
+
+    {
+        std::string s1("aaaa");
+        BOOST_TEST(test("aaaa", +char_, s1));
+        BOOST_TEST(test_delimited("a a a a ", +char_, s1, ' '));
+
+        std::string s2("a");
+        BOOST_TEST(test("a", +char_, s2));
+        BOOST_TEST(test_delimited("a ", +char_, s2, ' '));
+
+        std::string s3("");
+        BOOST_TEST(!test("", +char_, s2));
+        BOOST_TEST(!test_delimited("", +char_, s3, ' '));
+    }
+
+    {
+        using namespace boost::assign;
+
+        std::vector<char> v;
+        v += 'a', 'b', 'c';
+
+        BOOST_TEST(test("abc", +char_, v));
+        BOOST_TEST(test_delimited("a b c ", +char_, v, ' '));
+    }
+
+    {
+        using namespace boost::assign;
+
+        std::vector<int> v;
+        v += 10, 20, 30;
+
+        BOOST_TEST(test("102030", +int_, v));
+        BOOST_TEST(test_delimited("10, 20, 30, ", +int_, v, lit(", ")));
+
+        BOOST_TEST(test("10,20,30,", +(int_ << ','), v));
+        BOOST_TEST(test_delimited("10 , 20 , 30 , ", +(int_ << ','), v, lit(" ")));
+ 
+        fusion::vector<char, char> cc ('a', 'c');
+        BOOST_TEST(test("ac", char_ << !+(char_(' ') << ',') << char_, cc));
+        BOOST_TEST(test_delimited("a c ", 
+            char_ << !+(char_(' ') << ',') << char_, cc, " "));
+    }
+
+    { // actions
+        using namespace boost::assign;
+        namespace phx = boost::phoenix;
+
+        std::vector<char> v;
+        v += 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h';
+
+        BOOST_TEST(test("abcdefgh", (+char_)[_1 = phx::ref(v)]));
+        BOOST_TEST(test_delimited("a b c d e f g h ", 
+            (+char_ )[_1 = phx::ref(v)], space));
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/karma/real_numerics.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/real_numerics.cpp	(original)
+++ trunk/libs/spirit/test/karma/real_numerics.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,4 +1,4 @@
-//  Copyright (c) 2001-2008 Hartmut Kaiser
+//  Copyright (c) 2001-2009 Hartmut Kaiser
 // 
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -23,35 +23,34 @@
 ///////////////////////////////////////////////////////////////////////////////
 //  policy for real_generator, which forces the scientific notation
 template <typename T>
-struct scientific_policy : boost::spirit::karma::real_generator_policies<T>
+struct scientific_policy : boost::spirit::karma::real_policies<T>
 {
     //  we want the numbers always to be in scientific format
-    typedef boost::spirit::karma::real_generator_policies<T> base_type;
-    static int floatfield(T) { return base_type::scientific; }
+    typedef boost::spirit::karma::real_policies<T> base_type;
+    static int floatfield(T) { return base_type::fmtflags::scientific; }
 };
 
-///////////////////////////////////////////////////////////////////////////////
-//  policy for real_generator, which forces the fixed notation
+// ///////////////////////////////////////////////////////////////////////////////
+// //  policy for real_generator, which forces the fixed notation
 template <typename T>
-struct fixed_policy : boost::spirit::karma::real_generator_policies<T>
+struct fixed_policy : boost::spirit::karma::real_policies<T>
 {
-    typedef boost::spirit::karma::real_generator_policies<T> base_type;
+    typedef boost::spirit::karma::real_policies<T> base_type;
 
     //  we want the numbers always to be in scientific format
-    static int floatfield(T) { return base_type::fixed; }
+    static int floatfield(T) { return base_type::fmtflags::fixed; }
 };
 
 ///////////////////////////////////////////////////////////////////////////////
 //  policy for real_generator, which forces to output trailing zeros in the 
 //  fractional part
 template <typename T>
-struct trailing_zeros_policy 
-  : boost::spirit::karma::real_generator_policies<T>   // 4 digits
+struct trailing_zeros_policy : boost::spirit::karma::real_policies<T>   // 4 digits
 {
     //  we want the numbers always to contain trailing zeros up to 4 digits in 
     //  the fractional part
-    static bool const trailing_zeros = true;
-    
+    static bool trailing_zeros(T) { return true; }
+
     //  we want to generate up to 4 fractional digits 
     static unsigned int precision(T) { return 4; }
 };
@@ -59,33 +58,57 @@
 ///////////////////////////////////////////////////////////////////////////////
 //  policy for real_generator, which forces the sign to be generated
 template <typename T>
-struct signed_policy 
-  : boost::spirit::karma::real_generator_policies<T>
+struct signed_policy : boost::spirit::karma::real_policies<T>
 {
     // we want to always have a sign generated
     static bool const force_sign = true;
 };
 
-// support for using real_concept with a Karma generator has been implemented 
-// in Boost versions > 1.36 only
-#if BOOST_VERSION > 103600
 ///////////////////////////////////////////////////////////////////////////////
-//  We need to specialize is_real_lit_tag to allow to use a real_concept as a
-//  literal below
-namespace boost { namespace spirit 
+//  policy for real_generator, which forces to output trailing zeros in the 
+//  fractional part
+template <typename T>
+struct bordercase_policy : boost::spirit::karma::real_policies<T>
 {
-    template <typename Domain>
-    struct is_real_lit_tag<boost::math::concepts::real_concept, Domain> 
-      : boost::mpl::true_ {};
-}}
-#endif
+    //  we want to generate up to the maximum significant amount of fractional 
+    // digits 
+    static unsigned int precision(T) 
+    { 
+        return std::numeric_limits<T>::digits10 + 1; 
+    }
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-int
-main()
+//  policy for real_generator, which forces to output trailing zeros in the 
+//  fractional part
+template <typename T>
+struct statefull_policy : boost::spirit::karma::real_policies<T>
+{
+    statefull_policy(int precision = 4, bool trailingzeros = false)
+      : precision_(precision), trailingzeros_(trailingzeros)
+    {}
+
+    //  we want to generate up to the maximum significant amount of fractional 
+    // digits 
+    unsigned int precision(T) const
+    { 
+        return precision_; 
+    }
+
+    bool trailing_zeros(T) const
+    {
+        return trailingzeros_;
+    }
+
+    int precision_;
+    bool trailingzeros_;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
 {
     using namespace boost::spirit;
-    
+
     {
         ///////////////////////////////////////////////////////////////////////
         // use the default real_policies
@@ -95,7 +118,7 @@
         BOOST_TEST(test("1.001", double_, 1.001));
         BOOST_TEST(test("1.01", double_, 1.010));
         BOOST_TEST(test("1.1", double_, 1.100));
-        
+
         BOOST_TEST(test("1.234e-04", double_, 0.00012345));
         BOOST_TEST(test("0.001", double_, 0.0012345));
         BOOST_TEST(test("0.012", double_, 0.012345));
@@ -106,18 +129,18 @@
         BOOST_TEST(test("1234.5", double_, 1234.5));
         BOOST_TEST(test("12342.0", double_, 12342.));
         BOOST_TEST(test("1.234e05", double_, 123420.));
-        
+
         BOOST_TEST(test("-1.0", double_, -1.0));
         BOOST_TEST(test("-1.234", double_, -1.2345));
         BOOST_TEST(test("-1.235", double_, -1.2346));
         BOOST_TEST(test("-1234.2", double_, -1234.2));
-        
+
         BOOST_TEST(test("1.0", double_(1.0)));
         BOOST_TEST(test("1.0", double_(1.0001)));
         BOOST_TEST(test("1.001", double_(1.001)));
         BOOST_TEST(test("1.01", double_(1.010)));
         BOOST_TEST(test("1.1", double_(1.100)));
-        
+
         BOOST_TEST(test("1.234e-04", double_(0.00012345)));
         BOOST_TEST(test("0.001", double_(0.0012345)));
         BOOST_TEST(test("0.012", double_(0.012345)));
@@ -129,7 +152,7 @@
         BOOST_TEST(test("12342.0", double_(12342.)));
         BOOST_TEST(test("1.234e05", double_(123420.)));
     }
-    
+
     {
         ///////////////////////////////////////////////////////////////////////
         // test NaN and Inf
@@ -138,7 +161,7 @@
         BOOST_TEST(test("inf", double_, std::numeric_limits<double>::infinity()));
         BOOST_TEST(test("-inf", double_, -std::numeric_limits<double>::infinity()));
 
-        typedef karma::real_spec<double, signed_policy<double> > signed_type;
+        typedef karma::real_generator<double, signed_policy<double> > signed_type;
         signed_type const signed_ = signed_type();
 
         BOOST_TEST(test("+nan", signed_, std::numeric_limits<double>::quiet_NaN()));
@@ -146,17 +169,32 @@
         BOOST_TEST(test("+inf", signed_, std::numeric_limits<double>::infinity()));
         BOOST_TEST(test("-inf", signed_, -std::numeric_limits<double>::infinity()));
         BOOST_TEST(test(" 0.0", signed_, 0.0));
-        
+
         BOOST_TEST(test("+nan", signed_(std::numeric_limits<double>::quiet_NaN())));
         BOOST_TEST(test("-nan", signed_(-std::numeric_limits<double>::quiet_NaN())));
         BOOST_TEST(test("+inf", signed_(std::numeric_limits<double>::infinity())));
         BOOST_TEST(test("-inf", signed_(-std::numeric_limits<double>::infinity())));
         BOOST_TEST(test(" 0.0", signed_(0.0)));
     }
-    
+
+    {
+        ///////////////////////////////////////////////////////////////////////
+        typedef karma::real_generator<double, statefull_policy<double> > 
+            statefull_type;
+
+        statefull_policy<double> policy(5, true);
+        statefull_type const statefull = statefull_type(policy);
+
+        BOOST_TEST(test("0.00000", statefull, 0.0));
+        BOOST_TEST(test("0.00000", statefull(0.0)));
+
+        using namespace boost::phoenix;
+        BOOST_TEST(test("0.00000", statefull(val(0.0))));
+    }
+
     {
         ///////////////////////////////////////////////////////////////////////
-        typedef karma::real_spec<double, trailing_zeros_policy<double> > 
+        typedef karma::real_generator<double, trailing_zeros_policy<double> > 
             trailing_zeros_type;
         trailing_zeros_type const trail_zeros = trailing_zeros_type();
 
@@ -166,7 +204,7 @@
         BOOST_TEST(test("1.0010", trail_zeros, 1.001));
         BOOST_TEST(test("1.0100", trail_zeros, 1.010));
         BOOST_TEST(test("1.1000", trail_zeros, 1.100));
-        
+
         BOOST_TEST(test("1.2345e-04", trail_zeros, 0.00012345));
         BOOST_TEST(test("0.0012", trail_zeros, 0.0012345));
         BOOST_TEST(test("0.0123", trail_zeros, 0.012345));
@@ -177,18 +215,18 @@
         BOOST_TEST(test("1234.5000", trail_zeros, 1234.5));
         BOOST_TEST(test("12342.0000", trail_zeros, 12342.));
         BOOST_TEST(test("1.2342e05", trail_zeros, 123420.));
-        
+
         BOOST_TEST(test("-1.0000", trail_zeros, -1.0));
         BOOST_TEST(test("-1.2345", trail_zeros, -1.2345));
         BOOST_TEST(test("-1.2346", trail_zeros, -1.2346));
         BOOST_TEST(test("-1234.2000", trail_zeros, -1234.2));
-        
+
         BOOST_TEST(test("1.0000", trail_zeros(1.0)));
         BOOST_TEST(test("1.0001", trail_zeros(1.0001)));
         BOOST_TEST(test("1.0010", trail_zeros(1.001)));
         BOOST_TEST(test("1.0100", trail_zeros(1.010)));
         BOOST_TEST(test("1.1000", trail_zeros(1.100)));
-        
+
         BOOST_TEST(test("1.2345e-04", trail_zeros(0.00012345)));
         BOOST_TEST(test("0.0012", trail_zeros(0.0012345)));
         BOOST_TEST(test("0.0123", trail_zeros(0.012345)));
@@ -200,8 +238,10 @@
         BOOST_TEST(test("12342.0000", trail_zeros(12342.)));
         BOOST_TEST(test("1.2342e05", trail_zeros(123420.)));
     }
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         ///////////////////////////////////////////////////////////////////////
         BOOST_TEST(test_delimited("0.0 ", double_, 0.0, char_(' ')));
         BOOST_TEST(test_delimited("1.0 ", double_, 1.0, char_(' ')));
@@ -209,7 +249,7 @@
         BOOST_TEST(test_delimited("1.001 ", double_, 1.001, char_(' ')));
         BOOST_TEST(test_delimited("1.01 ", double_, 1.010, char_(' ')));
         BOOST_TEST(test_delimited("1.1 ", double_, 1.100, char_(' ')));
-        
+
         BOOST_TEST(test_delimited("1.234e-04 ", double_, 0.00012345, char_(' ')));
         BOOST_TEST(test_delimited("0.001 ", double_, 0.0012345, char_(' ')));
         BOOST_TEST(test_delimited("0.012 ", double_, 0.012345, char_(' ')));
@@ -220,18 +260,18 @@
         BOOST_TEST(test_delimited("1234.5 ", double_, 1234.5, char_(' ')));
         BOOST_TEST(test_delimited("12342.0 ", double_, 12342., char_(' ')));
         BOOST_TEST(test_delimited("1.234e05 ", double_, 123420., char_(' ')));
-        
+
         BOOST_TEST(test_delimited("-1.0 ", double_, -1.0, char_(' ')));
         BOOST_TEST(test_delimited("-1.234 ", double_, -1.2345, char_(' ')));
         BOOST_TEST(test_delimited("-1.235 ", double_, -1.2346, char_(' ')));
         BOOST_TEST(test_delimited("-1234.2 ", double_, -1234.2, char_(' ')));
-        
+
         BOOST_TEST(test_delimited("1.0 ", double_(1.0), char_(' ')));
         BOOST_TEST(test_delimited("1.0 ", double_(1.0001), char_(' ')));
         BOOST_TEST(test_delimited("1.001 ", double_(1.001), char_(' ')));
         BOOST_TEST(test_delimited("1.01 ", double_(1.010), char_(' ')));
         BOOST_TEST(test_delimited("1.1 ", double_(1.100), char_(' ')));
-        
+
         BOOST_TEST(test_delimited("1.234e-04 ", double_(0.00012345), char_(' ')));
         BOOST_TEST(test_delimited("0.001 ", double_(0.0012345), char_(' ')));
         BOOST_TEST(test_delimited("0.012 ", double_(0.012345), char_(' ')));
@@ -245,6 +285,8 @@
     }
 
     {
+        using namespace boost::spirit::ascii;
+
         ///////////////////////////////////////////////////////////////////////
         // test NaN and Inf
         BOOST_TEST(test_delimited("nan ", double_, 
@@ -256,7 +298,7 @@
         BOOST_TEST(test_delimited("-inf ", double_, 
             -std::numeric_limits<double>::infinity(), char_(' ')));
 
-        typedef karma::real_spec<double, signed_policy<double> > signed_type;
+        typedef karma::real_generator<double, signed_policy<double> > signed_type;
         signed_type const signed_ = signed_type();
 
         BOOST_TEST(test_delimited("+nan ", signed_, 
@@ -272,15 +314,15 @@
 
     {
         using namespace boost::spirit::ascii;
-        
+
         ///////////////////////////////////////////////////////////////////////
-        typedef karma::real_spec<double, scientific_policy<double> > 
+        typedef karma::real_generator<double, scientific_policy<double> > 
             science_type;
         science_type const science = science_type();
-        
+
         BOOST_TEST(test("0.0e00", science, 0.0));
         BOOST_TEST(test("1.0e00", science, 1.0));
-        
+
         BOOST_TEST(test("1.234e-05", science, 0.000012345));
         BOOST_TEST(test("1.234e-04", science, 0.00012345));
         BOOST_TEST(test("1.234e-03", science, 0.0012345));
@@ -329,17 +371,17 @@
         BOOST_TEST(test("-1.234E04", upper[science], -12342.));
         BOOST_TEST(test("-1.234E05", upper[science], -123420.));
     }
-    
+
     {
         using namespace boost::spirit::ascii;
-        
+
         ///////////////////////////////////////////////////////////////////////
-        typedef karma::real_spec<double, fixed_policy<double> > fixed_type;
+        typedef karma::real_generator<double, fixed_policy<double> > fixed_type;
         fixed_type const fixed = fixed_type();
-        
+
         BOOST_TEST(test("0.0", fixed, 0.0));
         BOOST_TEST(test("1.0", fixed, 1.0));
-        
+
         BOOST_TEST(test("0.0", fixed, 0.000012345));
         BOOST_TEST(test("0.0", fixed, 0.00012345));
         BOOST_TEST(test("0.001", fixed, 0.0012345));
@@ -369,7 +411,7 @@
 
     {
         using namespace boost::spirit::ascii;
-        
+
         ///////////////////////////////////////////////////////////////////////
         // test NaN and Inf
         BOOST_TEST(test("NAN", upper[double_], 
@@ -381,7 +423,7 @@
         BOOST_TEST(test("-INF", upper[double_], 
             -std::numeric_limits<double>::infinity()));
 
-        typedef karma::real_spec<double, signed_policy<double> > signed_type;
+        typedef karma::real_generator<double, signed_policy<double> > signed_type;
         signed_type const signed_ = signed_type();
 
         BOOST_TEST(test("+NAN", upper[signed_], 
@@ -400,7 +442,7 @@
 #if BOOST_VERSION > 103600
     {
         using boost::math::concepts::real_concept;
-        typedef karma::real_spec<real_concept> custom_type;
+        typedef karma::real_generator<real_concept> custom_type;
         custom_type const custom = custom_type();
 
         BOOST_TEST(test("0.0", custom, real_concept(0.0)));
@@ -409,7 +451,7 @@
         BOOST_TEST(test("1.001", custom, real_concept(1.001)));
         BOOST_TEST(test("1.01", custom, real_concept(1.010)));
         BOOST_TEST(test("1.1", custom, real_concept(1.100)));
-        
+
         BOOST_TEST(test("1.234e-04", custom, real_concept(0.00012345)));
         BOOST_TEST(test("0.001", custom, real_concept(0.0012345)));
         BOOST_TEST(test("0.012", custom, real_concept(0.012345)));
@@ -420,18 +462,18 @@
         BOOST_TEST(test("1234.5", custom, real_concept(1234.5)));
         BOOST_TEST(test("12342.0", custom, real_concept(12342.)));
         BOOST_TEST(test("1.234e05", custom, real_concept(123420.)));
-        
+
         BOOST_TEST(test("-1.0", custom, real_concept(-1.0)));
         BOOST_TEST(test("-1.234", custom, real_concept(-1.2345)));
         BOOST_TEST(test("-1.235", custom, real_concept(-1.2346)));
         BOOST_TEST(test("-1234.2", custom, real_concept(-1234.2)));
-        
+
         BOOST_TEST(test("1.0", custom(real_concept(1.0))));
         BOOST_TEST(test("1.0", custom(real_concept(1.0001))));
         BOOST_TEST(test("1.001", custom(real_concept(1.001))));
         BOOST_TEST(test("1.01", custom(real_concept(1.010))));
         BOOST_TEST(test("1.1", custom(real_concept(1.100))));
-        
+
         BOOST_TEST(test("1.234e-04", custom(real_concept(0.00012345))));
         BOOST_TEST(test("0.001", custom(real_concept(0.0012345))));
         BOOST_TEST(test("0.012", custom(real_concept(0.012345))));
@@ -445,5 +487,23 @@
     }
 #endif
 
+    {
+        ///////////////////////////////////////////////////////////////////////
+        typedef karma::real_generator<double, bordercase_policy<double> > 
+            bordercase_type;
+        bordercase_type const bordercase = bordercase_type();
+
+//         BOOST_TEST(test("-5.7222349715140557e307", 
+//             bordercase(-5.7222349715140557e307)));
+
+        BOOST_TEST(test("1.7976931348623158e308", 
+            bordercase(1.7976931348623158e308)));       // DBL_MAX
+        BOOST_TEST(test("-1.7976931348623158e308", 
+            bordercase(-1.7976931348623158e308)));      // -DBL_MAX
+        BOOST_TEST(test("2.2250738585072014e-308", 
+            bordercase(2.2250738585072014e-308)));      // DBL_MIN
+        BOOST_TEST(test("-2.2250738585072014e-308", 
+            bordercase(-2.2250738585072014e-308)));     // -DBL_MIN
+    }
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/karma/right_alignment.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/right_alignment.cpp	(original)
+++ trunk/libs/spirit/test/karma/right_alignment.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -14,13 +14,13 @@
 
 #include "test.hpp"
 
-using namespace spirit_test;
-
 ///////////////////////////////////////////////////////////////////////////////
 int 
 main()
 {
+    using namespace spirit_test;
     using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
 
     {
         BOOST_TEST(test("         x", right_align[char_('x')]));
@@ -40,18 +40,18 @@
         BOOST_TEST(test("*********x", right_align(char_('*'))['x']));
 
         BOOST_TEST(test("       abc", right_align[lit("abc")]));
-        BOOST_TEST(test("       abc", right_align[lit], "abc"));
+        BOOST_TEST(test("       abc", right_align[string], "abc"));
         
         BOOST_TEST(test("       abc", right_align(10)[lit("abc")]));
-        BOOST_TEST(test("       abc", right_align(10)[lit], "abc"));
+        BOOST_TEST(test("       abc", right_align(10)[string], "abc"));
         BOOST_TEST(test("       abc", right_align(10)["abc"]));
 
         BOOST_TEST(test("*******abc", right_align(10, char_('*'))[lit("abc")]));
-        BOOST_TEST(test("*******abc", right_align(10, '*')[lit], "abc"));
+        BOOST_TEST(test("*******abc", right_align(10, '*')[string], "abc"));
         BOOST_TEST(test("*******abc", right_align(10, '*')["abc"]));
 
         BOOST_TEST(test("*******abc", right_align(char_('*'))[lit("abc")]));
-        BOOST_TEST(test("*******abc", right_align(char_('*'))[lit], "abc"));
+        BOOST_TEST(test("*******abc", right_align(char_('*'))[string], "abc"));
         BOOST_TEST(test("*******abc", right_align(char_('*'))["abc"]));
 
         BOOST_TEST(test("       100", right_align[int_(100)]));
Modified: trunk/libs/spirit/test/karma/rule_fail.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/rule_fail.cpp	(original)
+++ trunk/libs/spirit/test/karma/rule_fail.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -19,20 +19,19 @@
 using namespace boost::spirit::karma;
 using namespace boost::spirit::ascii;
 
-// this test must fail compiling
+// this test must fail compiling as the rule is used with an incompatible 
+// delimiter type
 int main()
 {
-    using boost::make_function_output_iterator;
-    using spirit_test::make_string_appender;
-    
+    typedef spirit_test::output_iterator<char>::type outiter_type;
+
     std::string generated;
-    
-    rule<char const*, rule<char const*> > def;
+
+    rule<outiter_type, rule<outiter_type> > def;
     def = int_(1) << ',' << int_(0);
-    
-    bool r = generate_delimited(
-                make_function_output_iterator(make_string_appender(generated)), 
-                def, char_('%') << '\n');
+
+    std::back_insert_iterator<std::string> outit(generated);
+    bool r = generate_delimited(outit, def, char_('%') << '\n');
 
     return 0;
 }
Modified: trunk/libs/spirit/test/karma/sequence.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/sequence.cpp	(original)
+++ trunk/libs/spirit/test/karma/sequence.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -8,7 +8,6 @@
 #include <boost/config/warning_disable.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/karma_char.hpp>
 #include <boost/spirit/include/karma_string.hpp>
 #include <boost/spirit/include/karma_numeric.hpp>
@@ -16,11 +15,11 @@
 #include <boost/spirit/include/karma_operator.hpp>
 #include <boost/spirit/include/karma_directive.hpp>
 #include <boost/spirit/include/karma_action.hpp>
-#include <boost/fusion/include/vector.hpp>
 #include <boost/spirit/include/support_unused.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
+#include <boost/fusion/include/vector.hpp>
 
 #include "test.hpp"
 
@@ -31,8 +30,9 @@
 main()
 {
     using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
     namespace fusion = boost::fusion;
-    
+
     {
         {
             BOOST_TEST(test("xi", char_('x') << char_('i')));
@@ -49,12 +49,12 @@
             BOOST_TEST(test_delimited("Hello , World ", 
                 lit("Hello") << ',' << "World", char(' ')));
         }
-        
+
         {
             fusion::vector<char, char, std::string> p ('a', 'b', "cdefg");
-            BOOST_TEST(test("abcdefg", char_ << char_ << lit, p));
+            BOOST_TEST(test("abcdefg", char_ << char_ << string, p));
             BOOST_TEST(test_delimited("a b cdefg ", 
-                char_ << char_ << lit, p, char(' ')));
+                char_ << char_ << string, p, char(' ')));
         }
 
         {
@@ -75,16 +75,26 @@
         }
 
         {
-            // literal generators do not need a parameter
+            // literal generators do not need an attribute
             fusion::vector<char, char> p('a', 'c');
             BOOST_TEST(test("abc", char_ << 'b' << char_, p));
             BOOST_TEST(test_delimited("a b c ", 
                 char_ << 'b' << char_, p, char(' ')));
         }
-        
+
+        {
+            std::list<int> v;
+            v.push_back(1);
+            v.push_back(2);
+            v.push_back(3);
+            BOOST_TEST(test("123", int_ << int_ << int_, v));
+            BOOST_TEST(test_delimited("1 2 3 ", int_ << int_ << int_, v, ' '));
+            BOOST_TEST(test("1,2,3", int_ << ',' << int_ << ',' << int_, v));
+            BOOST_TEST(test_delimited("1 , 2 , 3 ", 
+                int_ << ',' << int_ << ',' << int_, v, ' '));
+        }
+
         {
-            using namespace boost::spirit::ascii;
-            
             BOOST_TEST(test("aa", lower[char_('A') << 'a']));
             BOOST_TEST(test_delimited("BEGIN END ", 
                 upper[lit("begin") << "end"], char(' ')));
@@ -92,20 +102,18 @@
                 upper[lit("begin") << "nend"], char(' ')));
 
             BOOST_TEST(test("Aa        ", left_align[char_('A') << 'a']));
-            BOOST_TEST(test("    Aa    ", center[char_('A') << 'a']));
-            BOOST_TEST(test("        Aa", right_align[char_('A') << 'a']));
+//             BOOST_TEST(test("    Aa    ", center[char_('A') << 'a']));
+//             BOOST_TEST(test("        Aa", right_align[char_('A') << 'a']));
         }
 
         // action tests
         {
             using namespace boost::phoenix;
-            using namespace boost::spirit::arg_names;
-            using namespace boost::spirit::ascii;
 
             BOOST_TEST(test("abcdefg", 
-                (char_ << char_ << lit)[_1 = 'a', _2 = 'b', _3 = "cdefg"]));
+                (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"]));
             BOOST_TEST(test_delimited("a b cdefg ", 
-                (char_ << char_ << lit)[_1 = 'a', _2 = 'b', _3 = "cdefg"], 
+                (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"], 
                 char(' ')));
 
             BOOST_TEST(test_delimited("a 12 c ", 
@@ -121,11 +129,11 @@
             BOOST_TEST(test("AA", upper[char_ << 'a'][_1 = 'a']));
 
             BOOST_TEST(test("Aa        ", left_align[char_ << 'a'][_1 = 'A']));
-            BOOST_TEST(test("    Aa    ", center[char_ << 'a'][_1 = 'A']));
-            BOOST_TEST(test("        Aa", right_align[char_ << 'a'][_1 = 'A']));
+//             BOOST_TEST(test("    Aa    ", center[char_ << 'a'][_1 = 'A']));
+//             BOOST_TEST(test("        Aa", right_align[char_ << 'a'][_1 = 'A']));
         }
     }
-    
+
     return boost::report_errors();
 }
 
Added: trunk/libs/spirit/test/karma/stream.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/stream.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,144 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <iostream>
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_stream.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+// a simple complex number representation z = a + bi
+struct complex
+{
+    complex (double a, double b)
+      : a(a), b(b)
+    {}
+
+    double a;
+    double b;
+
+    template <typename Char>
+    friend std::basic_ostream<Char>& 
+    operator<< (std::basic_ostream<Char>& os, complex z)
+    {
+        os << "{" << z.a << "," << z.b << "}";
+        return os;
+    }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+    using namespace boost::spirit;
+
+    {
+        BOOST_TEST(test("x", stream, 'x'));
+        BOOST_TEST(test("xyz", stream, "xyz"));
+        BOOST_TEST(test("xyz", stream, std::string("xyz")));
+        BOOST_TEST(test("1", stream, 1));
+        BOOST_TEST(test("1.1", stream, 1.1));
+        BOOST_TEST(test("{1.2,2.4}", stream, complex(1.2, 2.4)));
+
+        BOOST_TEST(test(L"x", wstream, L'x'));
+        BOOST_TEST(test(L"xyz", wstream, L"xyz"));
+        BOOST_TEST(test(L"xyz", wstream, std::basic_string<wchar_t>(L"xyz")));
+        BOOST_TEST(test(L"1", wstream, 1));
+        BOOST_TEST(test(L"1.1", wstream, 1.1));
+        BOOST_TEST(test(L"{1.2,2.4}", wstream, complex(1.2, 2.4)));
+    }
+
+    {
+        BOOST_TEST(test("x", stream('x')));
+        BOOST_TEST(test("xyz", stream("xyz")));
+        BOOST_TEST(test("xyz", stream(std::string("xyz"))));
+        BOOST_TEST(test("1", stream(1)));
+        BOOST_TEST(test("1.1", stream(1.1)));
+        BOOST_TEST(test("{1.2,2.4}", stream(complex(1.2, 2.4))));
+
+        BOOST_TEST(test(L"x", wstream(L'x')));
+        BOOST_TEST(test(L"xyz", wstream(L"xyz")));
+        BOOST_TEST(test(L"xyz", wstream(std::basic_string<wchar_t>(L"xyz"))));
+        BOOST_TEST(test(L"1", wstream(1)));
+        BOOST_TEST(test(L"1.1", wstream(1.1)));
+        BOOST_TEST(test(L"{1.2,2.4}", wstream(complex(1.2, 2.4))));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test("x", lower[stream], 'X'));
+        BOOST_TEST(test("xyz", lower[stream], "XYZ"));
+        BOOST_TEST(test("xyz", lower[stream], std::string("XYZ")));
+        BOOST_TEST(test("X", upper[stream], 'x'));
+        BOOST_TEST(test("XYZ", upper[stream], "xyz"));
+        BOOST_TEST(test("XYZ", upper[stream], std::string("xyz")));
+
+        BOOST_TEST(test(L"x", lower[wstream], L'X'));
+        BOOST_TEST(test(L"xyz", lower[wstream], L"XYZ"));
+        BOOST_TEST(test(L"xyz", lower[wstream], std::basic_string<wchar_t>(L"XYZ")));
+        BOOST_TEST(test(L"X", upper[wstream], L'x'));
+        BOOST_TEST(test(L"XYZ", upper[wstream], L"xyz"));
+        BOOST_TEST(test(L"XYZ", upper[wstream], std::basic_string<wchar_t>(L"xyz")));
+    }
+
+    {
+        BOOST_TEST(test_delimited("x ", stream, 'x', ' '));
+        BOOST_TEST(test_delimited("xyz ", stream, "xyz", ' '));
+        BOOST_TEST(test_delimited("xyz ", stream, std::string("xyz"), ' '));
+        BOOST_TEST(test_delimited("1 ", stream, 1, ' '));
+        BOOST_TEST(test_delimited("1.1 ", stream, 1.1, ' '));
+        BOOST_TEST(test_delimited("{1.2,2.4} ", stream, complex(1.2, 2.4), ' '));
+
+        BOOST_TEST(test_delimited(L"x ", wstream, L'x', L' '));
+        BOOST_TEST(test_delimited(L"xyz ", wstream, L"xyz", L' '));
+        BOOST_TEST(test_delimited(L"xyz ", wstream, std::basic_string<wchar_t>(L"xyz"), L' '));
+        BOOST_TEST(test_delimited(L"1 ", wstream, 1, ' '));
+        BOOST_TEST(test_delimited(L"1.1 ", wstream, 1.1, ' '));
+        BOOST_TEST(test_delimited(L"{1.2,2.4} ", wstream, complex(1.2, 2.4), ' '));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test_delimited("x ", lower[stream], 'X', ' '));
+        BOOST_TEST(test_delimited("xyz ", lower[stream], "XYZ", ' '));
+        BOOST_TEST(test_delimited("xyz ", lower[stream], std::string("XYZ"), ' '));
+        BOOST_TEST(test_delimited("X ", upper[stream], 'x', ' '));
+        BOOST_TEST(test_delimited("XYZ ", upper[stream], "xyz", ' '));
+        BOOST_TEST(test_delimited("XYZ ", upper[stream], std::string("xyz"), ' '));
+
+        BOOST_TEST(test_delimited(L"x ", lower[wstream], L'X', L' '));
+        BOOST_TEST(test_delimited(L"xyz ", lower[wstream], L"XYZ", L' '));
+        BOOST_TEST(test_delimited(L"xyz ", lower[wstream], std::basic_string<wchar_t>(L"XYZ"), L' '));
+        BOOST_TEST(test_delimited(L"X ", upper[wstream], L'x', L' '));
+        BOOST_TEST(test_delimited(L"XYZ ", upper[wstream], L"xyz", ' '));
+        BOOST_TEST(test_delimited(L"XYZ ", upper[wstream], std::basic_string<wchar_t>(L"xyz"), L' '));
+    }
+
+    {   // lazy streams
+        using namespace boost::phoenix;
+
+        std::basic_string<char> s("abc");
+        BOOST_TEST((test("abc", stream(val(s)))));
+        BOOST_TEST((test("abc", stream(ref(s)))));
+
+        std::basic_string<wchar_t> ws(L"abc");
+        BOOST_TEST((test(L"abc", wstream(val(ws)))));
+        BOOST_TEST((test(L"abc", wstream(ref(ws)))));
+    }
+
+    return boost::report_errors();
+}
Modified: trunk/libs/spirit/test/karma/test.hpp
==============================================================================
--- trunk/libs/spirit/test/karma/test.hpp	(original)
+++ trunk/libs/spirit/test/karma/test.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -55,7 +55,8 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate(std::back_inserter(generated), g);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g);
 
         return result && generated == expected;
     }
@@ -71,15 +72,16 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate(std::back_inserter(generated), g);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g);
 
         return result && generated == expected;
     }
 
     ///////////////////////////////////////////////////////////////////////////
-    template <typename Char, typename Generator, typename Parameter>
+    template <typename Char, typename Generator, typename Attribute>
     inline bool test(Char const *expected, Generator const& g, 
-        Parameter const ¶meter)
+        Attribute const &attr)
     {
         namespace karma = boost::spirit::karma;
         typedef std::basic_string<Char> string_type;
@@ -89,14 +91,15 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate(std::back_inserter(generated), g, parameter);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g, attr);
 
         return result && generated == expected;
     }
 
-    template <typename Char, typename Generator, typename Parameter>
+    template <typename Char, typename Generator, typename Attribute>
     inline bool test(std::basic_string<Char> const& expected, Generator const& g, 
-        Parameter const ¶meter)
+        Attribute const &attr)
     {
         namespace karma = boost::spirit::karma;
         typedef std::basic_string<Char> string_type;
@@ -106,7 +109,8 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate(std::back_inserter(generated), g, parameter);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g, attr);
 
         return result && generated == expected;
     }
@@ -124,7 +128,8 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate_delimited(std::back_inserter(generated), g, d);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d);
 
         return result && generated == expected;
     }
@@ -141,16 +146,17 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate_delimited(std::back_inserter(generated), g, d);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d);
 
         return result && generated == expected;
     }
 
     ///////////////////////////////////////////////////////////////////////////
-    template <typename Char, typename Generator, typename Parameter,
+    template <typename Char, typename Generator, typename Attribute,
         typename Delimiter>
     inline bool test_delimited(Char const *expected, Generator const& g, 
-        Parameter const ¶meter, Delimiter const& d)
+        Attribute const &attr, Delimiter const& d)
     {
         namespace karma = boost::spirit::karma;
         typedef std::basic_string<Char> string_type;
@@ -160,16 +166,16 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate_delimited(std::back_inserter(generated), 
-            g, parameter, d);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d, attr);
 
         return result && generated == expected;
     }
 
-    template <typename Char, typename Generator, typename Parameter,
+    template <typename Char, typename Generator, typename Attribute,
         typename Delimiter>
     inline bool test_delimited(std::basic_string<Char> const& expected, 
-        Generator const& g, Parameter const ¶meter, Delimiter const& d)
+        Generator const& g, Attribute const &attr, Delimiter const& d)
     {
         namespace karma = boost::spirit::karma;
         typedef std::basic_string<Char> string_type;
@@ -179,8 +185,8 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate_delimited(std::back_inserter(generated), 
-            g, parameter, d);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d, attr);
 
         return result && generated == expected;
     }
@@ -199,16 +205,17 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate(std::back_inserter(generated), g);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g);
 
         return result && !std::memcmp(generated.c_str(), expected, size);
     }
 
     ///////////////////////////////////////////////////////////////////////////
-    template <typename Generator, typename Parameter>
+    template <typename Generator, typename Attribute>
     inline bool 
     binary_test(char const *expected, std::size_t size, 
-        Generator const& g, Parameter const ¶meter)
+        Generator const& g, Attribute const &attr)
     {
         namespace karma = boost::spirit::karma;
         typedef std::basic_string<char> string_type;
@@ -218,7 +225,8 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate(std::back_inserter(generated), g, parameter);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g, attr);
 
         return result && !std::memcmp(generated.c_str(), expected, size);
     }
@@ -237,17 +245,17 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate_delimited(std::back_inserter(generated), 
-            g, d);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d);
 
         return result && !std::memcmp(generated.c_str(), expected, size);
     }
 
     ///////////////////////////////////////////////////////////////////////////
-    template <typename Generator, typename Parameter, typename Delimiter>
+    template <typename Generator, typename Attribute, typename Delimiter>
     inline bool 
     binary_test_delimited(char const *expected, std::size_t size, 
-        Generator const& g, Parameter const ¶meter, Delimiter const& d)
+        Generator const& g, Attribute const &attr, Delimiter const& d)
     {
         namespace karma = boost::spirit::karma;
         typedef std::basic_string<char> string_type;
@@ -257,8 +265,8 @@
         karma::what(g);
 
         string_type generated;
-        bool result = karma::generate_delimited(std::back_inserter(generated), 
-            g, parameter, d);
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d, attr);
 
         return result && !std::memcmp(generated.c_str(), expected, size);
     }
Added: trunk/libs/spirit/test/karma/test_attr.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/test_attr.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,121 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_KARMA_TEST_ATTR_APR_23_2009_0605PM)
+#define BOOST_SPIRIT_KARMA_TEST_ATTR_APR_23_2009_0605PM
+
+#include <cstring>
+#include <string>
+#include <iterator>
+#include <iostream>
+#include <typeinfo>
+
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_what.hpp>
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+namespace spirit_test
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char>
+    struct output_iterator
+    {
+        typedef std::basic_string<Char> string_type;
+        typedef std::back_insert_iterator<string_type> type;
+    };
+}
+
+#define BOOST_PP_FILENAME_1 "karma/test_attr.hpp"
+#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+namespace spirit_test
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Generator
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test(Char const *expected, Generator const& g
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+    {
+        namespace karma = boost::spirit::karma;
+        typedef std::basic_string<Char> string_type;
+
+        // we don't care about the result of the "what" function.
+        // we only care that all generators have it:
+        karma::what(g);
+
+        string_type generated;
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate(outit, g, BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return result && generated == expected;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Generator, typename Delimiter
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_delimited(Char const *expected, Generator const& g
+      , Delimiter const& d, BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+    {
+        namespace karma = boost::spirit::karma;
+        typedef std::basic_string<Char> string_type;
+
+        // we don't care about the result of the "what" function.
+        // we only care that all generators have it:
+        karma::what(g);
+
+        string_type generated;
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d
+          , BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return result && generated == expected;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Generator, typename Delimiter
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_predelimited(Char const *expected, Generator const& g
+      , Delimiter const& d
+      , BOOST_SCOPED_ENUM(boost::spirit::karma::delimit_flag) pre_delimit
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+    {
+        namespace karma = boost::spirit::karma;
+        typedef std::basic_string<Char> string_type;
+
+        // we don't care about the result of the "what" function.
+        // we only care that all generators have it:
+        karma::what(g);
+
+        string_type generated;
+        std::back_insert_iterator<string_type> outit(generated);
+        bool result = karma::generate_delimited(outit, g, d
+          , pre_delimit, BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return result && generated == expected;
+    }
+
+}   // namespace spirit_test
+
+#undef N
+
+#endif 
Added: trunk/libs/spirit/test/karma/test_manip_attr.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/test_manip_attr.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,87 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_KARMA_TEST_MANIP_ATTR_APR_24_2009_0834AM)
+#define BOOST_SPIRIT_KARMA_TEST_MANIP_ATTR_APR_24_2009_0834AM
+
+#include <cstring>
+#include <string>
+#include <iterator>
+#include <iostream>
+#include <typeinfo>
+
+#include <boost/spirit/include/karma_stream.hpp>
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 "karma/test_manip_attr.hpp"
+#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+namespace spirit_test
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Generator
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test(Char const *expected, Generator const& g
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+    {
+        namespace karma = boost::spirit::karma;
+
+        std::ostringstream ostrm;
+        ostrm << karma::format(g, BOOST_PP_ENUM_PARAMS(N, attr));
+        return ostrm.good() && ostrm.str() == expected;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Generator, typename Delimiter
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_delimited(Char const *expected, Generator const& g
+      , Delimiter const& d, BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+    {
+        namespace karma = boost::spirit::karma;
+
+        std::ostringstream ostrm;
+        ostrm << karma::format_delimited(g, d, BOOST_PP_ENUM_PARAMS(N, attr));
+        return ostrm.good() && ostrm.str() == expected;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Generator, typename Delimiter
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_predelimited(Char const *expected, Generator const& g
+      , Delimiter const& d
+      , BOOST_SCOPED_ENUM(boost::spirit::karma::delimit_flag) pre_delimit
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
+    {
+        namespace karma = boost::spirit::karma;
+
+        std::ostringstream ostrm;
+        ostrm << karma::format_delimited(g, d, pre_delimit
+          , BOOST_PP_ENUM_PARAMS(N, attr));
+        return ostrm.good() && ostrm.str() == expected;
+    }
+
+}   // namespace spirit_test
+
+#undef N
+
+#endif 
Added: trunk/libs/spirit/test/karma/tricky_alignment.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/tricky_alignment.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,130 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+
+#include "test.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+int 
+main()
+{
+    using namespace spirit_test;
+    using namespace boost::spirit;
+    using namespace boost::spirit::ascii;
+
+    {
+        BOOST_TEST(test("x         *****", left_align(15, '*')[left_align[char_('x')]]));
+        BOOST_TEST(test("     x    *****", left_align(15, '*')[center[char_('x')]]));
+        BOOST_TEST(test("         x*****", left_align(15, '*')[right_align[char_('x')]]));
+
+        BOOST_TEST(test("*****x         ", right_align(15, '*')[left_align[char_('x')]]));
+        BOOST_TEST(test("*****     x    ", right_align(15, '*')[center[char_('x')]]));
+        BOOST_TEST(test("*****         x", right_align(15, '*')[right_align[char_('x')]]));
+
+        BOOST_TEST(test("***x         **", center(15, '*')[left_align[char_('x')]]));
+        BOOST_TEST(test("***     x    **", center(15, '*')[center[char_('x')]]));
+        BOOST_TEST(test("***         x**", center(15, '*')[right_align[char_('x')]]));
+
+        BOOST_TEST(test("ab        *****", left_align(15, '*')[left_align[lit("ab")]]));
+        BOOST_TEST(test("    ab    *****", left_align(15, '*')[center[lit("ab")]]));
+        BOOST_TEST(test("        ab*****", left_align(15, '*')[right_align[lit("ab")]]));
+
+        BOOST_TEST(test("*****ab        ", right_align(15, '*')[left_align[lit("ab")]]));
+        BOOST_TEST(test("*****    ab    ", right_align(15, '*')[center[lit("ab")]]));
+        BOOST_TEST(test("*****        ab", right_align(15, '*')[right_align[lit("ab")]]));
+
+        BOOST_TEST(test("***ab        **", center(15, '*')[left_align[lit("ab")]]));
+        BOOST_TEST(test("***    ab    **", center(15, '*')[center[lit("ab")]]));
+        BOOST_TEST(test("***        ab**", center(15, '*')[right_align[lit("ab")]]));
+    }
+
+    {
+        BOOST_TEST(test("x         ******", left_align(16, '*')[left_align[char_('x')]]));
+        BOOST_TEST(test("     x    ******", left_align(16, '*')[center[char_('x')]]));
+        BOOST_TEST(test("         x******", left_align(16, '*')[right_align[char_('x')]]));
+
+        BOOST_TEST(test("******x         ", right_align(16, '*')[left_align[char_('x')]]));
+        BOOST_TEST(test("******     x    ", right_align(16, '*')[center[char_('x')]]));
+        BOOST_TEST(test("******         x", right_align(16, '*')[right_align[char_('x')]]));
+
+        BOOST_TEST(test("***x         ***", center(16, '*')[left_align[char_('x')]]));
+        BOOST_TEST(test("***     x    ***", center(16, '*')[center[char_('x')]]));
+        BOOST_TEST(test("***         x***", center(16, '*')[right_align[char_('x')]]));
+
+        BOOST_TEST(test("ab        ******", left_align(16, '*')[left_align[lit("ab")]]));
+        BOOST_TEST(test("    ab    ******", left_align(16, '*')[center[lit("ab")]]));
+        BOOST_TEST(test("        ab******", left_align(16, '*')[right_align[lit("ab")]]));
+
+        BOOST_TEST(test("******ab        ", right_align(16, '*')[left_align[lit("ab")]]));
+        BOOST_TEST(test("******    ab    ", right_align(16, '*')[center[lit("ab")]]));
+        BOOST_TEST(test("******        ab", right_align(16, '*')[right_align[lit("ab")]]));
+
+        BOOST_TEST(test("***ab        ***", center(16, '*')[left_align[lit("ab")]]));
+        BOOST_TEST(test("***    ab    ***", center(16, '*')[center[lit("ab")]]));
+        BOOST_TEST(test("***        ab***", center(16, '*')[right_align[lit("ab")]]));
+    }
+
+    {
+        BOOST_TEST(test("x          ****", left_align(15, '*')[left_align(11)[char_('x')]]));
+        BOOST_TEST(test("     x     ****", left_align(15, '*')[center(11)[char_('x')]]));
+        BOOST_TEST(test("          x****", left_align(15, '*')[right_align(11)[char_('x')]]));
+
+        BOOST_TEST(test("****x          ", right_align(15, '*')[left_align(11)[char_('x')]]));
+        BOOST_TEST(test("****     x     ", right_align(15, '*')[center(11)[char_('x')]]));
+        BOOST_TEST(test("****          x", right_align(15, '*')[right_align(11)[char_('x')]]));
+
+        BOOST_TEST(test("**x          **", center(15, '*')[left_align(11)[char_('x')]]));
+        BOOST_TEST(test("**     x     **", center(15, '*')[center(11)[char_('x')]]));
+        BOOST_TEST(test("**          x**", center(15, '*')[right_align(11)[char_('x')]]));
+
+        BOOST_TEST(test("ab         ****", left_align(15, '*')[left_align(11)[lit("ab")]]));
+        BOOST_TEST(test("     ab    ****", left_align(15, '*')[center(11)[lit("ab")]]));
+        BOOST_TEST(test("         ab****", left_align(15, '*')[right_align(11)[lit("ab")]]));
+
+        BOOST_TEST(test("****ab         ", right_align(15, '*')[left_align(11)[lit("ab")]]));
+        BOOST_TEST(test("****     ab    ", right_align(15, '*')[center(11)[lit("ab")]]));
+        BOOST_TEST(test("****         ab", right_align(15, '*')[right_align(11)[lit("ab")]]));
+
+        BOOST_TEST(test("**ab         **", center(15, '*')[left_align(11)[lit("ab")]]));
+        BOOST_TEST(test("**     ab    **", center(15, '*')[center(11)[lit("ab")]]));
+        BOOST_TEST(test("**         ab**", center(15, '*')[right_align(11)[lit("ab")]]));
+    }
+
+    {
+        BOOST_TEST(test("x          *****", left_align(16, '*')[left_align(11)[char_('x')]]));
+        BOOST_TEST(test("     x     *****", left_align(16, '*')[center(11)[char_('x')]]));
+        BOOST_TEST(test("          x*****", left_align(16, '*')[right_align(11)[char_('x')]]));
+
+        BOOST_TEST(test("*****x          ", right_align(16, '*')[left_align(11)[char_('x')]]));
+        BOOST_TEST(test("*****     x     ", right_align(16, '*')[center(11)[char_('x')]]));
+        BOOST_TEST(test("*****          x", right_align(16, '*')[right_align(11)[char_('x')]]));
+
+        BOOST_TEST(test("***x          **", center(16, '*')[left_align(11)[char_('x')]]));
+        BOOST_TEST(test("***     x     **", center(16, '*')[center(11)[char_('x')]]));
+        BOOST_TEST(test("***          x**", center(16, '*')[right_align(11)[char_('x')]]));
+
+        BOOST_TEST(test("ab         *****", left_align(16, '*')[left_align(11)[lit("ab")]]));
+        BOOST_TEST(test("     ab    *****", left_align(16, '*')[center(11)[lit("ab")]]));
+        BOOST_TEST(test("         ab*****", left_align(16, '*')[right_align(11)[lit("ab")]]));
+
+        BOOST_TEST(test("*****ab         ", right_align(16, '*')[left_align(11)[lit("ab")]]));
+        BOOST_TEST(test("*****     ab    ", right_align(16, '*')[center(11)[lit("ab")]]));
+        BOOST_TEST(test("*****         ab", right_align(16, '*')[right_align(11)[lit("ab")]]));
+
+        BOOST_TEST(test("***ab         **", center(16, '*')[left_align(11)[lit("ab")]]));
+        BOOST_TEST(test("***     ab    **", center(16, '*')[center(11)[lit("ab")]]));
+        BOOST_TEST(test("***         ab**", center(16, '*')[right_align(11)[lit("ab")]]));
+    }
+
+    return boost::report_errors();
+}
Modified: trunk/libs/spirit/test/lex/lexertl1.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/lexertl1.cpp	(original)
+++ trunk/libs/spirit/test/lex/lexertl1.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -4,12 +4,11 @@
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include "test.hpp"
 
 ///////////////////////////////////////////////////////////////////////////////
-int 
-main()
+int main()
 {
     using namespace boost::spirit;
     using namespace spirit_test;
@@ -19,53 +18,53 @@
 
     // initialize tokens
     typedef lex::token_def<std::string> token_def;
-    
+
     std::size_t const CCOMMENT = 1;
     std::size_t const CPPCOMMENT = 2;
     token_def c_comment ("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT);
     token_def cpp_comment ("\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT);
-        
+
     typedef std::string::iterator base_iterator_type;
-    typedef lex::lexertl_token<base_iterator_type> token_type;
-    typedef lex::lexertl_lexer<token_type> lexer_type;
-    typedef lex::lexer_def<lexer_type> lexer_def;
+    typedef lex::lexertl::token<base_iterator_type> token_type;
+    typedef lex::lexertl::lexer<token_type> lexer_type;
+    typedef lex::lexer<lexer_type> lexer_def;
 
     {
         // initialize lexer
-        lexer_def def;
-        def.self = c_comment;
-        def.self += cpp_comment;
-        
+        lexer_def lex;
+        lex.self = c_comment;
+        lex.self += cpp_comment;
+
         // test lexer for two different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
     }
-    
+
     {
         // initialize lexer
-        lexer_def def;
-        def.self = c_comment | cpp_comment;
-        
+        lexer_def lex;
+        lex.self = c_comment | cpp_comment;
+
         // test lexer for two different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
     }
-    
+
     {
+        using namespace boost::spirit::ascii;
+
         // initialize lexer
-        lexer_def def;
-        def.self = token_def('+') | '-' | c_comment;
-        def.self += '*' | cpp_comment;
-        
+        lexer_def lex;
+        lex.self = token_def('+') | '-' | c_comment;
+        lex.self += char_('*') | '/' | cpp_comment;
+
         // test lexer for two different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "+", '+'));
         BOOST_TEST(test (lex, "-", '-'));
         BOOST_TEST(test (lex, "*", '*'));
+        BOOST_TEST(test (lex, "/", '/'));
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/lex/lexertl2.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/lexertl2.cpp	(original)
+++ trunk/libs/spirit/test/lex/lexertl2.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -4,7 +4,7 @@
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include <string>
 
 #include "test.hpp"
@@ -12,52 +12,48 @@
 ///////////////////////////////////////////////////////////////////////////////
 // a simple lexer class
 template <typename Lexer>
-struct lexertl_test : boost::spirit::lex::lexer_def<Lexer>
+struct lexertl_test 
+  : boost::spirit::lex::lexer<Lexer>
 {
     typedef boost::spirit::lex::token_def<std::string> token_def;
 
     static std::size_t const CCOMMENT = 1;
     static std::size_t const CPPCOMMENT = 2;
-    
-    template <typename Self>
-    void def(Self& self)
+
+    lexertl_test()
+      : c_comment("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT)
+      , cpp_comment("\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT)
     {
-        c_comment = token_def("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT);
-        cpp_comment = token_def("\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT);
-        
-        self = c_comment;
-        self += cpp_comment;
+        this->self = c_comment;
+        this->self += cpp_comment;
     }
 
     token_def c_comment, cpp_comment;
 };
 
 template <typename Lexer>
-struct wlexertl_test : boost::spirit::lex::lexer_def<Lexer>
+struct wlexertl_test 
+  : boost::spirit::lex::lexer<Lexer>
 {
-    typedef 
-        boost::spirit::lex::token_def<std::basic_string<wchar_t>, wchar_t> 
-    token_def;
+    typedef boost::spirit::lex::token_def<std::basic_string<wchar_t>, wchar_t> 
+        token_def;
 
     static std::size_t const CCOMMENT = 1;
     static std::size_t const CPPCOMMENT = 2;
-    
-    template <typename Self>
-    void def(Self& self)
+
+    wlexertl_test()
+      : c_comment(L"\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT)
+      , cpp_comment(L"\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT)
     {
-        c_comment = token_def(L"\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT);
-        cpp_comment = token_def(L"\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT);
-        
-        self = c_comment;
-        self += cpp_comment;
+        this->self = c_comment;
+        this->self += cpp_comment;
     }
 
     token_def c_comment, cpp_comment;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
-int 
-main()
+int main()
 {
     using namespace boost::spirit;
     using namespace spirit_test;
@@ -67,30 +63,29 @@
     {
         // initialize lexer
         typedef std::string::iterator base_iterator_type;
-        typedef lex::lexertl_token<base_iterator_type> token_type;
-        typedef lex::lexertl_lexer<token_type> lexer_type;
+        typedef lex::lexertl::token<base_iterator_type> token_type;
+        typedef lex::lexertl::lexer<token_type> lexer_type;
         typedef lexertl_test<lexer_type> lexer_def;
-        
+
         // test lexer for two different input strings
-        lexer_def def;
-        lex::lexer<lexer_def> lex(def);
+        lexer_def lex;
         BOOST_TEST(test (lex, "/* this is a comment */", lexer_def::CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", lexer_def::CPPCOMMENT));
     }
-    
+
     {
         // initialize lexer
         typedef std::basic_string<wchar_t>::iterator base_iterator_type;
-        typedef lex::lexertl_token<base_iterator_type> token_type;
-        typedef lex::lexertl_lexer<token_type> lexer_type;
+        typedef lex::lexertl::token<base_iterator_type> token_type;
+        typedef lex::lexertl::lexer<token_type> lexer_type;
         typedef wlexertl_test<lexer_type> lexer_def;
-        
+
         // test lexer for two different input strings
-        lexer_def def;
-        lex::lexer<lexer_def> lex(def);
+        lexer_def lex;
         BOOST_TEST(test (lex, L"/* this is a comment */", lexer_def::CCOMMENT));
         BOOST_TEST(test (lex, L"// this is a comment as well\n", lexer_def::CPPCOMMENT));
     }
-    
+
     return boost::report_errors();
 }
+
Modified: trunk/libs/spirit/test/lex/lexertl3.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/lexertl3.cpp	(original)
+++ trunk/libs/spirit/test/lex/lexertl3.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -4,12 +4,11 @@
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include "test.hpp"
 
 ///////////////////////////////////////////////////////////////////////////////
-int 
-main()
+int main()
 {
     using namespace boost::spirit;
     using namespace boost::spirit::lex;
@@ -17,32 +16,29 @@
 
     // initialize tokens
     typedef lex::token_def<std::string> token_def;
-    
+
     std::size_t const CCOMMENT = 1;
     std::size_t const CPPCOMMENT = 2;
     token_def c_comment ("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT);
     token_def cpp_comment ("\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT);
     token_def ws_tok ("[\\v\\f\\n\\r]*");
-    
+
     typedef std::string::iterator base_iterator_type;    
-    typedef lex::lexertl_token<base_iterator_type> token_type;
-    typedef lex::lexertl_lexer<token_type> lexer_type;
-    
-    typedef lexer_type::token_set token_set;
-    typedef lex::lexer_def<lexer_type> lexer_def;
+    typedef lex::lexertl::token<base_iterator_type> token_type;
+    typedef lex::lexertl::lexer<token_type> lexer_type;
+
+    typedef lex::lexer<lexer_type> lexer_def;
+    typedef lexer_def::token_set token_set;
 
-    lexer_def def;
-    
     {
         // initialize lexer
         std::string str("def");
-        lexer_def def;
-        def.self = c_comment;
-        def.self += cpp_comment | '1' | '2' | '3' | "abc" | str;
-        def.self += token_def(' ') | '\t' | ws_tok;
+        lexer_def lex;
+        lex.self = c_comment;
+        lex.self += cpp_comment | '1' | '2' | '3' | "abc" | str;
+        lex.self += token_def(' ') | '\t' | ws_tok;
 
         // test lexer for two different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "\n\n\v\f\r", ws_tok.id()));
@@ -51,20 +47,19 @@
         BOOST_TEST(test (lex, "abc"));
         BOOST_TEST(test (lex, "def"));
     }
-    
+
     {
         // init a token set
         token_set ws;
         ws = token_def(' ') | '\t' | ws_tok;
 
         // initialize lexer
-        lexer_def def;
-        def.self = c_comment;
-        def.self += cpp_comment | '1' | '2' | '3';
-        def.self("WHITESPACE") = ws;
+        lexer_def lex;
+        lex.self = c_comment;
+        lex.self += cpp_comment | '1' | '2' | '3';
+        lex.self("WHITESPACE") = ws;
 
         // test lexer for two different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "2", '2'));
Modified: trunk/libs/spirit/test/lex/lexertl4.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/lexertl4.cpp	(original)
+++ trunk/libs/spirit/test/lex/lexertl4.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -4,12 +4,11 @@
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include "test.hpp"
 
 ///////////////////////////////////////////////////////////////////////////////
-int 
-main()
+int main()
 {
     using namespace boost::spirit;
     using namespace boost::spirit::lex;
@@ -17,39 +16,38 @@
 
     // initialize tokens
     typedef lex::token_def<std::string> token_def;
-    
+
     std::size_t const CCOMMENT = 1;
     std::size_t const CPPCOMMENT = 2;
     std::size_t const TOKEN_ID_ABC = 1000;
     std::size_t const TOKEN_ID_STR = 1001;
     std::size_t const TOKEN_ID_WS = 1002;
-    
+
     token_def c_comment ("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT);
     token_def cpp_comment ("\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT);
     token_def ws_tok ("[\\v\\f\\n\\r]*", TOKEN_ID_WS);
-    
+
     typedef std::string::iterator base_iterator_type;    
-    typedef lex::lexertl_token<base_iterator_type> token_type;
-    typedef lex::lexertl_lexer<token_type> lexer_type;
-    
-    typedef lexer_type::token_set token_set;
-    typedef lex::lexer_def<lexer_type> lexer_def;
+    typedef lex::lexertl::token<base_iterator_type> token_type;
+    typedef lex::lexertl::lexer<token_type> lexer_type;
+
+    typedef lex::lexer<lexer_type> lexer_def;
+    typedef lexer_def::token_set token_set;
 
     std::string str("def");
 
     {
         // initialize lexer
-        lexer_def def;
-        def.self.add
+        lexer_def lex;
+        lex.self.add
             (c_comment)(cpp_comment) 
             ('1')('2')('3')
             ("abc", TOKEN_ID_ABC)
             (str, TOKEN_ID_STR)
         ;
-        def.self += token_def(' ') | '\t' | ws_tok;
+        lex.self += token_def(' ') | '\t' | ws_tok;
 
         // test lexer for different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "\n\n\v\f\r", ws_tok.id()));
@@ -58,7 +56,7 @@
         BOOST_TEST(test (lex, "abc", TOKEN_ID_ABC));
         BOOST_TEST(test (lex, "def", TOKEN_ID_STR));
     }
-    
+
     {
         // init a token set
         token_set ws;
@@ -68,18 +66,17 @@
         ;
 
         // initialize lexer
-        lexer_def def;
-        def.self.add
+        lexer_def lex;
+        lex.self.add
             (c_comment)(cpp_comment) 
             ('1')('2')('3')
             ("abc", TOKEN_ID_ABC)
             (str, TOKEN_ID_STR)
         ;
 
-        def.self("WHITESPACE").add(ws);
+        lex.self("WHITESPACE").add(ws);
 
         // test lexer for different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "2", '2'));
Modified: trunk/libs/spirit/test/lex/lexertl5.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/lexertl5.cpp	(original)
+++ trunk/libs/spirit/test/lex/lexertl5.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -4,13 +4,12 @@
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include "test.hpp"
 
 ///////////////////////////////////////////////////////////////////////////////
 //  test pattern definition capabilities
-int 
-main()
+int main()
 {
     using namespace boost::spirit;
     using namespace boost::spirit::lex;
@@ -18,46 +17,45 @@
 
     // initialize tokens
     typedef lex::token_def<std::string> token_def;
-    
+
     std::size_t const CCOMMENT = 1;
     std::size_t const CPPCOMMENT = 2;
     std::size_t const TOKEN_ID_ABC = 1000;
     std::size_t const TOKEN_ID_STR = 1001;
     std::size_t const TOKEN_ID_WS = 1002;
-    
+
     typedef std::string::iterator base_iterator_type;    
-    typedef lex::lexertl_token<base_iterator_type> token_type;
-    typedef lex::lexertl_lexer<token_type> lexer_type;
-    
-    typedef lexer_type::token_set token_set;
-    typedef lex::lexer_def<lexer_type> lexer_def;
+    typedef lex::lexertl::token<base_iterator_type> token_type;
+    typedef lex::lexertl::lexer<token_type> lexer_type;
+
+    typedef lex::lexer<lexer_type> lexer_def;
+    typedef lexer_def::token_set token_set;
 
     std::string str("def");
 
     {
         // initialize lexer
-        lexer_def def;
-        
-        def.self.add_pattern
+        lexer_def lex;
+
+        lex.self.add_pattern
             ("CCOMMENT", "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/")
             ("CPPCOMMENT", "\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)")
             ("WS", "[\\v\\f\\n\\r]*")
         ;
-        
+
         token_def c_comment ("{CCOMMENT}", CCOMMENT);
         token_def cpp_comment ("{CPPCOMMENT}", CPPCOMMENT);
         token_def ws_tok ("{WS}");
 
-        def.self.add
+        lex.self.add
             (c_comment)(cpp_comment) 
             ('1')('2')('3')
             ("abc", TOKEN_ID_ABC)
             (str, TOKEN_ID_STR)
         ;
-        def.self += token_def(' ') | '\t' | ws_tok;
+        lex.self += token_def(' ') | '\t' | ws_tok;
 
         // test lexer for different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "\n\n\v\f\r", ws_tok.id()));
@@ -66,17 +64,17 @@
         BOOST_TEST(test (lex, "abc", TOKEN_ID_ABC));
         BOOST_TEST(test (lex, "def", TOKEN_ID_STR));
     }
-    
+
     {
         // initialize lexer
-        lexer_def def;
+        lexer_def lex;
 
-        def.self.add_pattern
+        lex.self.add_pattern
             ("CCOMMENT", "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/")
             ("CPPCOMMENT", "\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)")
             ("WS", "[\\v\\f\\n\\r]*")
         ;
-        
+
         token_def c_comment ("{CCOMMENT}", CCOMMENT);
         token_def cpp_comment ("{CPPCOMMENT}", CPPCOMMENT);
         token_def ws_tok ("{WS}");
@@ -88,17 +86,16 @@
             (ws_tok, TOKEN_ID_WS)
         ;
 
-        def.self.add
+        lex.self.add
             (c_comment)(cpp_comment) 
             ('1')('2')('3')
             ("abc", TOKEN_ID_ABC)
             (str, TOKEN_ID_STR)
         ;
 
-        def.self("WHITESPACE").add(ws);
+        lex.self("WHITESPACE").add(ws);
 
         // test lexer for different input strings
-        lex::lexer<lexer_def> lex(def);
         BOOST_TEST(test (lex, "/* this is a comment */", CCOMMENT));
         BOOST_TEST(test (lex, "// this is a comment as well\n", CPPCOMMENT));
         BOOST_TEST(test (lex, "2", '2'));
Modified: trunk/libs/spirit/test/lex/state_switcher_test.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/state_switcher_test.cpp	(original)
+++ trunk/libs/spirit/test/lex/state_switcher_test.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -4,38 +4,36 @@
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/lex_lexer_lexertl.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/lex_lexertl.hpp>
 #include "test_parser.hpp"
 
 ///////////////////////////////////////////////////////////////////////////////
 //  Token definition
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Lexer>
-struct switch_state_tokens : boost::spirit::lex::lexer_def<Lexer>
+struct switch_state_tokens : boost::spirit::lex::lexer<Lexer>
 {
-    template <typename Self>
-    void def (Self& self)
+    switch_state_tokens()
     {
         // define tokens and associate them with the lexer
         identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
-        self = identifier;
-        
+        this->self = identifier;
+
         // any token definition to be used as the skip parser during parsing 
         // has to be associated with a separate lexer state (here 'WS') 
         white_space = "[ \\t\\n]+";
-        self("WS") = white_space;
+        this->self("WS") = white_space;
 
         separators = "[,;]";
-        self("SEP") = separators;
+        this->self("SEP") = separators;
     }
-    
+
     boost::spirit::lex::token_def<> identifier, white_space, separators;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
-int 
-main()
+int main()
 {
     using namespace boost::spirit;
     using namespace boost::spirit::qi;
@@ -43,50 +41,51 @@
     using namespace spirit_test;
 
     typedef std::string::iterator base_iterator_type;
-    typedef boost::spirit::lex::lexertl_token<base_iterator_type> token_type;
-    typedef boost::spirit::lex::lexertl_lexer<token_type> lexer_type;
+    typedef boost::spirit::lex::lexertl::token<base_iterator_type> token_type;
+    typedef boost::spirit::lex::lexertl::lexer<token_type> lexer_type;
 
     {
         // the tokens class will be initialized inside the test_parser function
-        switch_state_tokens<lexer_type> tokens;
-        
-        BOOST_TEST(test_parser("ident", tokens.identifier, tokens));
-        BOOST_TEST(!test_parser("ident", set_state("WS") >> tokens.identifier, tokens));
-        BOOST_TEST(!test_parser("ident", in_state("WS")[tokens.identifier], tokens));
-
-        BOOST_TEST(test_parser("\t \n", set_state("WS") >> tokens.white_space, tokens));
-        BOOST_TEST(test_parser("\t \n", in_state("WS")[tokens.white_space], tokens));
-        BOOST_TEST(!test_parser("\t \n", tokens.white_space, tokens));
+        switch_state_tokens<lexer_type> lex;
+
+        BOOST_TEST(test_parser("ident", lex.identifier, lex));
+        BOOST_TEST(!test_parser("ident", set_state("WS") >> lex.identifier, lex));
+        BOOST_TEST(!test_parser("ident", in_state("WS")[lex.identifier], lex));
+
+        BOOST_TEST(test_parser("\t \n", set_state("WS") >> lex.white_space, lex));
+        BOOST_TEST(test_parser("\t \n", in_state("WS")[lex.white_space], lex));
+        BOOST_TEST(!test_parser("\t \n", lex.white_space, lex));
     }
-    
+
     {
         // the tokens class will be initialized inside the test_parser function
-        switch_state_tokens<lexer_type> tokens;
-        
-        BOOST_TEST(test_parser(",ident", tokens.identifier, tokens, 
-            in_state("SEP")[tokens.separators]));
-        BOOST_TEST(!test_parser(";ident", set_state("WS") >> tokens.identifier, 
-            tokens, in_state("SEP")[tokens.separators]));
-        BOOST_TEST(!test_parser(",ident", in_state("WS")[tokens.identifier], 
-            tokens, in_state("SEP")[tokens.separators]));
-
-        BOOST_TEST(test_parser(",\t \n", set_state("WS") >> tokens.white_space, 
-            tokens, in_state("SEP")[tokens.separators]));
-        BOOST_TEST(test_parser(";\t \n", in_state("WS")[tokens.white_space], 
-            tokens, in_state("SEP")[tokens.separators]));
-        BOOST_TEST(!test_parser(",\t \n", tokens.white_space, tokens, 
-            in_state("SEP")[tokens.separators]));
+        switch_state_tokens<lexer_type> lex;
+
+        BOOST_TEST(test_parser(",ident", lex.identifier, lex, 
+            in_state("SEP")[lex.separators]));
+        BOOST_TEST(!test_parser(";ident", set_state("WS") >> lex.identifier, 
+            lex, in_state("SEP")[lex.separators]));
+        BOOST_TEST(!test_parser(",ident", in_state("WS")[lex.identifier], 
+            lex, in_state("SEP")[lex.separators]));
+
+        BOOST_TEST(test_parser(",\t \n", set_state("WS") >> lex.white_space, 
+            lex, in_state("SEP")[lex.separators]));
+        BOOST_TEST(test_parser(";\t \n", in_state("WS")[lex.white_space], 
+            lex, in_state("SEP")[lex.separators]));
+        BOOST_TEST(!test_parser(",\t \n", lex.white_space, lex, 
+            in_state("SEP")[lex.separators]));
     }
-    
+
     {
         // the tokens class will be initialized inside the test_parser function
-        switch_state_tokens<lexer_type> tokens;
+        switch_state_tokens<lexer_type> lex;
         
         BOOST_TEST(test_parser("ident\t \n", 
-            tokens.identifier >> set_state("WS") >> tokens.white_space, tokens));
+            lex.identifier >> set_state("WS") >> lex.white_space, lex));
         BOOST_TEST(test_parser("\t \nident", 
-            in_state("WS")[tokens.white_space] >> tokens.identifier, tokens));
+            in_state("WS")[lex.white_space] >> lex.identifier, lex));
     }
 
     return boost::report_errors();
 }
+
Modified: trunk/libs/spirit/test/lex/test_parser.hpp
==============================================================================
--- trunk/libs/spirit/test/lex/test_parser.hpp	(original)
+++ trunk/libs/spirit/test/lex/test_parser.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -12,12 +12,10 @@
 
 namespace spirit_test
 {
-    template <typename Char, typename Parser, typename Tokens>
-    bool test_parser(Char const* in, Parser const& p, Tokens& tokens, 
+    template <typename Char, typename Parser, typename Lexer>
+    bool test_parser(Char const* in, Parser const& p, Lexer& lex, 
         bool full_match = true)
     {
-        boost::spirit::lex::lexer<Tokens> lex(tokens);
-
         // we don't care about the result of the "what" function.
         // we only care that all parsers have it:
         boost::spirit::qi::what(p);
@@ -26,23 +24,19 @@
         std::string::iterator it_in = str.begin();
         std::string::iterator end_in = str.end();
 
-        typedef typename 
-            boost::spirit::lex::lexer<Tokens>::iterator_type 
-        iterator_type;
-        
+        typedef typename Lexer::iterator_type iterator_type;
+
         iterator_type iter = lex.begin(it_in, end_in);
         iterator_type end = lex.end();
-            
+
         return boost::spirit::qi::parse(iter, end, p)
             && (!full_match || (iter == end));
     }
 
-    template <typename Char, typename Parser, typename Tokens, typename Skipper>
-    bool test_parser(Char const* in, Parser const& p, Tokens& tokens,
+    template <typename Char, typename Parser, typename Lexer, typename Skipper>
+    bool test_parser(Char const* in, Parser const& p, Lexer& lex,
           Skipper const& s, bool full_match = true)
     {
-        boost::spirit::lex::lexer<Tokens> lex(tokens);
-
         // we don't care about the result of the "what" function.
         // we only care that all parsers have it:
         boost::spirit::qi::what(p);
@@ -51,10 +45,8 @@
         std::string::iterator it_in = str.begin();
         std::string::iterator end_in = str.end();
 
-        typedef typename 
-            boost::spirit::lex::lexer<Tokens>::iterator_type 
-        iterator_type;
-        
+        typedef typename Lexer::iterator_type iterator_type;
+
         iterator_type iter = lex.begin(it_in, end_in);
         iterator_type end = lex.end();
 
Modified: trunk/libs/spirit/test/qi/actions.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/actions.cpp	(original)
+++ trunk/libs/spirit/test/qi/actions.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,17 +1,25 @@
 /*=============================================================================
-    Copyright (c) 2001-2008 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
+
+#if defined(_MSC_VER)
+# pragma warning(disable: 4180)     // qualifier applied to function type
+                                    // has no meaning; ignored
+#endif
+
 #include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_parse.hpp>
+#include <boost/spirit/include/qi_action.hpp>
 #include <boost/lambda/lambda.hpp>
 #include <boost/bind.hpp>
 #include <cstring>
 
-using namespace boost::spirit;
-
 int x = 0;
 
 void fun1(int const& i)
@@ -23,6 +31,7 @@
 {
     x += i;
 }
+using boost::spirit::unused_type;
 
 struct fun_action
 {
@@ -34,6 +43,9 @@
 
 int main()
 {
+    namespace qi = boost::spirit::qi;
+    using boost::spirit::int_;
+
     {
         char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
         qi::parse(s1, e1, '{' >> int_[&fun1] >> '}');
@@ -45,12 +57,8 @@
     }
 
     {
-        // $$$ uncomment me! $$$
-        //~ char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
-        //~ qi::parse(s1, e1, '{' >> int_[fun2] >> '}');
-
-        //~ int ii;
-        //~ boost::spirit::detail::action_dispatch(fun2, ii, ii);
+        char const *s1 = "{42}", *e1 = s1 + std::strlen(s1);
+        qi::parse(s1, e1, '{' >> int_[fun2] >> '}');
     }
 
     {
Modified: trunk/libs/spirit/test/qi/alternative.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/alternative.cpp	(original)
+++ trunk/libs/spirit/test/qi/alternative.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
     Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -10,8 +10,10 @@
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_string.hpp>
 #include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_action.hpp>
 #include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
 #include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
@@ -21,18 +23,24 @@
 #include <iostream>
 #include "test.hpp"
 
-using namespace spirit_test;
-
 int
 main()
 {
-    using namespace boost::spirit;
+    using spirit_test::test;
+    using spirit_test::test_attr;
+
+    using boost::spirit::ascii::char_;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::lit;
+    using boost::spirit::qi::unused_type;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::omit;
 
     {
         BOOST_TEST((test("a", char_ | char_)));
-        BOOST_TEST((test("x", char_('x') | char_('i'))));
-        BOOST_TEST((test("i", char_('x') | char_('i'))));
-        BOOST_TEST((!test("z", char_('x') | char_('o'))));
+        BOOST_TEST((test("x", lit('x') | lit('i'))));
+        BOOST_TEST((test("i", lit('x') | lit('i'))));
+        BOOST_TEST((!test("z", lit('x') | lit('o'))));
         BOOST_TEST((test("rock", lit("rock") | lit("roll"))));
         BOOST_TEST((test("roll", lit("rock") | lit("roll"))));
         BOOST_TEST((test("rock", lit("rock") | int_)));
@@ -46,7 +54,6 @@
         BOOST_TEST(boost::get<int>(v) == 12345);
 
         BOOST_TEST((test_attr("rock", lit("rock") | int_ | char_, v)));
-//        BOOST_TEST(boost::get<std::string>(&v) == 0);
         BOOST_TEST(boost::get<int>(&v) == 0);
         BOOST_TEST(boost::get<char>(&v) == 0);
 
@@ -55,25 +62,25 @@
     }
 
     {   // test action
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        namespace phx = boost::phoenix;
 
+        namespace phoenix = boost::phoenix;
         boost::variant<unused_type, int, char> v;
 
-        BOOST_TEST((test("12345", (lit("rock") | int_ | char_)[phx::ref(v) = _1])));
+        BOOST_TEST((test("12345", (lit("rock") | int_ | char_)[phoenix::ref(v) = _1])));
         BOOST_TEST(boost::get<int>(v) == 12345);
     }
 
     {
-        boost::variant<unused_type> v;
-        BOOST_TEST((test("rock", lit("rock") | char_('x'))));
+        unused_type x;
+        BOOST_TEST((test_attr("rock", lit("rock") | lit('x'), x)));
     }
 
     {
         // test if alternatives with all components having unused
-        // attributes return attributes them self
-        using namespace boost::fusion;
+        // attributes have an unused attribute
+
+        using boost::fusion::vector;
+        using boost::fusion::at_c;
 
         vector<char, char> v;
         BOOST_TEST((test_attr("abc",
@@ -82,6 +89,31 @@
         BOOST_TEST((at_c<1>(v) == 'c'));
     }
 
+    {
+        // Test that we can still pass a "compatible" attribute to
+        // an alternate even if its "expected" attribute is unused type.
+
+        std::string s;
+        BOOST_TEST((test_attr("...", *(char_('.') | char_(',')), s)));
+        BOOST_TEST(s == "...");
+    }
+
+    {   // make sure collapsing eps works as expected
+        // (compile check only)
+
+        using boost::spirit::qi::rule;
+        using boost::spirit::qi::_val;
+        using boost::spirit::qi::_1;
+        using boost::spirit::eps;
+        rule<const wchar_t*, wchar_t()> r1, r2, r3;
+
+        r3  = ((eps >> r1))[_val += _1];
+        r3  = ((r1 ) | r2)[_val += _1];
+
+        r3 %= ((eps >> r1) | r2);
+        r3 = ((eps >> r1) | r2)[_val += _1];
+    }
+
     return boost::report_errors();
 }
 
Modified: trunk/libs/spirit/test/qi/and_predicate.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/and_predicate.cpp	(original)
+++ trunk/libs/spirit/test/qi/and_predicate.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -16,7 +16,7 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit;
+    using boost::spirit::int_;
 
     {
         BOOST_TEST((test("1234", &int_, false)));
Modified: trunk/libs/spirit/test/qi/binary.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/binary.cpp	(original)
+++ trunk/libs/spirit/test/qi/binary.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,27 +1,34 @@
-//  Copyright (c) 2001-2009 Hartmut Kaiser
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+/*=============================================================================
+    Copyright (c) 2001-2009 Hartmut Kaiser
 
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
 #include <boost/detail/lightweight_test.hpp>
 
 #include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/qi_binary.hpp>
-#include <boost/spirit/include/qi_parse.hpp>
-
 #include <boost/cstdint.hpp>
-
 #include "test.hpp"
 
-using namespace spirit_test;
-
 ///////////////////////////////////////////////////////////////////////////////
-int
-main()
+int main()
 {
-    using namespace boost::spirit;
-    using namespace boost::phoenix;
-    using namespace boost::spirit::arg_names;
+    using spirit_test::test_attr;
+    using spirit_test::test;
+
+    using boost::spirit::qi::byte_;
+    using boost::spirit::qi::word;
+    using boost::spirit::qi::dword;
+    using boost::spirit::qi::big_word;
+    using boost::spirit::qi::big_dword;
+    using boost::spirit::qi::little_word;
+    using boost::spirit::qi::little_dword;
+#ifdef BOOST_HAS_LONG_LONG
+    using boost::spirit::qi::qword;
+    using boost::spirit::qi::big_qword;
+    using boost::spirit::qi::little_qword;
+#endif
 
     boost::uint8_t uc;
     boost::uint16_t us;
@@ -32,7 +39,7 @@
 
     {   // test native endian binaries
 #ifdef BOOST_LITTLE_ENDIAN
-        BOOST_TEST(test_attr("\x01", byte, uc) && uc == 0x01);
+        BOOST_TEST(test_attr("\x01", byte_, uc) && uc == 0x01);
         BOOST_TEST(test_attr("\x01\x02", word, us) && us == 0x0201);
         BOOST_TEST(test_attr("\x01\x02\x03\x04", dword, ui) && ui == 0x04030201);
 #ifdef BOOST_HAS_LONG_LONG
@@ -40,7 +47,7 @@
             ul == 0x0807060504030201LL);
 #endif
 #else
-        BOOST_TEST(test_attr("\x01", byte, uc) && uc == 0x01);
+        BOOST_TEST(test_attr("\x01", byte_, uc) && uc == 0x01);
         BOOST_TEST(test_attr("\x01\x02", word, us) && us ==  0x0102);
         BOOST_TEST(test_attr("\x01\x02\x03\x04", dword, ui) && ui == 0x01020304);
 #ifdef BOOST_HAS_LONG_LONG
@@ -52,7 +59,7 @@
 
     {   // test native endian binaries
 #ifdef BOOST_LITTLE_ENDIAN
-        BOOST_TEST(test("\x01", byte(0x01)));
+        BOOST_TEST(test("\x01", byte_(0x01)));
         BOOST_TEST(test("\x01\x02", word(0x0201)));
         BOOST_TEST(test("\x01\x02\x03\x04", dword(0x04030201)));
 #ifdef BOOST_HAS_LONG_LONG
@@ -60,7 +67,7 @@
             qword(0x0807060504030201LL)));
 #endif
 #else
-        BOOST_TEST(test("\x01", byte(0x01)));
+        BOOST_TEST(test("\x01", byte_(0x01)));
         BOOST_TEST(test("\x01\x02", word(0x0102)));
         BOOST_TEST(test("\x01\x02\x03\x04", dword(0x01020304)));
 #ifdef BOOST_HAS_LONG_LONG
Modified: trunk/libs/spirit/test/qi/char.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/char.cpp	(original)
+++ trunk/libs/spirit/test/qi/char.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
     Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -7,8 +7,7 @@
 =============================================================================*/
 #include <boost/detail/lightweight_test.hpp>
 #include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_string.hpp>
-#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/qi_action.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 
@@ -19,20 +18,20 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit::qi;
-    using namespace boost::spirit::ascii;
-    using boost::spirit::char_;
-    using boost::spirit::wchar;
-    
+    using spirit_test::test_attr;
+    using spirit_test::print_info;
+
     {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test("x", 'x'));
         BOOST_TEST(test(L"x", L'x'));
+        BOOST_TEST(!test("y", 'x'));
+        BOOST_TEST(!test(L"y", L'x'));
 
         BOOST_TEST(test("x", char_));
         BOOST_TEST(test("x", char_('x')));
         BOOST_TEST(!test("x", char_('y')));
-        BOOST_TEST(test(L"x", char_(L'x')));
-        BOOST_TEST(!test(L"x", char_(L'y')));
         BOOST_TEST(test("x", char_('a', 'z')));
         BOOST_TEST(!test("x", char_('0', '9')));
 
@@ -54,66 +53,119 @@
     }
 
     {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::qi::lit;
+
+        BOOST_TEST(test("x", lit('x')));
+        BOOST_TEST(!test("x", lit('y')));
+
+        BOOST_TEST(!test("x", ~lit('x')));
+        BOOST_TEST(test(" ", ~lit('x')));
+        BOOST_TEST(test("X", ~lit('x')));
+
+        BOOST_TEST(test("x", ~~lit('x')));
+        BOOST_TEST(!test(" ", ~~lit('x')));
+        BOOST_TEST(!test("X", ~~lit('x')));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
         BOOST_TEST(test("   x", 'x', space));
         BOOST_TEST(test(L"   x", L'x', space));
 
         BOOST_TEST(test("   x", char_, space));
         BOOST_TEST(test("   x", char_('x'), space));
         BOOST_TEST(!test("   x", char_('y'), space));
-        BOOST_TEST(test(L"   x", char_(L'x'), space));
-        BOOST_TEST(!test(L"   x", char_(L'y'), space));
         BOOST_TEST(test("   x", char_('a', 'z'), space));
         BOOST_TEST(!test("   x", char_('0', '9'), space));
-
     }
 
     {
-        BOOST_TEST(test(L"x", wchar));
-        BOOST_TEST(test(L"x", wchar(L'x')));
-        BOOST_TEST(!test(L"x", wchar(L'y')));
-        BOOST_TEST(test(L"x", wchar('a', 'z')));
-        BOOST_TEST(!test(L"x", wchar('0', '9')));
-
-        BOOST_TEST(!test(L"x", ~wchar));
-        BOOST_TEST(!test(L"x", ~wchar('x')));
-        BOOST_TEST(test(L" ", ~wchar('x')));
-        BOOST_TEST(test(L"X", ~wchar('x')));
-        BOOST_TEST(!test(L"x", ~wchar('b', 'y')));
-        BOOST_TEST(test(L"a", ~wchar('b', 'y')));
-        BOOST_TEST(test(L"z", ~wchar('b', 'y')));
-
-        BOOST_TEST(test(L"x", ~~wchar));
-        BOOST_TEST(test(L"x", ~~wchar('x')));
-        BOOST_TEST(!test(L" ", ~~wchar('x')));
-        BOOST_TEST(!test(L"X", ~~wchar('x')));
-        BOOST_TEST(test(L"x", ~~wchar('b', 'y')));
-        BOOST_TEST(!test(L"a", ~~wchar('b', 'y')));
-        BOOST_TEST(!test(L"z", ~~wchar('b', 'y')));
+        using namespace boost::spirit::standard_wide;
+
+        BOOST_TEST(test(L"x", char_));
+        BOOST_TEST(test(L"x", char_(L'x')));
+        BOOST_TEST(!test(L"x", char_(L'y')));
+        BOOST_TEST(test(L"x", char_(L'a', L'z')));
+        BOOST_TEST(!test(L"x", char_(L'0', L'9')));
+
+        BOOST_TEST(!test(L"x", ~char_));
+        BOOST_TEST(!test(L"x", ~char_(L'x')));
+        BOOST_TEST(test(L" ", ~char_(L'x')));
+        BOOST_TEST(test(L"X", ~char_(L'x')));
+        BOOST_TEST(!test(L"x", ~char_(L'b', L'y')));
+        BOOST_TEST(test(L"a", ~char_(L'b', L'y')));
+        BOOST_TEST(test(L"z", ~char_(L'b', L'y')));
+
+        BOOST_TEST(test(L"x", ~~char_));
+        BOOST_TEST(test(L"x", ~~char_(L'x')));
+        BOOST_TEST(!test(L" ", ~~char_(L'x')));
+        BOOST_TEST(!test(L"X", ~~char_(L'x')));
+        BOOST_TEST(test(L"x", ~~char_(L'b', L'y')));
+        BOOST_TEST(!test(L"a", ~~char_(L'b', L'y')));
+        BOOST_TEST(!test(L"z", ~~char_(L'b', L'y')));
     }
 
 
-    {   // single char strings as argument to char_
-        BOOST_TEST(test("x", char_("x"), space));
-        BOOST_TEST(test("x", wchar(L"x"), space));
+    {   // single char strings!
+        namespace ascii = boost::spirit::ascii;
+        namespace wide = boost::spirit::standard_wide;
+
+        BOOST_TEST(test("x", "x"));
+        BOOST_TEST(test(L"x", L"x"));
+        BOOST_TEST(test("x", ascii::char_("x")));
+        BOOST_TEST(test(L"x", wide::char_(L"x")));
     }
 
     {
         // chsets
-        BOOST_TEST(test("x", char_("a-z")));
-        BOOST_TEST(!test("1", char_("a-z")));
-        BOOST_TEST(test("1", char_("a-z0-9")));
-
-        BOOST_TEST(test("x", char_(L"a-z")));
-        BOOST_TEST(!test("1", char_(L"a-z")));
-        BOOST_TEST(test("1", char_(L"a-z0-9")));
+        namespace ascii = boost::spirit::ascii;
+        namespace wide = boost::spirit::standard_wide;
+
+        BOOST_TEST(test("x", ascii::char_("a-z")));
+        BOOST_TEST(!test("1", ascii::char_("a-z")));
+        BOOST_TEST(test("1", ascii::char_("a-z0-9")));
+
+        BOOST_TEST(test("x", wide::char_(L"a-z")));
+        BOOST_TEST(!test("1", wide::char_(L"a-z")));
+        BOOST_TEST(test("1", wide::char_(L"a-z0-9")));
+
+        std::string set = "a-z0-9";
+        BOOST_TEST(test("x", ascii::char_(set)));
+
+#ifdef SPIRIT_NO_COMPILE_CHECK
+        test("", ascii::char_(L"a-z0-9"));
+#endif
     }
 
     {   // lazy chars
 
-        using namespace boost::phoenix;
+        using namespace boost::spirit::ascii;
+
+        using boost::phoenix::val;
+        using boost::phoenix::ref;
+        using boost::spirit::_1;
+
         BOOST_TEST((test("x", char_(val('x')))));
         BOOST_TEST((test("h", char_(val('a'), val('n')))));
+        BOOST_TEST(test("0", char_(val("a-z0-9"))));
+
+        char ch; // make sure lazy chars have an attribute
+        BOOST_TEST(test("x", char_(val('x'))[ref(ch) = _1]));
+        BOOST_TEST(ch == 'x');
+    }
+
+    { // testing "what"
+
+        using boost::spirit::qi::what;
+        using boost::spirit::ascii::char_;
+        using boost::spirit::ascii::alpha;
+
+        print_info(what('x'));
+        print_info(what(char_('a','z')));
+        print_info(what(alpha));
     }
-    
+
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/qi/char_class.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/char_class.cpp	(original)
+++ trunk/libs/spirit/test/qi/char_class.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2001-2007 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,14 +8,13 @@
 #include <boost/detail/lightweight_test.hpp>
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/qi_domain.hpp>
-#include <boost/spirit/include/support_attribute_of.hpp>
 #include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/support_attributes.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
-
 #include <boost/type_traits/is_same.hpp>
 #include <boost/static_assert.hpp>
+
 #include <iostream>
 #include "test.hpp"
 
@@ -138,11 +137,12 @@
         using boost::spirit::traits::attribute_of;
         using boost::spirit::iso8859_1::alpha;
         using boost::spirit::iso8859_1::alpha_type;
+        using boost::spirit::result_of::compile;
 
         BOOST_STATIC_ASSERT((
             boost::is_same<
-                attribute_of<domain, alpha_type, char const*, int>::type
-              , char>::value));
+                attribute_of<compile<domain, alpha_type>::type>::type
+              , unsigned char>::value));
 
         int attr = 0;
         BOOST_TEST(test_attr("a", alpha, attr));
@@ -159,9 +159,9 @@
 
     {   // test action
 
-        using namespace boost::phoenix;
         using namespace boost::spirit::ascii;
-        using boost::spirit::arg_names::_1;
+        using boost::phoenix::ref;
+        using boost::spirit::_1;
         char ch;
 
         BOOST_TEST(test("x", alnum[ref(ch) = _1]));
Modified: trunk/libs/spirit/test/qi/difference.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/difference.cpp	(original)
+++ trunk/libs/spirit/test/qi/difference.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -19,13 +19,12 @@
 #include <iostream>
 #include "test.hpp"
 
-using namespace spirit_test;
-
 int
 main()
 {
-    using namespace boost::spirit;
     using namespace boost::spirit::ascii;
+    using boost::spirit::lit;
+    using spirit_test::test;
 
     {
         BOOST_TEST(test("b", char_ - 'a'));
@@ -47,16 +46,16 @@
     {
         // $$$ See difference.hpp why these tests are not done anymore. $$$
 
-        //~ BOOST_TEST(test("switcher", lit("switcher") - "switch"));
-        //~ BOOST_TEST(test("    switcher    ", lit("switcher") - "switch", space));
+        // BOOST_TEST(test("switcher", lit("switcher") - "switch"));
+        // BOOST_TEST(test("    switcher    ", lit("switcher") - "switch", space));
 
         BOOST_TEST(!test("switch", lit("switch") - "switch"));
     }
 
     {
-        using boost::spirit::arg_names::_1;
+        using boost::spirit::_1;
         namespace phx = boost::phoenix;
-        
+
         std::string s;
 
         BOOST_TEST(test(
@@ -67,7 +66,7 @@
         s.clear();
 
         BOOST_TEST(test(
-            "    /*abcdefghijk*/    "
+            "    /*abcdefghijk*/"
           , "/*" >> *(char_ - "*/")[phx::ref(s) += _1] >> "*/"
           , space
         ));
Modified: trunk/libs/spirit/test/qi/end.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/end.cpp	(original)
+++ trunk/libs/spirit/test/qi/end.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2001-2008 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,6 +8,7 @@
 #include <boost/detail/lightweight_test.hpp>
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
 #include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
@@ -19,60 +20,52 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit::qi;
-    using namespace boost::spirit::ascii;
-    using boost::spirit::char_;
-    using boost::spirit::wchar;
-    using boost::spirit::eol;
-    using boost::spirit::eoi;
-    
+    namespace qi = boost::spirit::qi;
+    namespace ascii = boost::spirit::ascii;
+    namespace wide = boost::spirit::standard_wide;
+
+    using qi::eol;
+    using qi::eoi;
+    using ascii::space;
+
     {   // eol
         BOOST_TEST(test("\r", eol));
         BOOST_TEST(test("\r\n", eol));
         BOOST_TEST(test("\n", eol));
         BOOST_TEST(!test("\b", eol));
 
-        BOOST_TEST(!test("\r", ~eol, false));
-        BOOST_TEST(!test("\r\n", ~eol, false));
-        BOOST_TEST(!test("\n", ~eol, false));
-        BOOST_TEST(test("\b", ~eol, false));
-
-        BOOST_TEST(test("\r", ~~eol));
-        BOOST_TEST(test("\r\n", ~~eol));
-        BOOST_TEST(test("\n", ~~eol));
-        BOOST_TEST(!test("\b", ~~eol));
-
-        BOOST_TEST(test("   \r", eol, char_(' ')));
-        BOOST_TEST(test("   \r\n", eol, char_(' ')));
-        BOOST_TEST(test("   \n", eol, char_(' ')));
-        BOOST_TEST(!test("   \b", eol, char_(' ')));
+        BOOST_TEST(!test("\r", !eol, false));
+        BOOST_TEST(!test("\r\n", !eol, false));
+        BOOST_TEST(!test("\n", !eol, false));
+        BOOST_TEST(test("\b", !eol, false));
+
+        BOOST_TEST(test("   \r", eol, ascii::char_(L' ')));
+        BOOST_TEST(test("   \r\n", eol, ascii::char_(L' ')));
+        BOOST_TEST(test("   \n", eol, ascii::char_(L' ')));
+        BOOST_TEST(!test("   \b", eol, ascii::char_(L' ')));
 
         BOOST_TEST(test(L"\r", eol));
         BOOST_TEST(test(L"\r\n", eol));
         BOOST_TEST(test(L"\n", eol));
         BOOST_TEST(!test(L"\b", eol));
 
-        BOOST_TEST(test(L"   \r", eol, wchar(L' ')));
-        BOOST_TEST(test(L"   \r\n", eol, wchar(L' ')));
-        BOOST_TEST(test(L"   \n", eol, wchar(L' ')));
-        BOOST_TEST(!test(L"   \b", eol, wchar(L' ')));
+        BOOST_TEST(test(L"   \r", eol, wide::char_(L' ')));
+        BOOST_TEST(test(L"   \r\n", eol, wide::char_(L' ')));
+        BOOST_TEST(test(L"   \n", eol, wide::char_(L' ')));
+        BOOST_TEST(!test(L"   \b", eol, wide::char_(L' ')));
     }
-    
+
     {   // eoi
         BOOST_TEST(test("", eoi));
         BOOST_TEST(!test("a", eoi));
-        BOOST_TEST(test("a", ~eoi, false));
-        BOOST_TEST(!test("", ~eoi));
-        BOOST_TEST(test("", ~~eoi));
-        BOOST_TEST(!test("a", ~~eoi));
+        BOOST_TEST(test("a", !eoi, false));
+        BOOST_TEST(!test("", !eoi));
 
         BOOST_TEST(test("   ", eoi, space));
         BOOST_TEST(!test("   a", eoi, space));
-        BOOST_TEST(test("   a", ~eoi, space, false));
-        BOOST_TEST(!test("   ", ~eoi, space));
-        BOOST_TEST(test("   ", ~~eoi, space));
-        BOOST_TEST(!test("   a", ~~eoi, space));
+        BOOST_TEST(test("   a", !eoi, space, false));
+        BOOST_TEST(!test("   ", !eoi, space));
     }
-    
+
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/qi/eps.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/eps.cpp	(original)
+++ trunk/libs/spirit/test/qi/eps.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,11 +1,12 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
 #include <boost/detail/lightweight_test.hpp>
 #include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 
 #include <iostream>
@@ -15,18 +16,28 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit;
+    using boost::spirit::eps;
 
     {
         BOOST_TEST((test("", eps)));
         BOOST_TEST((test("xxx", eps, false)));
+        BOOST_TEST((!test("", !eps))); // not predicate
     }
 
-    {   // test action
+    {   // test non-lazy semantic predicate
+
+        BOOST_TEST((test("", eps(true))));
+        BOOST_TEST((!test("", eps(false))));
+        BOOST_TEST((test("", !eps(false)))); // not predicate
+    }
+
+    {   // test lazy semantic predicate
+
+        using boost::phoenix::val;
 
-        using namespace boost::phoenix;
         BOOST_TEST((test("", eps(val(true)))));
         BOOST_TEST((!test("", eps(val(false)))));
+        BOOST_TEST((test("", !eps(val(false))))); // not predicate
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/qi/expect.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/expect.cpp	(original)
+++ trunk/libs/spirit/test/qi/expect.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -11,6 +11,8 @@
 #include <boost/spirit/include/qi_numeric.hpp>
 #include <boost/spirit/include/qi_directive.hpp>
 #include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
 #include <boost/spirit/include/support_argument.hpp>
 #include <boost/fusion/include/vector.hpp>
 #include <boost/fusion/include/at.hpp>
@@ -28,6 +30,7 @@
     using namespace boost::spirit;
     using namespace boost::spirit::ascii;
     using spirit_test::test;
+    using spirit_test::print_info;
     using boost::spirit::qi::expectation_failure;
 
     {
@@ -42,10 +45,10 @@
         }
         catch (expectation_failure<char const*> const& x)
         {
-            std::cout << "expected: " << x.what << std::endl;
+            std::cout << "expected: "; print_info(x.what);
             std::cout << "got: \"" << x.first << '"' << std::endl;
 
-            BOOST_TEST(x.what == "'o'");
+            BOOST_TEST(boost::get<std::string>(x.what.value) == "o");
             BOOST_TEST(std::string(x.first, x.last) == "i");
         }
     }
@@ -53,17 +56,17 @@
     {
         try
         {
-            BOOST_TEST((test(" a a ", char_ > char_, space)));
-            BOOST_TEST((test(" x i ", char_('x') > char_('i'), space)));
-            BOOST_TEST((!test(" x i ", char_('x') > char_('o'), space)));
+            BOOST_TEST((test(" a a", char_ > char_, space)));
+            BOOST_TEST((test(" x i", char_('x') > char_('i'), space)));
+            BOOST_TEST((!test(" x i", char_('x') > char_('o'), space)));
         }
         catch (expectation_failure<char const*> const& x)
         {
-            std::cout << "expected: " << x.what << std::endl;
+            std::cout << "expected: "; print_info(x.what);
             std::cout << "got: \"" << x.first << '"' << std::endl;
 
-            BOOST_TEST(x.what == "'o'");
-            BOOST_TEST(std::string(x.first, x.last) == "i ");
+            BOOST_TEST(boost::get<std::string>(x.what.value) == "o");
+            BOOST_TEST(std::string(x.first, x.last) == "i");
         }
     }
 
@@ -76,14 +79,22 @@
         }
         catch (expectation_failure<char const*> const& x)
         {
-            std::cout << "expected: " << x.what << std::endl;
+            std::cout << "expected: "; print_info(x.what);
             std::cout << "got: \"" << x.first << '"' << std::endl;
 
-            BOOST_TEST(x.what == "case-insensitive \"nend\"");
+            BOOST_TEST(x.what.tag == "no-case-literal-string");
+            BOOST_TEST(boost::get<std::string>(x.what.value) == "nend");
             BOOST_TEST(std::string(x.first, x.last) == "END");
         }
     }
 
+    {
+        using boost::spirit::qi::rule;
+        using boost::spirit::eps;
+        rule<const wchar_t*, void(int)> r;
+        r = eps > eps(_r1);
+    }
+
     return boost::report_errors();
 }
 
Modified: trunk/libs/spirit/test/qi/grammar.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/grammar.cpp	(original)
+++ trunk/libs/spirit/test/qi/grammar.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -18,11 +18,17 @@
 #include <iostream>
 #include "test.hpp"
 
-using namespace spirit_test;
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace boost::spirit::ascii;
-using namespace boost::spirit::arg_names;
+using spirit_test::test;
+using spirit_test::test_attr;
+
+using boost::spirit::ascii::space_type;
+using boost::spirit::ascii::space;
+using boost::spirit::int_;
+using boost::spirit::qi::grammar;
+using boost::spirit::qi::rule;
+using boost::spirit::_val;
+using boost::spirit::_r1;
+using boost::spirit::lit;
 
 struct num_list : grammar<char const*, space_type>
 {
@@ -101,7 +107,7 @@
     { // direct access to the rules
 
         num_list g;
-        BOOST_TEST(test("123", g.num));
+        BOOST_TEST(test("123", g.num, space));
         BOOST_TEST(test("123, 456, 789", g.start, space));
     }
 
Modified: trunk/libs/spirit/test/qi/int.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/int.cpp	(original)
+++ trunk/libs/spirit/test/qi/int.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
     Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -27,12 +27,17 @@
 // Some compilers have long long, but don't define the
 // LONG_LONG_MIN and LONG_LONG_MAX macros in limits.h.  This
 // assumes that long long is 64 bits.
+
+BOOST_STATIC_ASSERT(sizeof(long long) == 8);
+
 #if !defined(LONG_LONG_MIN) && !defined(LONG_LONG_MAX)
 # define LONG_LONG_MAX 0x7fffffffffffffffLL
 # define LONG_LONG_MIN (-LONG_LONG_MAX - 1)
 #endif
 #endif // BOOST_HAS_LONG_LONG
 
+BOOST_STATIC_ASSERT(sizeof(long) == 4);
+
     char const* max_int = "2147483647";
     char const* int_overflow = "2147483648";
     char const* min_int = "-2147483648";
@@ -48,7 +53,8 @@
 int
 main()
 {
-    using namespace spirit_test;
+    using spirit_test::test;
+    using spirit_test::test_attr;
 
     ///////////////////////////////////////////////////////////////////////////
     //  signed integer tests
@@ -130,12 +136,29 @@
 #endif
 
     ///////////////////////////////////////////////////////////////////////////
-    //  int_spec<unused_type> tests
+    //  short_ and long_ tests
+    ///////////////////////////////////////////////////////////////////////////
+    {
+        using boost::spirit::short_;
+        using boost::spirit::long_;
+        int i;
+
+        BOOST_TEST(test("12345", short_));
+        BOOST_TEST(test_attr("12345", short_, i));
+        BOOST_TEST(i == 12345);
+
+        BOOST_TEST(test("1234567890", long_));
+        BOOST_TEST(test_attr("1234567890", long_, i));
+        BOOST_TEST(i == 1234567890);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    //  int_parser<unused_type> tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::qi::int_spec;
+        using boost::spirit::qi::int_parser;
         using boost::spirit::unused_type;
-        int_spec<unused_type> any_int;
+        int_parser<unused_type> any_int;
 
         BOOST_TEST(test("123456", any_int));
         BOOST_TEST(test("-123456", any_int));
@@ -146,8 +169,8 @@
     //  action tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using namespace boost::phoenix;
-        using boost::spirit::arg_names::_1;
+        using boost::phoenix::ref;
+        using boost::spirit::_1;
         using boost::spirit::ascii::space;
         using boost::spirit::int_;
         int n, m;
Modified: trunk/libs/spirit/test/qi/kleene.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/kleene.cpp	(original)
+++ trunk/libs/spirit/test/qi/kleene.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -24,13 +24,15 @@
 #include <iostream>
 #include "test.hpp"
 
-using namespace spirit_test;
-
 int
 main()
 {
-    using namespace boost::spirit;
+    using spirit_test::test;
+    using spirit_test::test_attr;
     using namespace boost::spirit::ascii;
+    using boost::spirit::qi::omit;
+    using boost::spirit::qi::uint_;
+    using boost::spirit::qi::int_;
 
     {
         BOOST_TEST(test("aaaaaaaa", *char_));
@@ -42,40 +44,38 @@
 
     {
         BOOST_TEST(test(" a a aaa aa", *char_, space));
-        BOOST_TEST(test("12345 678 9 ", *digit, space));
+        BOOST_TEST(test("12345 678 9", *digit, space));
     }
 
     {
         BOOST_TEST(test("aBcdeFGH", no_case[*char_]));
-        BOOST_TEST(test("a B cde FGH  ", no_case[*char_], space));
+        BOOST_TEST(test("a B cde FGH", no_case[*char_], space));
     }
 
     {
-        using boost::spirit::uint;
-        BOOST_TEST(test("12345 678 955 987", *uint, space));
-        BOOST_TEST(test("12345, 678, 955, 987", uint >> *(',' >> uint), space));
+        BOOST_TEST(test("12345 678 955 987", *uint_, space));
+        BOOST_TEST(test("12345, 678, 955, 987", uint_ >> *(',' >> uint_), space));
     }
 
     {
-        std::vector<char> v;
-        BOOST_TEST(test_attr("bbbb", *char_, v) && 4 == v.size() &&
-            v[0] == 'b' && v[1] == 'b' && v[2] == 'b' &&  v[3] == 'b');
+        std::string s;
+        BOOST_TEST(test_attr("bbbb", *char_, s) && 4 == s.size() && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("b b b b ", *char_, v, space) && 4 == v.size() &&
-            v[0] == 'b' && v[1] == 'b' && v[2] == 'b' && v[3] == 'b');
+        s.clear();
+        BOOST_TEST(test_attr("b b b b ", *char_, s, space)  && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("bbbb", *omit[char_('b')], v) && 0 == v.size());
+        // The following 4 tests show that omit does not inhibit explicit attributes
+        s.clear();
+        BOOST_TEST(test_attr("bbbb", *omit[char_('b')], s) && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("bbbb", omit[*char_('b')], v) && 0 == v.size());
+        s.clear();
+        BOOST_TEST(test_attr("bbbb", omit[*char_('b')], s) && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("b b b b ", *omit[char_('b')], v, space) && 0 == v.size());
+        s.clear();
+        BOOST_TEST(test_attr("b b b b", *omit[char_('b')], s, space) && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("b b b b ", omit[*char_('b')], v, space) && 0 == v.size());
+        s.clear();
+        BOOST_TEST(test_attr("b b b b", omit[*char_('b')], s, space) && s == "bbbb");
     }
 
     {
@@ -92,7 +92,7 @@
 
     { // actions
         namespace phx = boost::phoenix;
-        using boost::spirit::arg_names::_1;
+        using boost::spirit::_1;
 
         std::vector<char> v;
         BOOST_TEST(test("bbbb", (*char_)[phx::ref(v) = _1]) && 4 == v.size() &&
@@ -101,7 +101,7 @@
 
     { // more actions
         namespace phx = boost::phoenix;
-        using boost::spirit::arg_names::_1;
+        using boost::spirit::_1;
 
         std::vector<int> v;
         BOOST_TEST(test("123 456 789", (*int_)[phx::ref(v) = _1], space) && 3 == v.size() &&
Modified: trunk/libs/spirit/test/qi/lazy.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/lazy.cpp	(original)
+++ trunk/libs/spirit/test/qi/lazy.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -23,27 +23,44 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit;
-    using namespace boost::spirit::qi;
-    using namespace boost::phoenix;
-    using namespace boost::spirit::arg_names;
+    using spirit_test::test_attr;
+
+    namespace qi = boost::spirit::qi;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_val;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::rule;
+    using boost::spirit::ascii::char_;
+
+    using boost::phoenix::val;
+    using boost::phoenix::ref;
 
     {
-        BOOST_TEST(test("123", lazy(val(int_))));
+        BOOST_TEST(test("123", val(int_)));
     }
 
     {
         int result;
-        BOOST_TEST(test("123", lazy(val(int_))[ref(result) = _1]));
+        BOOST_TEST(test("123", qi::lazy(val(int_))[ref(result) = _1]));
         BOOST_TEST((result == 123));
     }
 
     {
+        rule<char const*, char()> r;
+
+        r = char_[_val = _1] >> *qi::lazy(_val);
+
+        BOOST_TEST(test("aaaaaaaaaaaa", r));
+        BOOST_TEST(!test("abbbbbbbbbb", r));
+        BOOST_TEST(test("bbbbbbbbbbb", r));
+    }
+
+    {
         rule<char const*, std::string()> r;
 
         r =
                 '<' >> *(char_ - '>')[_val += _1] >> '>'
-            >>  "</" >> lazy(_val) >> '>'
+            >>  "</" >> qi::lazy(_val) >> '>'
         ;
 
         BOOST_TEST(test("<tag></tag>", r));
Modified: trunk/libs/spirit/test/qi/lexeme.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/lexeme.cpp	(original)
+++ trunk/libs/spirit/test/qi/lexeme.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -17,8 +17,10 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit;
-    using namespace boost::spirit::ascii;
+    using boost::spirit::ascii::space;
+    using boost::spirit::ascii::space_type;
+    using boost::spirit::ascii::digit;
+    using boost::spirit::qi::lexeme;
     using boost::spirit::qi::rule;
 
     {
@@ -27,7 +29,8 @@
         BOOST_TEST((test(" 12345", lexeme[+digit], space)));
         BOOST_TEST((test(" 12345  ", lexeme[+digit], space, false)));
 
-        rule<char const*, space_type> r, rr;
+        rule<char const*, space_type> rr;
+        rule<char const*> r;
         r = +digit;
         rr = lexeme[r];
         BOOST_TEST((!test(" 1 2 3 4 5", rr, space)));
Modified: trunk/libs/spirit/test/qi/list.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/list.cpp	(original)
+++ trunk/libs/spirit/test/qi/list.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -31,7 +31,6 @@
 int
 main()
 {
-    using namespace boost::spirit;
     using namespace boost::spirit::ascii;
 
     {
@@ -50,9 +49,28 @@
         BOOST_TEST(s == "abcdefgh");
     }
 
+    {
+        using boost::spirit::int_;
+
+        std::vector<int> v;
+        BOOST_TEST(test_attr("1,2", int_ % ',', v));
+        BOOST_TEST(2 == v.size() && 1 == v[0] && 2 == v[1]);
+    }
+
+    {
+        using boost::spirit::int_;
+
+        std::vector<int> v;
+        BOOST_TEST(test_attr("(1,2)", '(' >> int_ % ',' >> ')', v));
+        BOOST_TEST(2 == v.size() && 1 == v[0] && 2 == v[1]);
+    }
+
     { // actions
-        using namespace boost::phoenix;
-        using boost::spirit::arg_names::_1;
+        using boost::phoenix::ref;
+        using boost::phoenix::begin;
+        using boost::phoenix::end;
+        using boost::phoenix::construct;
+        using boost::spirit::qi::_1;
 
         std::string s;
         BOOST_TEST(test("a,b,c,d,e,f,g,h", (char_ % ',')
Modified: trunk/libs/spirit/test/qi/lit.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/lit.cpp	(original)
+++ trunk/libs/spirit/test/qi/lit.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
     http://spirit.sourceforge.net/
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -9,7 +9,6 @@
 #include <boost/spirit/include/qi_string.hpp>
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 
@@ -21,22 +20,29 @@
 {
     using spirit_test::test;
     using spirit_test::test_attr;
-    using namespace boost::spirit;
+    using boost::spirit::qi::lit;
+    using boost::spirit::qi::_1;
 
     {
         BOOST_TEST((test("kimpo", "kimpo")));
         BOOST_TEST((test("kimpo", lit("kimpo"))));
         BOOST_TEST((test("x", lit("x"))));
-        BOOST_TEST((test("x", lit('x'))));
-        BOOST_TEST((test(L"x", lit(L'x'))));
+        BOOST_TEST((test(L"x", lit(L"x"))));
+
+        std::basic_string<char> s("kimpo");
+        std::basic_string<wchar_t> ws(L"kimpo");
+        BOOST_TEST((test("kimpo", s)));
+        BOOST_TEST((test(L"kimpo", ws)));
+        BOOST_TEST((test("kimpo", lit(s))));
+        BOOST_TEST((test(L"kimpo", lit(ws))));
     }
 
     {
         BOOST_TEST((test(L"kimpo", L"kimpo")));
-        BOOST_TEST((test(L"kimpo", wlit(L"kimpo"))));
-        BOOST_TEST((test(L"x", wlit(L"x"))));
-        BOOST_TEST((test(L"x", wlit(L'x'))));
-        BOOST_TEST((test(L"x", wlit(L'x'))));
+        BOOST_TEST((test(L"kimpo", lit(L"kimpo"))));
+        BOOST_TEST((test(L"x", lit(L"x"))));
+        BOOST_TEST((test(L"x", lit(L'x'))));
+        BOOST_TEST((test(L"x", lit(L'x'))));
     }
 
     {
@@ -58,21 +64,35 @@
 
     {
         using namespace boost::spirit::ascii;
-        BOOST_TEST((test("    kimpo", wlit("kimpo"), space)));
-        BOOST_TEST((test(L"    kimpo", wlit(L"kimpo"), space)));
-        BOOST_TEST((test("    x", wlit("x"), space)));
-        BOOST_TEST((test("    x", wlit('x'), space)));
-        BOOST_TEST((test(L"    x", wlit(L'x'), space)));
+        BOOST_TEST((test("    kimpo", lit("kimpo"), space)));
+        BOOST_TEST((test(L"    kimpo", lit(L"kimpo"), space)));
+        BOOST_TEST((test("    x", lit("x"), space)));
+        BOOST_TEST((test("    x", lit('x'), space)));
+        BOOST_TEST((test(L"    x", lit(L'x'), space)));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        std::string s;
+        BOOST_TEST((test_attr("kimpo", string("kimpo"), s)));
+        BOOST_TEST(s == "kimpo");
+        BOOST_TEST((test_attr(L"kimpo", string(L"kimpo"), s)));
+        BOOST_TEST(s == "kimpo");
+        BOOST_TEST((test_attr("x", string("x"), s)));
+        BOOST_TEST(s == "x");
     }
 
-    {   // lazy strings
+    {   // lazy string
 
-        using namespace boost::phoenix;
-        std::basic_string<char> s("kimpo");
-        BOOST_TEST((test("kimpo", lit(val(s)))));
+        using namespace boost::spirit::ascii;
+        using boost::phoenix::ref;
+        using boost::phoenix::val;
 
-        std::basic_string<wchar_t> ws(L"kimpo");
-        BOOST_TEST((test(L"kimpo", lit(ref(ws)))));
+        BOOST_TEST((test("x", string(val("x")))));
+
+        std::string str; // make sure lazy lits have an attribute
+        BOOST_TEST(test("x", string(val("x"))[ref(str) = _1]));
+        BOOST_TEST(str == "x");
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/qi/match_manip.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/match_manip.cpp	(original)
+++ trunk/libs/spirit/test/qi/match_manip.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,9 +1,16 @@
-//  Copyright (c) 2001-2009 Hartmut Kaiser
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/spirit/include/qi.hpp>
+/*=============================================================================
+    Copyright (c) 2001-2009 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
 #include <boost/spirit/include/qi_stream.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
@@ -19,32 +26,20 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 template <typename Char, typename Expr>
-bool test(Char const *toparse, Expr const& xpr)
+bool test(Char const *toparse, Expr const& expr)
 {
     namespace spirit = boost::spirit;
-    typedef
-        spirit::traits::is_component<spirit::qi::domain, Expr>
-    is_component;
-
-    // report invalid expression error as early as possible
-    BOOST_MPL_ASSERT_MSG(is_component::value,
-        xpr_is_not_convertible_to_a_parser, ());
-
-    typedef
-        typename spirit::result_of::as_component<spirit::qi::domain, Expr>::type
-    component;
-    typedef typename component::director director;
-
-    component c = spirit::as_component(spirit::qi::domain(), xpr);
+    BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, Expr)
 
     std::istringstream istrm(toparse);
-    istrm >> c;
+    istrm >> spirit::qi::compile<spirit::qi::domain>(expr);
     return istrm.good() || istrm.eof();
 }
 
-template <typename Char, typename Expr, typename Attribute, typename Skipper>
+template <typename Char, typename Expr, typename Copy, typename Skipper
+  , typename Attribute>
 bool test(Char const *toparse,
-    boost::spirit::qi::detail::match_manip<Expr, Attribute, Skipper> const& mm)
+    boost::spirit::qi::detail::match_manip<Expr, Copy, Skipper, Attribute> const& mm)
 {
     std::istringstream istrm(toparse);
     istrm >> mm;
@@ -67,13 +62,17 @@
 int
 main()
 {
-    using namespace boost::spirit;
-    using namespace boost::spirit::ascii;
-    using namespace boost::spirit::arg_names;
-    using namespace boost::spirit::qi;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_2;
+    using boost::spirit::qi::match;
+    using boost::spirit::qi::phrase_match;
+    using boost::spirit::qi::typed_stream;
+    using boost::spirit::qi::stream;
+    using boost::spirit::qi::int_;
+    using boost::phoenix::ref;
 
+    using namespace boost::spirit::ascii;
     namespace fusion = boost::fusion;
-    using namespace boost::phoenix;
 
     {
         char c = '\0';
@@ -98,7 +97,7 @@
 
         c = '\0';
         BOOST_TEST(test( " a",
-            phrase_match(char_, c, space)
+            phrase_match(char_, space, c)
         ) && c == 'a');
     }
 
@@ -149,7 +148,7 @@
 
         c = '\0';
         BOOST_TEST(test( " a",
-            phrase_match(stream, c, space)
+            phrase_match(stream, space, c)
         ) && c == 'a');
 
         i = 0;
@@ -159,7 +158,7 @@
 
         i = 0;
         BOOST_TEST(test( " 42",
-            phrase_match(stream, i, space)
+            phrase_match(stream, space, i)
         ) && i == 42);
     }
 
@@ -186,7 +185,7 @@
 
         t = fusion::vector<char, char>();
         BOOST_TEST(test( " a b",
-            phrase_match(char_ >> char_, t, space)
+            phrase_match(char_ >> char_, space, t)
         ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
     }
 
@@ -219,7 +218,7 @@
 
         t = fusion::vector<char, char, char>();
         BOOST_TEST(test( " a b c",
-            phrase_match(char_ >> char_ >> char_, t, space)
+            phrase_match(char_ >> char_ >> char_, space, t)
         ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
     }
 
@@ -237,14 +236,14 @@
 
         t = fusion::vector<char, int>();
         BOOST_TEST(test( " a 2",
-            phrase_match(char_ >> int_, t, space)
+            phrase_match(char_ >> int_, space, t)
         ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
 
         BOOST_TEST(!test( "a2",
             match(char_ >> alpha, t)
         ));
         BOOST_TEST(!test( " a 2",
-            phrase_match(char_ >> alpha, t, space)
+            phrase_match(char_ >> alpha, space, t)
         ));
     }
 
@@ -262,7 +261,7 @@
 
         v.clear();
         BOOST_TEST(test( " a b c",
-            phrase_match(*char_, v, space)
+            phrase_match(*char_, space, v)
         ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
 
         // parse a comma separated list of vector elements
@@ -273,7 +272,7 @@
 
         v.clear();
         BOOST_TEST(test( " a , b , c",
-            phrase_match(char_ % ',', v, space)
+            phrase_match(char_ % ',', space, v)
         ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
 
         // output all elements of a list
@@ -284,7 +283,7 @@
 
         l.clear();
         BOOST_TEST(test( " a b c",
-            phrase_match(*char_, l, space)
+            phrase_match(*char_, space, l)
         ) && 3 == l.size() && is_list_ok(l));
     }
 
Added: trunk/libs/spirit/test/qi/match_manip_attr.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/match_manip_attr.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,166 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#define SPIRIT_ARGUMENTS_LIMIT 10
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_parse.hpp>
+
+#include "test_manip_attr.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+    using namespace boost::spirit;
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test("1", char_, '1'));
+        BOOST_TEST(test("12", char_ >> char_, '1', '2'));
+        BOOST_TEST(test("123", char_ >> char_ >> char_, '1', '2', '3'));
+        BOOST_TEST(test("1234"
+          , char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4'));
+        BOOST_TEST(test("12345"
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5'));
+        BOOST_TEST(test("123456"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test("1234567"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test("12345678"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test("123456789"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test("1234567890"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test_skipped(" 1 ", char_, space, '1'));
+        BOOST_TEST(test_skipped(" 1 2 "
+          , char_ >> char_, space, '1', '2'));
+        BOOST_TEST(test_skipped(" 1 2 3 "
+          , char_ >> char_ >> char_, space, '1', '2', '3'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 "
+          , char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 "
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 8 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 8 9 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 8 9 0 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::qi::skip_flag;
+
+        BOOST_TEST(test_postskipped(" 1 ", char_, space
+          , skip_flag::postskip, '1'));
+        BOOST_TEST(test_postskipped(" 1 2 "
+          , char_ >> char_, space, skip_flag::postskip
+          , '1', '2'));
+        BOOST_TEST(test_postskipped(" 1 2 3 "
+          , char_ >> char_ >> char_, space
+          , skip_flag::postskip, '1', '2', '3'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 "
+          , char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip, '1', '2', '3', '4'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 "
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9 0 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::qi::skip_flag;
+
+        BOOST_TEST(test_postskipped(" 1", char_, space
+          , skip_flag::dont_postskip, '1'));
+        BOOST_TEST(test_postskipped(" 1 2"
+          , char_ >> char_, space, skip_flag::dont_postskip
+          , '1', '2'));
+        BOOST_TEST(test_postskipped(" 1 2 3"
+          , char_ >> char_ >> char_, space
+          , skip_flag::dont_postskip, '1', '2', '3'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4"
+          , char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip, '1', '2', '3', '4'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5"
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9 0"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/qi/no_case.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/no_case.cpp	(original)
+++ trunk/libs/spirit/test/qi/no_case.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,9 +1,9 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    http://spirit.sourceforge.net/
+    Copyright (c) 2001-2009 Joel de Guzman
+    include/qi_://spirit.sourceforge.net/
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+    file LICENSE_1_0.txt or copy at include/qi_://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
 #include <boost/detail/lightweight_test.hpp>
 #include <boost/spirit/include/qi_char.hpp>
@@ -17,7 +17,8 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit;
+    using spirit_test::test_attr;
+    using boost::spirit::qi::lit;
 
     {
         using namespace boost::spirit::ascii;
@@ -36,12 +37,41 @@
 
     {
         using namespace boost::spirit::ascii;
+        BOOST_TEST(test("X", no_case['x']));
+        BOOST_TEST(test("X", no_case['X']));
+        BOOST_TEST(test("x", no_case['X']));
+        BOOST_TEST(test("x", no_case['x']));
+        BOOST_TEST(!test("z", no_case['X']));
+        BOOST_TEST(!test("z", no_case['x']));
+    }
+
+    {
+        using namespace boost::spirit::iso8859_1;
+        BOOST_TEST(test("Á", no_case[char_('á')]));
+    }
+
+    {
+        using namespace boost::spirit::iso8859_1;
+        BOOST_TEST(test("X", no_case[char_("a-z")]));
+        BOOST_TEST(!test("1", no_case[char_("a-z")]));
+        BOOST_TEST(test("É", no_case[char_("å-ï")]));
+        BOOST_TEST(!test("ÿ", no_case[char_("å-ï")]));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
         BOOST_TEST(test("Bochi Bochi", no_case[lit("bochi bochi")]));
         BOOST_TEST(test("BOCHI BOCHI", no_case[lit("bochi bochi")]));
         BOOST_TEST(!test("Vavoo", no_case[lit("bochi bochi")]));
     }
 
     {
+        using namespace boost::spirit::iso8859_1;
+        BOOST_TEST(test("Áá", no_case[lit("áÁ")]));
+        BOOST_TEST(test("áá", no_case[no_case[lit("áÁ")]]));
+    }
+
+    {
         // should work!
         using namespace boost::spirit::ascii;
         BOOST_TEST(test("x", no_case[no_case[char_]]));
@@ -92,12 +122,23 @@
     }
 
     {
-        using namespace boost::spirit::standard;
         // chsets
-        BOOST_TEST(test("x", no_case[char_("a-z")]));
-        BOOST_TEST(test("X", no_case[char_("a-z")]));
-        BOOST_TEST(test(L"X", no_case[wchar(L"a-z")]));
-        BOOST_TEST(test(L"X", no_case[wchar(L"X")]));
+        namespace standard = boost::spirit::standard;
+        namespace standard_wide = boost::spirit::standard_wide;
+
+        BOOST_TEST(test("x", standard::no_case[standard::char_("a-z")]));
+        BOOST_TEST(test("X", standard::no_case[standard::char_("a-z")]));
+        BOOST_TEST(test(L"X", standard_wide::no_case[standard_wide::char_(L"a-z")]));
+        BOOST_TEST(test(L"X", standard_wide::no_case[standard_wide::char_(L"X")]));
+    }
+
+    {
+        using namespace boost::spirit::standard;
+        std::string s("bochi bochi");
+        BOOST_TEST(test("Bochi Bochi", no_case[lit(s.c_str())]));
+        BOOST_TEST(test("Bochi Bochi", no_case[lit(s)]));
+        BOOST_TEST(test("Bochi Bochi", no_case[s.c_str()]));
+        BOOST_TEST(test("Bochi Bochi", no_case[s]));
     }
 
     return boost::report_errors();
Deleted: trunk/libs/spirit/test/qi/none.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/none.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,25 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi_auxiliary.hpp>
-
-#include <iostream>
-#include "test.hpp"
-
-int
-main()
-{
-    using spirit_test::test;
-    using namespace boost::spirit;
-
-    {
-        BOOST_TEST((!test("", none)));
-        BOOST_TEST((!test("xxx", none)));
-    }
-
-    return boost::report_errors();
-}
Modified: trunk/libs/spirit/test/qi/not_predicate.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/not_predicate.cpp	(original)
+++ trunk/libs/spirit/test/qi/not_predicate.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -16,11 +16,12 @@
 main()
 {
     using spirit_test::test;
-    using namespace boost::spirit;
+    using boost::spirit::qi::int_;
 
     {
         BOOST_TEST((!test("1234", !int_)));
         BOOST_TEST((test("abcd", !int_, false)));
+        BOOST_TEST((!test("abcd", !!int_, false)));
     }
 
     return boost::report_errors();
Added: trunk/libs/spirit/test/qi/omit.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/omit.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,134 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include <string>
+#include <iostream>
+#include "test.hpp"
+
+int
+main()
+{
+    using namespace boost::spirit::ascii;
+    using boost::spirit::qi::omit;
+    using boost::spirit::qi::unused_type;
+    using boost::spirit::qi::unused;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::_1;
+
+    using boost::fusion::vector;
+    using boost::fusion::at_c;
+
+    using spirit_test::test;
+    using spirit_test::test_attr;
+
+    {
+        BOOST_TEST(test("a", omit['a']));
+    }
+
+    {
+        // omit[] means we don't receive the attribute
+        vector<char> attr;
+        BOOST_TEST((test_attr("abc", omit[char_] >> omit['b'] >> char_, attr)));
+        BOOST_TEST((at_c<0>(attr) == 'c'));
+    }
+
+    {
+        // If all elements except 1 is omitted, the attribute is
+        // a single-element sequence. For this case alone, we allow
+        // naked attributes (unwrapped in a fusion sequence).
+        char attr;
+        BOOST_TEST((test_attr("abc", omit[char_] >> 'b' >> char_, attr)));
+        BOOST_TEST((attr == 'c'));
+    }
+
+    {
+        // omit[] means we don't receive the attribute
+        vector<> attr;
+        BOOST_TEST((test_attr("abc", omit[char_] >> omit['b'] >> omit[char_], attr)));
+    }
+
+    {
+        // omit[] means we don't receive the attribute
+        // this test is merely a compile test, because using a unused as the
+        // explicit attribute doesn't make any sense
+        unused_type attr;
+        BOOST_TEST((test_attr("abc", omit[char_ >> 'b' >> char_], attr)));
+    }
+
+    {
+        // omit[] means we don't receive the attribute, if all elements of a
+        // sequence have unused attributes, the whole sequence has an unused
+        // attribute as well
+        vector<char, char> attr;
+        BOOST_TEST((test_attr("abcde",
+            char_ >> (omit[char_] >> omit['c'] >> omit[char_]) >> char_, attr)));
+        BOOST_TEST((at_c<0>(attr) == 'a'));
+        BOOST_TEST((at_c<1>(attr) == 'e'));
+    }
+
+    {
+        // "hello" has an unused_type. unused attrubutes are not part of the sequence
+        vector<char, char> attr;
+        BOOST_TEST((test_attr("a hello c", char_ >> "hello" >> char_, attr, space)));
+        BOOST_TEST((at_c<0>(attr) == 'a'));
+        BOOST_TEST((at_c<1>(attr) == 'c'));
+    }
+
+    {
+        // omit[] means we don't receive the attribute
+        vector<char> attr;
+        BOOST_TEST((test_attr("a hello c", char_ >> "hello" >> omit[char_], attr, space)));
+        BOOST_TEST((at_c<0>(attr) == 'a'));
+    }
+
+    {
+        // if only one node in a sequence is left (all the others are omitted),
+        // then we should also allow "naked" attributes (unwraped in a tuple)
+        int attr;
+        BOOST_TEST((test_attr("a 123 c", omit['a'] >> int_ >> omit['c'], attr, space)));
+        BOOST_TEST((attr == 123));
+    }
+
+    {
+        // unused means we don't care about the attribute
+        BOOST_TEST((test_attr("abc", char_ >> 'b' >> char_, unused)));
+    }
+
+    {   // test action with omitted attribute
+        char c = 0;
+
+        using boost::phoenix::ref;
+
+        BOOST_TEST(test("x123\"a string\"", (char_ >> omit[int_] >> "\"a string\"")
+            [ref(c) = _1]));
+        BOOST_TEST(c == 'x');
+    }
+
+
+    {   // test action with omitted attribute
+        int n = 0;
+
+        using boost::phoenix::ref;
+
+        BOOST_TEST(test("x 123 \"a string\"",
+            (omit[char_] >> int_ >> "\"a string\"")[ref(n) = _1], space));
+        BOOST_TEST(n == 123);
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/qi/optional.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/optional.cpp	(original)
+++ trunk/libs/spirit/test/qi/optional.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -22,7 +22,11 @@
 {
     using spirit_test::test;
     using spirit_test::test_attr;
-    using namespace boost::spirit;
+
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::omit;
+    using boost::spirit::ascii::char_;
 
     {
         BOOST_TEST((test("1234", -int_)));
@@ -30,7 +34,8 @@
     }
 
     {   // test propagation of unused
-        using namespace boost::fusion;
+        using boost::fusion::at_c;
+        using boost::fusion::vector;
 
         vector<char, char> v;
         BOOST_TEST((test_attr("a1234c", char_ >> -omit[int_] >> char_, v)));
@@ -42,16 +47,14 @@
         BOOST_TEST((at_c<0>(v) == 'a'));
         BOOST_TEST((at_c<1>(v) == 'c'));
 
-        //~ char ch;
-        //~ BOOST_TEST((test_attr(",c", -(',' >> char_), ch)));
-        //~ BOOST_TEST((ch == 'c'));
+        char ch;
+        BOOST_TEST((test_attr(",c", -(',' >> char_), ch)));
+        BOOST_TEST((ch == 'c'));
     }
 
     {   // test action
 
-        using namespace boost::phoenix;
         namespace phx = boost::phoenix;
-        using namespace boost::spirit::arg_names;
 
         boost::optional<int> n = 0;
         BOOST_TEST((test("1234", (-int_)[phx::ref(n) = _1])));
Added: trunk/libs/spirit/test/qi/parse_attr.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/parse_attr.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,166 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#define SPIRIT_ARGUMENTS_LIMIT 10
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_parse_attr.hpp>
+
+#include "test_attr.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+    using namespace boost::spirit;
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test("1", char_, '1'));
+        BOOST_TEST(test("12", char_ >> char_, '1', '2'));
+        BOOST_TEST(test("123", char_ >> char_ >> char_, '1', '2', '3'));
+        BOOST_TEST(test("1234"
+          , char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4'));
+        BOOST_TEST(test("12345"
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5'));
+        BOOST_TEST(test("123456"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test("1234567"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test("12345678"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test("123456789"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test("1234567890"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+
+        BOOST_TEST(test_skipped(" 1 ", char_, space, '1'));
+        BOOST_TEST(test_skipped(" 1 2 "
+          , char_ >> char_, space, '1', '2'));
+        BOOST_TEST(test_skipped(" 1 2 3 "
+          , char_ >> char_ >> char_, space, '1', '2', '3'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 "
+          , char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 "
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 8 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 8 9 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_skipped(" 1 2 3 4 5 6 7 8 9 0 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::qi::skip_flag;
+
+        BOOST_TEST(test_postskipped(" 1 ", char_, space
+          , skip_flag::postskip, '1'));
+        BOOST_TEST(test_postskipped(" 1 2 "
+          , char_ >> char_, space, skip_flag::postskip
+          , '1', '2'));
+        BOOST_TEST(test_postskipped(" 1 2 3 "
+          , char_ >> char_ >> char_, space
+          , skip_flag::postskip, '1', '2', '3'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 "
+          , char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip, '1', '2', '3', '4'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 "
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9 0 "
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    {
+        using namespace boost::spirit::ascii;
+        using boost::spirit::qi::skip_flag;
+
+        BOOST_TEST(test_postskipped(" 1", char_, space
+          , skip_flag::dont_postskip, '1'));
+        BOOST_TEST(test_postskipped(" 1 2"
+          , char_ >> char_, space, skip_flag::dont_postskip
+          , '1', '2'));
+        BOOST_TEST(test_postskipped(" 1 2 3"
+          , char_ >> char_ >> char_, space
+          , skip_flag::dont_postskip, '1', '2', '3'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4"
+          , char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip, '1', '2', '3', '4'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5"
+          , char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip, '1', '2', '3', '4', '5'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9'));
+        BOOST_TEST(test_postskipped(" 1 2 3 4 5 6 7 8 9 0"
+          , char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_ >> char_
+          , space, skip_flag::dont_postskip
+          , '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'));
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/qi/permutation.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/permutation.cpp	(original)
+++ trunk/libs/spirit/test/qi/permutation.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -28,9 +28,13 @@
 int
 main()
 {
-    using namespace boost::spirit;
-    using boost::spirit::ascii::alpha;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_2;
     using boost::spirit::qi::rule;
+    using boost::spirit::ascii::alpha;
+    using boost::spirit::ascii::char_;
+
     using boost::fusion::vector;
     using boost::fusion::at_c;
     using boost::optional;
@@ -76,7 +80,6 @@
 
     {   // test action
         using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
         namespace phx = boost::phoenix;
 
         optional<int> i;
Modified: trunk/libs/spirit/test/qi/plus.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/plus.cpp	(original)
+++ trunk/libs/spirit/test/qi/plus.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -29,8 +29,11 @@
 int
 main()
 {
-    using namespace boost::spirit;
     using namespace boost::spirit::ascii;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::omit;
+    using boost::spirit::qi::lit;
+    using boost::spirit::qi::_1;
 
     {
         BOOST_TEST(test("aaaaaaaa", +char_));
@@ -61,23 +64,23 @@
     }
 
     {
-        std::vector<char> v;
-        v.clear();
-        BOOST_TEST(test_attr("bbbb", +omit[char_('b')], v) && 0 == v.size());
+        // The following 4 tests show that omit does not inhibit explicit attributes
+
+        std::string s;
+        BOOST_TEST(test_attr("bbbb", +omit[char_('b')], s) && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("bbbb", omit[+char_('b')], v) && 0 == v.size());
+        s.clear();
+        BOOST_TEST(test_attr("bbbb", omit[+char_('b')], s) && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("b b b b ", +omit[char_('b')], v, space) && 0 == v.size());
+        s.clear();
+        BOOST_TEST(test_attr("b b b b ", +omit[char_('b')], s, space) && s == "bbbb");
 
-        v.clear();
-        BOOST_TEST(test_attr("b b b b ", omit[+char_('b')], v, space) && 0 == v.size());
+        s.clear();
+        BOOST_TEST(test_attr("b b b b ", omit[+char_('b')], s, space) && s == "bbbb");
     }
 
     { // actions
         namespace phx = boost::phoenix;
-        using boost::spirit::arg_names::_1;
 
         std::vector<char> v;
         BOOST_TEST(test("bbbb", (+char_)[phx::ref(v) = _1]) && 4 == v.size() &&
@@ -86,7 +89,6 @@
 
     { // more actions
         namespace phx = boost::phoenix;
-        using boost::spirit::arg_names::_1;
 
         std::vector<int> v;
         BOOST_TEST(test("1 2 3", (+int_)[phx::ref(v) = _1], space) && 3 == v.size() &&
Modified: trunk/libs/spirit/test/qi/range_run.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/range_run.cpp	(original)
+++ trunk/libs/spirit/test/qi/range_run.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Modified: trunk/libs/spirit/test/qi/raw.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/raw.cpp	(original)
+++ trunk/libs/spirit/test/qi/raw.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,7 +8,7 @@
 #include <boost/spirit/include/qi_directive.hpp>
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
 
 #include <iostream>
 #include <string>
@@ -17,16 +17,19 @@
 int
 main()
 {
+    using spirit_test::test;
     using spirit_test::test_attr;
-    using namespace boost::spirit;
     using namespace boost::spirit::ascii;
-    using boost::spirit::qi::rule;
+    using boost::spirit::qi::raw;
+    using boost::spirit::qi::eps;
 
     {
         boost::iterator_range<char const*> range;
         std::string str;
         BOOST_TEST((test_attr("spirit_test_123", raw[alpha >> *(alnum | '_')], range)));
         BOOST_TEST((std::string(range.begin(), range.end()) == "spirit_test_123"));
+        BOOST_TEST((test_attr("  spirit", raw[*alpha], range, space)));
+        BOOST_TEST((range.size() == 6));
     }
 
     {
@@ -35,5 +38,12 @@
         BOOST_TEST((str == "spirit_test_123"));
     }
 
+    {
+        boost::iterator_range<char const*> range;
+        BOOST_TEST((test("x", raw[alpha])));
+        BOOST_TEST((test_attr("x", raw[alpha], range)));
+        //~ BOOST_TEST((test_attr("x", raw[alpha] >> eps, range)));
+    }
+
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/qi/real.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/real.cpp	(original)
+++ trunk/libs/spirit/test/qi/real.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
     Copyright (c) 2001-2009 Hartmut Kaiser
 
     Use, modification and distribution is subject to the Boost Software
@@ -12,11 +12,10 @@
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_numeric.hpp>
 #include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
-#include <boost/spirit/home/support/detail/math/signbit.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
 
 #include "test.hpp"
-using namespace spirit_test;
 
 ///////////////////////////////////////////////////////////////////////////////
 //  These policies can be used to parse thousand separated
@@ -56,11 +55,11 @@
     static bool
     parse_n(Iterator& first, Iterator const& last, Attribute& attr)
     {
-        using namespace boost::spirit::qi;
-        using namespace boost::spirit;
+        using boost::spirit::qi::uint_parser;
+        namespace qi = boost::spirit::qi;
 
-        uint_spec<unsigned, 10, 1, 3> uint3;
-        uint_spec<unsigned, 10, 3, 3> uint3_3;
+        uint_parser<unsigned, 10, 1, 3> uint3;
+        uint_parser<unsigned, 10, 3, 3> uint3_3;
 
         T result = 0;
         if (parse(first, last, uint3, result))
@@ -69,7 +68,7 @@
             T n;
             Iterator save = first;
 
-            while (parse(first, last, ',') && parse(first, last, uint3_3, n))
+            while (qi::parse(first, last, ',') && qi::parse(first, last, uint3_3, n))
             {
                 result = result * 1000 + n;
                 save = first;
@@ -101,7 +100,7 @@
 bool
 compare(T n, double expected)
 {
-    double const eps = 0.00001;
+    T const eps = std::numeric_limits<T>::epsilon();
     T delta = n - expected;
     return (delta >= -eps) && (delta <= eps);
 }
@@ -109,15 +108,18 @@
 int
 main()
 {
+    using spirit_test::test;
+    using spirit_test::test_attr;
+
     ///////////////////////////////////////////////////////////////////////////////
     //  thousand separated numbers
     ///////////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::qi::uint_spec;
+        using boost::spirit::qi::uint_parser;
         using boost::spirit::qi::parse;
 
-        uint_spec<unsigned, 10, 1, 3> uint3;
-        uint_spec<unsigned, 10, 3, 3> uint3_3;
+        uint_parser<unsigned, 10, 1, 3> uint3;
+        uint_parser<unsigned, 10, 3, 3> uint3_3;
 
     #define r (uint3 >> *(',' >> uint3_3))
 
@@ -133,11 +135,11 @@
     //  unsigned real number tests
     ///////////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::qi::real_spec;
+        using boost::spirit::qi::real_parser;
         using boost::spirit::qi::parse;
         using boost::spirit::qi::ureal_policies;
 
-        real_spec<double, ureal_policies<double> > udouble;
+        real_parser<double, ureal_policies<double> > udouble;
         double  d;
 
         BOOST_TEST(test("1234", udouble));
@@ -204,7 +206,7 @@
 //  signed real number tests
 ///////////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::double_;
+        using boost::spirit::qi::double_;
         using boost::spirit::qi::parse;
         double  d;
 
@@ -238,8 +240,21 @@
         BOOST_TEST(!test("-1.2e", double_));
         BOOST_TEST(!test_attr("-1.2e", double_, d));
 
-        using boost::spirit::math::fpclassify;
-        using boost::spirit::math::signbit;
+        BOOST_TEST(test_attr("-5.7222349715140557e+307", double_, d));
+        BOOST_TEST(d == -5.7222349715140557e+307); // exact!
+
+        BOOST_TEST(test_attr("2.0332938517515416e-308", double_, d));
+        BOOST_TEST(d == 2.0332938517515416e-308); // exact!
+
+        BOOST_TEST(test_attr("20332938517515416e291", double_, d));
+        BOOST_TEST(d == 20332938517515416e291); // exact!
+
+        BOOST_TEST(test_attr("2.0332938517515416e307", double_, d));
+        BOOST_TEST(d == 2.0332938517515416e307); // exact!
+
+        using boost::math::fpclassify;
+        using boost::spirit::detail::signbit;   // Boost version is broken
+
         BOOST_TEST(test("-inf", double_));
         BOOST_TEST(test("-infinity", double_));
         BOOST_TEST(test_attr("-inf", double_, d) &&
@@ -272,13 +287,13 @@
     //  strict real number tests
     ///////////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::qi::real_spec;
+        using boost::spirit::qi::real_parser;
         using boost::spirit::qi::parse;
         using boost::spirit::qi::strict_ureal_policies;
         using boost::spirit::qi::strict_real_policies;
 
-        real_spec<double, strict_ureal_policies<double> > strict_udouble;
-        real_spec<double, strict_real_policies<double> > strict_double;
+        real_parser<double, strict_ureal_policies<double> > strict_udouble;
+        real_parser<double, strict_real_policies<double> > strict_double;
         double  d;
 
         BOOST_TEST(!test("1234", strict_udouble));
@@ -296,8 +311,8 @@
         BOOST_TEST(test("3.E6", strict_double));
         BOOST_TEST(test_attr("3.E6", strict_double, d) && compare(d, 3e6));
 
-        real_spec<double, no_trailing_dot_policy<double> > notrdot_real;
-        real_spec<double, no_leading_dot_policy<double> > nolddot_real;
+        real_parser<double, no_trailing_dot_policy<double> > notrdot_real;
+        real_parser<double, no_leading_dot_policy<double> > nolddot_real;
 
         BOOST_TEST(!test("1234.", notrdot_real));          //  Bad trailing dot
         BOOST_TEST(!test(".1234", nolddot_real));          //  Bad leading dot
@@ -307,9 +322,9 @@
     //  Special thousands separated numbers
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::qi::real_spec;
+        using boost::spirit::qi::real_parser;
         using boost::spirit::qi::parse;
-        real_spec<double, ts_real_policies<double> > ts_real;
+        real_parser<double, ts_real_policies<double> > ts_real;
         double  d;
 
         BOOST_TEST(test("123,456,789.01", ts_real));
@@ -332,13 +347,13 @@
     ///////////////////////////////////////////////////////////////////////////
     {
         using boost::math::concepts::real_concept;
-        using boost::spirit::qi::real_spec;
+        using boost::spirit::qi::real_parser;
         using boost::spirit::qi::real_policies;
         using boost::spirit::qi::parse;
-        
-        real_spec<real_concept, real_policies<real_concept> > custom_real;
+
+        real_parser<real_concept, real_policies<real_concept> > custom_real;
         real_concept d;
-        
+
         BOOST_TEST(test("-1234", custom_real));
         BOOST_TEST(test_attr("-1234", custom_real, d) && compare(d, -1234));
 
@@ -369,6 +384,6 @@
         BOOST_TEST(!test("-1.2e", custom_real));
         BOOST_TEST(!test_attr("-1.2e", custom_real, d));
     }
-    
+
     return boost::report_errors();
 }
Added: trunk/libs/spirit/test/qi/repeat.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/repeat.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,179 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#include <string>
+#include <vector>
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include <string>
+#include <iostream>
+#include "test.hpp"
+
+
+int
+main()
+{
+    using spirit_test::test_attr;
+    using spirit_test::test;
+
+    using namespace boost::spirit::ascii;
+    using boost::spirit::qi::repeat;
+    using boost::spirit::qi::inf;
+    using boost::spirit::qi::omit;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::_1;
+
+    {
+        BOOST_TEST(test("aaaaaaaa", repeat[char_])); // kleene synonym
+        BOOST_TEST(test("aaaaaaaa", repeat(8)[char_]));
+        BOOST_TEST(!test("aa", repeat(3)[char_]));
+
+        BOOST_TEST(test("aaa", repeat(3, 5)[char_]));
+        BOOST_TEST(test("aaaaa", repeat(3, 5)[char_]));
+        BOOST_TEST(!test("aaaaaa", repeat(3, 5)[char_]));
+        BOOST_TEST(!test("aa", repeat(3, 5)[char_]));
+
+        BOOST_TEST(test("aaa", repeat(3, inf)[char_]));
+        BOOST_TEST(test("aaaaa", repeat(3, inf)[char_]));
+        BOOST_TEST(test("aaaaaa", repeat(3, inf)[char_]));
+        BOOST_TEST(!test("aa", repeat(3, inf)[char_]));
+    }
+
+    { // from classic spirit tests
+        BOOST_TEST(test("", repeat(0, inf)['x']));
+
+        //  repeat exact 8
+        #define rep8 repeat(8)[alpha] >> 'X'
+        BOOST_TEST(!test("abcdefgX", rep8, false));
+        BOOST_TEST(test("abcdefghX", rep8));
+        BOOST_TEST(!test("abcdefghiX", rep8, false));
+        BOOST_TEST(!test("abcdefgX", rep8, false));
+        BOOST_TEST(!test("aX", rep8, false));
+
+        //  repeat 2 to 8
+        #define rep28 repeat(2, 8)[alpha] >> '*'
+        BOOST_TEST(test("abcdefg*", rep28));
+        BOOST_TEST(test("abcdefgh*", rep28));
+        BOOST_TEST(!test("abcdefghi*", rep28, false));
+        BOOST_TEST(!test("a*", rep28, false));
+
+        //  repeat 2 or more
+        #define rep2_ repeat(2, inf)[alpha] >> '+'
+        BOOST_TEST(test("abcdefg+", rep2_));
+        BOOST_TEST(test("abcdefgh+", rep2_));
+        BOOST_TEST(test("abcdefghi+", rep2_));
+        BOOST_TEST(test("abcdefg+", rep2_));
+        BOOST_TEST(!test("a+", rep2_, false));
+
+        //  repeat 0
+        #define rep0 repeat(0)[alpha] >> '/'
+        BOOST_TEST(test("/", rep0));
+        BOOST_TEST(!test("a/", rep0, false));
+
+        //  repeat 0 or 1
+        #define rep01 repeat(0, 1)[alpha >> digit] >> '?'
+        BOOST_TEST(!test("abcdefg?", rep01, false));
+        BOOST_TEST(!test("a?", rep01, false));
+        BOOST_TEST(!test("1?", rep01, false));
+        BOOST_TEST(!test("11?", rep01, false));
+        BOOST_TEST(!test("aa?", rep01, false));
+        BOOST_TEST(test("?", rep01));
+        BOOST_TEST(test("a1?", rep01));
+    }
+
+    {
+        BOOST_TEST(test(" a a aaa aa", repeat(7)[char_], space));
+        BOOST_TEST(test("12345 678 9", repeat(9)[digit], space));
+    }
+
+    {
+        BOOST_TEST(test("aBcdeFGH", no_case[repeat(8)[lower]]));
+        BOOST_TEST(test("a B cde FGH", no_case[repeat(8)[lower]], space));
+    }
+
+    {
+        std::string s;
+        BOOST_TEST(test_attr("bbbb", repeat(4)[char_], s) && s == "bbbb");
+
+        s.clear();
+        BOOST_TEST(test_attr("b b b b", repeat(4)[char_], s, space) && s == "bbbb");
+
+        // The following 4 tests show that omit does not inhibit explicit attributes
+        s.clear();
+        BOOST_TEST(test_attr("bbbb", repeat(4)[omit[char_('b')]], s) && s == "bbbb");
+
+        s.clear();
+        BOOST_TEST(test_attr("bbbb", omit[repeat(4)[char_('b')]], s) && s == "bbbb");
+
+        s.clear();
+        BOOST_TEST(test_attr("b b b b", repeat(4)[omit[char_('b')]], s, space) && s == "bbbb");
+
+        s.clear();
+        BOOST_TEST(test_attr("b b b b", omit[repeat(4)[char_('b')]], s, space) && s == "bbbb");
+    }
+
+    { // actions
+        namespace phx = boost::phoenix;
+
+        std::vector<char> v;
+        BOOST_TEST(test("bbbb", repeat(4)[char_][phx::ref(v) = _1]) && 4 == v.size() &&
+            v[0] == 'b' && v[1] == 'b' && v[2] == 'b' &&  v[3] == 'b');
+    }
+
+    { // more actions
+        namespace phx = boost::phoenix;
+
+        std::vector<int> v;
+        BOOST_TEST(test("123 456 789", repeat(3)[int_][phx::ref(v) = _1], space) && 3 == v.size() &&
+            v[0] == 123 && v[1] == 456 && v[2] == 789);
+    }
+
+    { // lazy repeats
+        using boost::phoenix::val;
+
+        BOOST_TEST(test("aaaaaaaa", repeat(val(8))[char_]));
+        BOOST_TEST(!test("aa", repeat(val(3))[char_]));
+
+        BOOST_TEST(test("aaa", repeat(val(3), val(5))[char_]));
+        BOOST_TEST(test("aaaaa", repeat(val(3), val(5))[char_]));
+        BOOST_TEST(!test("aaaaaa", repeat(val(3), val(5))[char_]));
+        BOOST_TEST(!test("aa", repeat(val(3), val(5))[char_]));
+
+        BOOST_TEST(test("aaa", repeat(val(3), val(inf))[char_]));
+        BOOST_TEST(test("aaaaa", repeat(val(3), val(inf))[char_]));
+        BOOST_TEST(test("aaaaaa", repeat(val(3), val(inf))[char_]));
+        BOOST_TEST(!test("aa", repeat(val(3), val(inf))[char_]));
+    }
+
+    { // more lazy repeats
+        using boost::phoenix::val;
+
+        BOOST_TEST(test("aaa", repeat(3, val(5))[char_]));
+        BOOST_TEST(test("aaaaa", repeat(val(3), 5)[char_]));
+        BOOST_TEST(!test("aaaaaa", repeat(3, val(5))[char_]));
+        BOOST_TEST(!test("aa", repeat(val(3), 5)[char_]));
+
+        BOOST_TEST(test("aaa", repeat(val(3), inf)[char_]));
+        BOOST_TEST(test("aaaaa", repeat(3, val(inf))[char_]));
+        BOOST_TEST(test("aaaaaa", repeat(val(3), inf)[char_]));
+        BOOST_TEST(!test("aa", repeat(3, val(inf))[char_]));
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/qi/rule.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/rule.cpp	(original)
+++ trunk/libs/spirit/test/qi/rule.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,23 +9,38 @@
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_string.hpp>
 #include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
 #include <boost/spirit/include/qi_nonterminal.hpp>
 #include <boost/spirit/include/qi_action.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/fusion/include/std_pair.hpp>
 
 #include <string>
+#include <cstring>
 #include <iostream>
 #include "test.hpp"
 
-using namespace spirit_test;
-
 int
 main()
 {
-    using namespace boost::spirit::qi;
+    using spirit_test::test_attr;
+    using spirit_test::test;
+
     using namespace boost::spirit::ascii;
+    using namespace boost::spirit::qi::labels;
+    using boost::spirit::qi::locals;
+    using boost::spirit::qi::rule;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::fail;
+    using boost::spirit::qi::on_error;
+    using boost::spirit::qi::debug;
+
+    using boost::phoenix::ref;
+    using boost::phoenix::val;
+
 
     { // basic tests
 
@@ -35,12 +50,25 @@
         b = 'b';
         c = 'c';
 
+        a.name("a");
+        b.name("b");
+        c.name("c");
+        start.name("start");
+
+        debug(a);
+        debug(b);
+        debug(c);
+        debug(start);
+
         start = *(a | b | c);
         BOOST_TEST(test("abcabcacb", start));
 
         start = (a | b) >> (start | b);
         BOOST_TEST(test("aaaabababaaabbb", start));
         BOOST_TEST(test("aaaabababaaabba", start, false));
+
+        // ignore the skipper!
+        BOOST_TEST(test("aaaabababaaabba", start, space, false));
     }
 
     { // basic tests w/ skipper
@@ -51,17 +79,68 @@
         b = 'b';
         c = 'c';
 
-        start = *(a | b | c);
-        BOOST_TEST(test(" a b c a b c a c b", start, space));
+        a.name("a");
+        b.name("b");
+        c.name("c");
+        start.name("start");
+
+        debug(a);
+        debug(b);
+        debug(c);
+        debug(start);
 
-        // allow no skipping too:
-        BOOST_TEST(test("abcabcacb", start));
+        start = *(a | b | c);
+        BOOST_TEST(test(" a b c a b c a c b ", start, space));
 
         start = (a | b) >> (start | b);
         BOOST_TEST(test(" a a a a b a b a b a a a b b b ", start, space));
         BOOST_TEST(test(" a a a a b a b a b a a a b b a ", start, space, false));
     }
 
+    { // basic tests w/ skipper but no final post-skip
+
+        rule<char const*, space_type> a, b, c, start;
+
+        a = 'a';
+        b = 'b';
+        c = 'c';
+
+        a.name("a");
+        b.name("b");
+        c.name("c");
+        start.name("start");
+
+        debug(a);
+        debug(b);
+        debug(c);
+        debug(start);
+
+        start = *(a | b) >> c;
+
+        using boost::spirit::qi::phrase_parse;
+        using boost::spirit::qi::skip_flag;
+        {
+            char const *s1 = " a b a a b b a c ... "
+              , *const e1 = s1 + std::strlen(s1);
+            BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::dont_postskip) 
+              && s1 == e1 - 5);
+        }
+
+        start = (a | b) >> (start | c);
+        {
+            char const *s1 = " a a a a b a b a b a a a b b b c "
+              , *const e1 = s1 + std::strlen(s1);
+            BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::postskip) 
+              && s1 == e1);
+        }
+        {
+            char const *s1 = " a a a a b a b a b a a a b b b c "
+              , *const e1 = s1 + std::strlen(s1);
+            BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::dont_postskip) 
+              && s1 == e1 - 1);
+        }
+    }
+
     { // alias tests
 
         rule<char const*> a, b, c, d, start;
@@ -105,11 +184,6 @@
 
     { // context tests
 
-        using namespace boost::phoenix;
-        using namespace boost::spirit::ascii;
-        using boost::spirit::arg_names::_1;
-        using boost::spirit::arg_names::_val;
-
         char ch;
         rule<char const*, char()> a;
         a = alpha[_val = _1];
@@ -121,14 +195,61 @@
         BOOST_TEST(ch == 'z');
     }
 
-    { // context (w/arg) tests
+    { // auto rules tests
 
-        using namespace boost::phoenix;
-        using namespace boost::spirit::ascii;
-        using boost::spirit::arg_names::_1;
-        using boost::spirit::arg_names::_r1;
-        using boost::spirit::arg_names::_r2;
-        using boost::spirit::arg_names::_val;
+        char ch;
+        rule<char const*, char()> a;
+        a %= alpha;
+
+        BOOST_TEST(test("x", a[ref(ch) = _1]));
+        BOOST_TEST(ch == 'x');
+
+        BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+        BOOST_TEST(ch == 'z');
+    }
+
+    { // auto rules tests: allow stl containers as attributes to
+      // sequences (in cases where attributes of the elements
+      // are convertible to the value_type of the container or if
+      // the element itself is an stl container with value_type
+      // that is convertible to the value_type of the attribute).
+
+        std::string s;
+        rule<char const*, std::string()> r;
+        r %= char_ >> *(',' >> char_);
+
+        BOOST_TEST(test("a,b,c,d,e,f", r[ref(s) = _1]));
+        BOOST_TEST(s == "abcdef");
+
+        r %= char_ >> char_ >> char_ >> char_ >> char_ >> char_;
+        BOOST_TEST(test("abcdef", r[ref(s) = _1]));
+        BOOST_TEST(s == "abcdef");
+    }
+
+    { // synth attribute value-init
+
+        std::string s;
+        rule<char const*, char()> r;
+        r = alpha[_val += _1];
+        BOOST_TEST(test_attr("abcdef", +r, s));
+        BOOST_TEST(s == "abcdef");
+    }
+
+    { // auto rules aliasing tests
+
+        char ch;
+        rule<char const*, char()> a, b;
+        a %= b;
+        b %= alpha;
+
+        BOOST_TEST(test("x", a[ref(ch) = _1]));
+        BOOST_TEST(ch == 'x');
+
+        BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+        BOOST_TEST(ch == 'z');
+    }
+
+    { // context (w/arg) tests
 
         char ch;
         rule<char const*, char(int)> a; // 1 arg
@@ -146,13 +267,17 @@
         BOOST_TEST(ch == 'a' + 1 + 2);
     }
 
+    { // context (w/ reference arg) tests
+
+        char ch;
+        rule<char const*, void(char&)> a; // 1 arg (reference)
+        a = alpha[_r1 = _1];
+
+        BOOST_TEST(test("x", a(ref(ch))));
+        BOOST_TEST(ch == 'x');
+    }
+
     { // context (w/locals) tests
-        using namespace boost::phoenix;
-        using namespace boost::spirit::ascii;
-        using boost::spirit::arg_names::_1;
-        using boost::spirit::arg_names::_a;
-        using boost::spirit::char_;
-        using boost::spirit::locals;
 
         rule<char const*, locals<char> > a; // 1 local
         a = alpha[_a = _1] >> char_(_a);
@@ -161,13 +286,6 @@
     }
 
     { // context (w/args and locals) tests
-        using namespace boost::phoenix;
-        using namespace boost::spirit::ascii;
-        using boost::spirit::arg_names::_1;
-        using boost::spirit::arg_names::_r1;
-        using boost::spirit::arg_names::_a;
-        using boost::spirit::char_;
-        using boost::spirit::locals;
 
         rule<char const*, void(int), locals<char> > a; // 1 arg + 1 local
         a = alpha[_a = _1 + _r1] >> char_(_a);
@@ -176,13 +294,17 @@
         BOOST_TEST(!test("ax", a(val(1))));
     }
 
+    { // void() has unused type (void == unused_type)
+
+        std::pair<int, char> attr;
+        rule<char const*, void()> r;
+        r = char_;
+        BOOST_TEST(test_attr("123ax", int_ >> char_ >> r, attr));
+        BOOST_TEST(attr.first == 123);
+        BOOST_TEST(attr.second == 'a');
+    }
+
     { // bug: test that injected attributes are ok
-        using namespace boost::phoenix;
-        using namespace boost::spirit::ascii;
-        using boost::spirit::arg_names::_1;
-        using boost::spirit::arg_names::_r1;
-        using boost::spirit::arg_names::_val;
-        using boost::spirit::char_;
 
         rule<char const*, char(int) > r;
 
@@ -190,16 +312,38 @@
         r = char_(_r1)[_val = _1];
     }
 
+    { // show that ra = rb and ra %= rb works as expected
+        rule<char const*, int() > ra, rb;
+        int attr;
+
+        ra %= int_;
+        BOOST_TEST(test_attr("123", ra, attr));
+        BOOST_TEST(attr == 123);
+
+        rb %= ra;
+        BOOST_TEST(test_attr("123", rb, attr));
+        BOOST_TEST(attr == 123);
+
+        rb = ra;
+        BOOST_TEST(test_attr("123", rb, attr));
+        BOOST_TEST(attr == 123);
+    }
+
+    { // std::string as container attribute with auto rules
+
+        rule<char const*, std::string()> text;
+        text %= +(!char_(')') >> !char_('>') >> char_);
+        std::string attr;
+        BOOST_TEST(test_attr("x", text, attr));
+        BOOST_TEST(attr == "x");
+    }
+
     { // error handling
 
-        using namespace boost::phoenix;
         using namespace boost::spirit::ascii;
         using boost::phoenix::val;
-        using boost::spirit::int_;
-        using boost::spirit::arg_names::_4; // what
-        using boost::spirit::arg_names::_3; // error pos
-        using boost::spirit::arg_names::_2; // end
-        using boost::spirit::qi::fail;
+        using boost::phoenix::construct;
+        using boost::phoenix::bind;
 
         rule<char const*> r;
         r = '(' > int_ > ',' > int_ > ')';
@@ -209,7 +353,7 @@
             r, std::cout
                 << val("Error! Expecting: ")
                 << _4
-                << val(" Here: \"")
+                << val(", got: \"")
                 << construct<std::string>(_3, _2)
                 << val("\"")
                 << std::endl
Modified: trunk/libs/spirit/test/qi/sequence.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/sequence.cpp	(original)
+++ trunk/libs/spirit/test/qi/sequence.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -12,8 +12,6 @@
 #include <boost/spirit/include/qi_directive.hpp>
 #include <boost/spirit/include/qi_action.hpp>
 #include <boost/spirit/include/support_argument.hpp>
-#include <boost/fusion/include/vector.hpp>
-#include <boost/fusion/include/at.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
 #include <boost/spirit/include/phoenix_statement.hpp>
@@ -25,12 +23,20 @@
 int
 main()
 {
-    using namespace boost::spirit;
     using namespace boost::spirit::ascii;
+    using boost::spirit::qi::lit;
+    using boost::spirit::qi::unused;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::what;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_2;
+
     using boost::fusion::vector;
     using boost::fusion::at_c;
+
     using spirit_test::test;
     using spirit_test::test_attr;
+    using spirit_test::print_info;
 
     {
         BOOST_TEST((test("aa", char_ >> char_)));
@@ -42,9 +48,9 @@
     }
 
     {
-        BOOST_TEST((test(" a a ", char_ >> char_, space)));
-        BOOST_TEST((test(" x i ", char_('x') >> char_('i'), space)));
-        BOOST_TEST((!test(" x i ", char_('x') >> char_('o'), space)));
+        BOOST_TEST((test(" a a", char_ >> char_, space)));
+        BOOST_TEST((test(" x i", char_('x') >> char_('i'), space)));
+        BOOST_TEST((!test(" x i", char_('x') >> char_('o'), space)));
     }
 
     {
@@ -60,7 +66,7 @@
 
     {
         vector<char, char, char> attr;
-        BOOST_TEST((test_attr(" a\n  b\n  c\n ", char_ >> char_ >> char_, attr, space)));
+        BOOST_TEST((test_attr(" a\n  b\n  c", char_ >> char_ >> char_, attr, space)));
         BOOST_TEST((at_c<0>(attr) == 'a'));
         BOOST_TEST((at_c<1>(attr) == 'b'));
         BOOST_TEST((at_c<2>(attr) == 'c'));
@@ -75,47 +81,6 @@
     }
 
     {
-        // omit[] means we don't receive the attribute
-        vector<char> attr;
-        BOOST_TEST((test_attr("abc", omit[char_] >> omit['b'] >> char_, attr)));
-        BOOST_TEST((at_c<0>(attr) == 'c'));
-    }
-
-    {
-        // If all elements except 1 is omitted, the attribute is
-        // a single-element sequence. For this case alone, we allow
-        // naked attributes (unwrapped in a fusion sequence).
-        char attr;
-        BOOST_TEST((test_attr("abc", omit[char_] >> 'b' >> char_, attr)));
-        BOOST_TEST((attr == 'c'));
-    }
-
-    {
-        // omit[] means we don't receive the attribute
-        vector<> attr;
-        BOOST_TEST((test_attr("abc", omit[char_] >> omit['b'] >> omit[char_], attr)));
-    }
-
-    {
-        // omit[] means we don't receive the attribute
-        // this test is merely a compile test, because using a unused as the
-        // explicit attribute doesn't make any sense
-        unused_type attr;
-        BOOST_TEST((test_attr("abc", omit[char_ >> 'b' >> char_], attr)));
-    }
-
-    {
-        // omit[] means we don't receive the attribute, if all elements of a
-        // sequence have unused attributes, the whole sequence has an unused
-        // attribute as well
-        vector<char, char> attr;
-        BOOST_TEST((test_attr("abcde",
-            char_ >> (omit[char_] >> omit['c'] >> omit[char_]) >> char_, attr)));
-        BOOST_TEST((at_c<0>(attr) == 'a'));
-        BOOST_TEST((at_c<1>(attr) == 'e'));
-    }
-
-    {
         // "hello" has an unused_type. unused attrubutes are not part of the sequence
         vector<char, char> attr;
         BOOST_TEST((test_attr("a hello c", char_ >> "hello" >> char_, attr, space)));
@@ -124,18 +89,10 @@
     }
 
     {
-        // omit[] means we don't receive the attribute
-        vector<char> attr;
-        BOOST_TEST((test_attr("a hello c", char_ >> "hello" >> omit[char_], attr, space)));
-        BOOST_TEST((at_c<0>(attr) == 'a'));
-    }
-
-    {
-        // if only one node in a sequence is left (all the others are omitted),
-        // then we should also allow "naked" attributes (unwraped in a tuple)
-        int attr;
-        BOOST_TEST((test_attr("a 123 c", omit['a'] >> int_ >> omit['c'], attr, space)));
-        BOOST_TEST((attr == 123));
+        // a single element
+        char attr;
+        BOOST_TEST((test_attr("ab", char_ >> 'b', attr)));
+        BOOST_TEST((attr == 'a'));
     }
 
     {
@@ -150,14 +107,36 @@
     }
 
     {
-#ifdef SPIRIT_TEST_COMPILE_FAIL // $$$
+#ifdef SPIRIT_NO_COMPILE_CHECK
         char_ >> char_ = char_ >> char_; // disallow this!
 #endif
     }
 
+    { // alternative forms of attributes. Allow sequences to take in
+      // stl containers.
+
+        std::vector<char> v;
+        BOOST_TEST(test_attr("abc", char_ >> char_ >> char_, v));
+        BOOST_TEST(v.size() == 3);
+        BOOST_TEST(v[0] == 'a');
+        BOOST_TEST(v[1] == 'b');
+        BOOST_TEST(v[2] == 'c');
+    }
+
+    { // alternative forms of attributes. Allow sequences to take in
+      // stl containers.
+
+        std::vector<char> v;
+        BOOST_TEST(test_attr("a,b,c", char_ >> *(',' >> char_), v));
+        BOOST_TEST(v.size() == 3);
+        BOOST_TEST(v[0] == 'a');
+        BOOST_TEST(v[1] == 'b');
+        BOOST_TEST(v[2] == 'c');
+
+    }
+
     {   // test action
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
+        using boost::phoenix::ref;
         char c = 0;
         int n = 0;
 
@@ -167,19 +146,8 @@
         BOOST_TEST(n == 123);
     }
 
-    {   // test action with omitted attribute
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        char c = 0;
-
-        BOOST_TEST(test("x123\"a string\"", (char_ >> omit[int_] >> "\"a string\"")
-            [ref(c) = _1]));
-        BOOST_TEST(c == 'x');
-    }
-
     {   // test action
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
+        using boost::phoenix::ref;
         char c = 0;
         int n = 0;
 
@@ -189,14 +157,9 @@
         BOOST_TEST(n == 123);
     }
 
-    {   // test action with omitted attribute
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
-        int n = 0;
+    {   // testing "what"
 
-        BOOST_TEST(test("x 123 \"a string\"",
-            (omit[char_] >> int_ >> "\"a string\"")[ref(n) = _1], space));
-        BOOST_TEST(n == 123);
+        print_info(what(alpha | char_('x') >> lit("hello") >> int_));
     }
 
     return boost::report_errors();
Modified: trunk/libs/spirit/test/qi/sequential_or.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/sequential_or.cpp	(original)
+++ trunk/libs/spirit/test/qi/sequential_or.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -22,12 +22,16 @@
 #include <iostream>
 #include "test.hpp"
 
-using namespace spirit_test;
-
 int
 main()
 {
-    using namespace boost::spirit;
+    using spirit_test::test;
+    using spirit_test::test_attr;
+
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_2;
+    using boost::spirit::ascii::char_;
     using boost::spirit::ascii::alpha;
     using boost::fusion::vector;
     using boost::fusion::at_c;
@@ -59,9 +63,22 @@
         BOOST_TEST((!test("a123", int_ || alpha)));
     }
 
+    {   // test unused attribute handling
+
+        vector<optional<int>, optional<char> > attr;
+        BOOST_TEST((test_attr("123ab", int_ || ("a" >> char_), attr)));
+        BOOST_TEST((at_c<0>(attr).get() == 123));
+        BOOST_TEST((at_c<1>(attr).get() == 'b'));
+    }
+
+    {   // test unused attribute handling
+
+        optional<int> attr;
+        BOOST_TEST((test_attr("123a", int_ || "a", attr)));
+        BOOST_TEST((attr == 123));
+    }
+
     {   // test action
-        using namespace boost::phoenix;
-        using namespace boost::spirit::arg_names;
         namespace phx = boost::phoenix;
 
         optional<int> i;
Added: trunk/libs/spirit/test/qi/skip.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/skip.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,51 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+
+#include <iostream>
+#include "test.hpp"
+
+int
+main()
+{
+    using spirit_test::test;
+    using spirit_test::test_attr;
+    using boost::spirit::qi::skip;
+    using boost::spirit::qi::lexeme;
+    using boost::spirit::qi::lit;
+    using boost::spirit::ascii::char_;
+    using boost::spirit::ascii::space;
+    using boost::spirit::ascii::alpha;
+
+    {
+        BOOST_TEST((test("a b c d", skip(space)[*char_])));
+    }
+
+    { // test attribute
+        std::string s;
+        BOOST_TEST((test_attr("a b c d", skip(space)[*char_], s)));
+        BOOST_TEST(s == "abcd");
+    }
+
+    { // reskip
+        BOOST_TEST((test("ab c d", lexeme[lit('a') >> 'b' >> skip[lit('c') >> 'd']], space)));
+        BOOST_TEST((test("abcd", lexeme[lit('a') >> 'b' >> skip[lit('c') >> 'd']], space)));
+        BOOST_TEST(!(test("a bcd", lexeme[lit('a') >> 'b' >> skip[lit('c') >> 'd']], space)));
+    }
+
+    { // lazy skip
+        using boost::phoenix::val;
+
+        BOOST_TEST((test("a b c d", skip(val(space))[*char_])));
+    }
+
+    return boost::report_errors();
+}
Modified: trunk/libs/spirit/test/qi/symbols.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/symbols.cpp	(original)
+++ trunk/libs/spirit/test/qi/symbols.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,7 +8,10 @@
 #include <boost/spirit/include/qi_string.hpp>
 #include <boost/spirit/include/qi_char.hpp>
 #include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
 #include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
 #include <boost/spirit/include/support_argument.hpp>
 #include <boost/spirit/include/phoenix_core.hpp>
 #include <boost/spirit/include/phoenix_operator.hpp>
@@ -16,12 +19,28 @@
 #include <iostream>
 #include "test.hpp"
 
+// Custom string type with a C-style string conversion.
+struct custom_string_c
+{
+    custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
+
+    operator char*() { return str; }
+    operator char const*() const { return str; }
+
+private:
+    char str[2];
+};
+
 int
 main()
 {
     using spirit_test::test;
     using spirit_test::test_attr;
-    using namespace boost::spirit::qi;
+    using boost::spirit::qi::symbols;
+    using boost::spirit::qi::rule;
+    using boost::spirit::qi::lazy;
+    using boost::spirit::qi::_r1;
+    using boost::phoenix::ref;
 
     { // basics
         symbols<char, int> sym;
@@ -35,6 +54,8 @@
             ("Joey")
         ;
 
+        boost::mpl::true_ f = boost::mpl::bool_<boost::spirit::traits::is_parser<symbols<char, int> >::value>();
+
         BOOST_TEST((test("Joel", sym)));
         BOOST_TEST((test("Ruby", sym)));
         BOOST_TEST((test("Tenji", sym)));
@@ -43,6 +64,20 @@
         BOOST_TEST((test("Joey", sym)));
         BOOST_TEST((!test("XXX", sym)));
 
+        // test copy
+        symbols<char, int> sym2;
+        sym2 = sym;
+        BOOST_TEST((test("Joel", sym2)));
+        BOOST_TEST((test("Ruby", sym2)));
+        BOOST_TEST((test("Tenji", sym2)));
+        BOOST_TEST((test("Tutit", sym2)));
+        BOOST_TEST((test("Kim", sym2)));
+        BOOST_TEST((test("Joey", sym2)));
+        BOOST_TEST((!test("XXX", sym2)));
+
+        // make sure it plays well with other parsers
+        BOOST_TEST((test("Joelyo", sym >> "yo")));
+
         sym.remove
             ("Joel")
             ("Ruby")
@@ -90,6 +125,9 @@
         BOOST_TEST((test("TUTIT", no_case[sym])));
         BOOST_TEST((test("KIM", no_case[sym])));
         BOOST_TEST((test("JOEY", no_case[sym])));
+
+        // make sure it plays well with other parsers
+        BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
     }
 
     { // attributes
@@ -121,8 +159,8 @@
     }
 
     { // actions
-        using namespace boost::phoenix;
-        using boost::spirit::arg_names::_1;
+        using boost::phoenix::ref;
+        using boost::spirit::_1;
 
         symbols<char, int> sym;
         sym.add
@@ -185,5 +223,52 @@
         BOOST_TEST((!test_attr("XXX", sym, i)));
     }
 
+    { // allow std::string and other string types
+        symbols<> sym;
+
+        // const and non-const std::string
+        std::string a("abc");
+        std::string const b("def");
+        sym += a;
+        sym += b;
+        BOOST_TEST((test("abc", sym)));
+        BOOST_TEST((test("def", sym)));
+        sym = a;
+        BOOST_TEST((test("abc", sym)));
+        BOOST_TEST((!test("def", sym)));
+
+        // non-const C-style string
+        char arr[2]; arr[0] = 'a'; arr[1] = '\0';
+        sym = arr;
+        BOOST_TEST((test("a", sym)));
+        BOOST_TEST((!test("b", sym)));
+
+        // const and non-const custom string type
+        custom_string_c c('x');
+        custom_string_c const cc('y');
+        sym = c, cc;
+        BOOST_TEST((test("x", sym)));
+        BOOST_TEST((test("y", sym)));
+        BOOST_TEST((!test("z", sym)));
+    }
+
+    {
+        symbols<char, int> sym;
+        sym.add
+            ("a", 1)
+            ("b", 2)
+        ;
+
+        rule<char const*, int(symbols<char, int>&)> r;
+        r %= lazy(_r1);
+
+        int i = 0;
+        BOOST_TEST(test_attr("a", r(ref(sym)), i));
+        BOOST_TEST(i == 1);
+        BOOST_TEST(test_attr("b", r(ref(sym)), i));
+        BOOST_TEST(i == 2);
+        BOOST_TEST(!test("c", r(ref(sym))));
+    }
+
     return boost::report_errors();
 }
Added: trunk/libs/spirit/test/qi/terminal_ex.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/terminal_ex.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,386 @@
+/*=============================================================================
+    Copyright (c) 2008 Francois Barel
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include <iterator>
+#include "test.hpp"
+
+
+namespace testns
+{
+
+    BOOST_SPIRIT_TERMINAL_EX( ops )
+
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Parsers
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <typename T1>
+    struct ops_1_parser
+      : boost::spirit::qi::primitive_parser<ops_1_parser<T1> >
+    {
+        ops_1_parser(T1 t1)
+          : t1(t1)
+        {}
+
+        template <typename Context, typename Iterator>
+        struct attribute
+        {
+            typedef int type;   // Number of parsed chars.
+        };
+
+        template <typename Iterator, typename Context
+          , typename Skipper, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& /*context*/, Skipper const& skipper
+          , Attribute& attr) const
+        {
+            boost::spirit::qi::skip_over(first, last, skipper);
+
+            int count = 0;
+
+            Iterator it = first;
+            typedef typename std::iterator_traits<Iterator>::value_type Char;
+            for (T1 t = 0; t < t1; t++, count++)
+                if (it == last || *it++ != Char('+'))
+                    return false;
+
+            boost::spirit::qi::detail::assign_to(count, attr);
+            first = it;
+            return true;
+        }
+
+        template <typename Context>
+        boost::spirit::qi::info what(Context& /*context*/) const
+        {
+            return boost::spirit::qi::info("ops_1");
+        }
+
+        const T1 t1;
+    };
+
+    template <typename T1, typename T2>
+    struct ops_2_parser
+      : boost::spirit::qi::primitive_parser<ops_2_parser<T1, T2> >
+    {
+        ops_2_parser(T1 t1, T2 t2)
+          : t1(t1)
+          , t2(t2)
+        {}
+
+        template <typename Context, typename Iterator>
+        struct attribute
+        {
+            typedef int type;   // Number of parsed chars.
+        };
+
+        template <typename Iterator, typename Context
+          , typename Skipper, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& /*context*/, Skipper const& skipper
+          , Attribute& attr) const
+        {
+            boost::spirit::qi::skip_over(first, last, skipper);
+
+            int count = 0;
+
+            Iterator it = first;
+            typedef typename std::iterator_traits<Iterator>::value_type Char;
+            for (T1 t = 0; t < t1; t++, count++)
+                if (it == last || *it++ != Char('+'))
+                    return false;
+            for (T2 t = 0; t < t2; t++, count++)
+                if (it == last || *it++ != Char('-'))
+                    return false;
+
+            boost::spirit::qi::detail::assign_to(count, attr);
+            first = it;
+            return true;
+        }
+
+        template <typename Context>
+        boost::spirit::qi::info what(Context& /*context*/) const
+        {
+            return boost::spirit::qi::info("ops_2");
+        }
+
+        const T1 t1;
+        const T2 t2;
+    };
+
+    template <typename T1, typename T2, typename T3>
+    struct ops_3_parser
+      : boost::spirit::qi::primitive_parser<ops_3_parser<T1, T2, T3> >
+    {
+        ops_3_parser(T1 t1, T2 t2, T3 t3)
+          : t1(t1)
+          , t2(t2)
+          , t3(t3)
+        {}
+
+        template <typename Context, typename Iterator>
+        struct attribute
+        {
+            typedef int type;   // Number of parsed chars.
+        };
+
+        template <typename Iterator, typename Context
+          , typename Skipper, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& /*context*/, Skipper const& skipper
+          , Attribute& attr) const
+        {
+            boost::spirit::qi::skip_over(first, last, skipper);
+
+            int count = 0;
+
+            Iterator it = first;
+            typedef typename std::iterator_traits<Iterator>::value_type Char;
+            for (T1 t = 0; t < t1; t++, count++)
+                if (it == last || *it++ != Char('+'))
+                    return false;
+            for (T2 t = 0; t < t2; t++, count++)
+                if (it == last || *it++ != Char('-'))
+                    return false;
+            for (T3 t = 0; t < t3; t++, count++)
+                if (it == last || *it++ != Char('*'))
+                    return false;
+
+            boost::spirit::qi::detail::assign_to(count, attr);
+            first = it;
+            return true;
+        }
+
+        template <typename Context>
+        boost::spirit::qi::info what(Context& /*context*/) const
+        {
+            return boost::spirit::qi::info("ops_3");
+        }
+
+        const T1 t1;
+        const T2 t2;
+        const T3 t3;
+    };
+
+}
+
+
+namespace boost { namespace spirit
+{
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Enablers
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <typename T1>
+    struct use_terminal<qi::domain
+      , terminal_ex<testns::tag::ops, fusion::vector1<T1> > >
+      : mpl::true_ {};
+
+    template <typename T1, typename T2>
+    struct use_terminal<qi::domain
+      , terminal_ex<testns::tag::ops, fusion::vector2<T1, T2> > >
+      : mpl::true_ {};
+
+    template <typename T1, typename T2, typename T3>
+    struct use_terminal<qi::domain
+      , terminal_ex<testns::tag::ops, fusion::vector3<T1, T2, T3> > >
+      : mpl::true_ {};
+
+    template <>
+    struct use_lazy_terminal<qi::domain, testns::tag::ops, 1>
+      : mpl::true_ {};
+
+    template <>
+    struct use_lazy_terminal<qi::domain, testns::tag::ops, 2>
+      : mpl::true_ {};
+
+    template <>
+    struct use_lazy_terminal<qi::domain, testns::tag::ops, 3>
+      : mpl::true_ {};
+
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Parser generators: make_xxx function (objects)
+    ///////////////////////////////////////////////////////////////////////////
+
+    template <typename Modifiers, typename T1>
+    struct make_primitive<
+        terminal_ex<testns::tag::ops, fusion::vector1<T1> >
+      , Modifiers>
+    {
+        typedef testns::ops_1_parser<T1> result_type;
+        template <typename Terminal>
+        result_type operator()(const Terminal& term, unused_type) const
+        {
+            return result_type(
+                fusion::at_c<0>(term.args)
+            );
+        }
+    };
+
+    template <typename Modifiers, typename T1, typename T2>
+    struct make_primitive<
+        terminal_ex<testns::tag::ops, fusion::vector2<T1, T2> >
+      , Modifiers>
+    {
+        typedef testns::ops_2_parser<T1, T2> result_type;
+        template <typename Terminal>
+        result_type operator()(const Terminal& term, unused_type) const
+        {
+            return result_type(
+                fusion::at_c<0>(term.args)
+              , fusion::at_c<1>(term.args)
+            );
+        }
+    };
+
+    template <typename Modifiers, typename T1, typename T2, typename T3>
+    struct make_primitive<
+        terminal_ex<testns::tag::ops, fusion::vector3<T1, T2, T3> >
+      , Modifiers>
+    {
+        typedef testns::ops_3_parser<T1, T2, T3> result_type;
+        template <typename Terminal>
+        result_type operator()(const Terminal& term, unused_type) const
+        {
+            return result_type(
+                fusion::at_c<0>(term.args)
+              , fusion::at_c<1>(term.args)
+              , fusion::at_c<2>(term.args)
+            );
+        }
+    };
+
+}}}
+
+
+namespace testns
+{
+    template <typename T1, typename T>
+    void check_type_1(const T& t)
+    {
+        namespace fusion = boost::fusion;
+        BOOST_STATIC_ASSERT(( boost::is_same<T
+          , typename boost::spirit::terminal<testns::tag::ops>::result<T1>::type >::value ));
+    }
+
+    template <typename T1, typename T2, typename T>
+    void check_type_2(const T& t)
+    {
+        namespace fusion = boost::fusion;
+        BOOST_STATIC_ASSERT(( boost::is_same<T
+          , typename boost::spirit::terminal<testns::tag::ops>::result<T1, T2>::type >::value ));
+    }
+
+    template <typename T1, typename T2, typename T3, typename T>
+    void check_type_3(const T& t)
+    {
+        namespace fusion = boost::fusion;
+        BOOST_STATIC_ASSERT(( boost::is_same<T
+          , typename boost::spirit::terminal<testns::tag::ops>::result<T1, T2, T3>::type >::value ));
+    }
+}
+
+
+int
+main()
+{
+    using spirit_test::test_attr;
+    using spirit_test::test;
+
+    using boost::phoenix::val;
+    using boost::phoenix::actor;
+    using boost::phoenix::value;
+
+    using testns::ops;
+    using testns::check_type_1;
+    using testns::check_type_2;
+    using testns::check_type_3;
+
+    { // immediate args
+        int c = 0;
+#define IP1 ops(2)
+        check_type_1<int>(IP1);
+        BOOST_TEST(test_attr("++/", IP1 >> '/', c) && c == 2);
+
+        c = 0;
+#define IP2 ops(2, 3)
+        check_type_2<int, int>(IP2);
+        BOOST_TEST(test_attr("++---/", IP2 >> '/', c) && c == 5);
+
+        c = 0;
+#define IP3 ops(2, 3, 4)
+        check_type_3<int, int, int>(IP3);
+        BOOST_TEST(!test("++---***/", IP3 >> '/'));
+#define IP4 ops(2, 3, 4)
+        check_type_3<int, int, int>(IP4);
+        BOOST_TEST(test_attr("++---****/", IP4 >> '/', c) && c == 9);
+    }
+
+    { // all lazy args
+        int c = 0;
+#define LP1 ops(val(1))
+        check_type_1<actor<value<int> > >(LP1);
+        BOOST_TEST(test_attr("+/", LP1 >> '/', c) && c == 1);
+
+        c = 0;
+#define LP2 ops(val(1), val(4))
+        check_type_2<actor<value<int> >, actor<value<int> > >(LP2);
+        BOOST_TEST(test_attr("+----/", LP2 >> '/', c) && c == 5);
+
+        c = 0;
+#define LP3 ops(val((char)2), val(3.), val(4))
+        check_type_3<actor<value<char> >, actor<value<double> >, actor<value<int> > >(LP3);
+        BOOST_TEST(!test("++---***/", LP3 >> '/'));
+#define LP4 ops(val(1), val(2), val(3))
+        check_type_3<actor<value<int> >, actor<value<int> >, actor<value<int> > >(LP4);
+        BOOST_TEST(test_attr("+--***/", LP4 >> '/', c) && c == 6);
+    }
+
+    { // mixed immediate and lazy args
+        namespace fusion = boost::fusion;
+        namespace phx = boost::phoenix;
+
+        int c = 0;
+#define MP1 ops(val(3), 2)
+        check_type_2<actor<value<int> >, int>(MP1);
+        BOOST_TEST(test_attr("+++--/", MP1 >> '/', c) && c == 5);
+
+        c = 0;
+#define MP2 ops(4, val(1))
+        check_type_2<int, actor<value<int> > >(MP2);
+        BOOST_TEST(test_attr("++++-/", MP2 >> '/', c) && c == 5);
+
+        c = 0;
+#define MP3 ops(2, val(2), val(2))
+        check_type_3<int, actor<value<int> >, actor<value<int> > >(MP3);
+        BOOST_TEST(!test("++-**/", MP3 >> '/'));
+#define MP4 ops(2, val(2), 2)
+        check_type_3<int, actor<value<int> >, int>(MP4);
+        BOOST_TEST(test_attr("++--**/", MP4 >> '/', c) && c == 6);
+
+        c = 0;
+#define MP5 ops(val(5) - val(3), 2, val(2))
+        check_type_3<actor<phx::composite<phx::minus_eval, fusion::vector<value<int>, value<int> > > >, int, actor<value<int> > >(MP5);
+        BOOST_TEST(test_attr("++--**/", ops(val(5) - val(3), 2, val(2)) >> '/', c) && c == 6);
+    }
+
+    return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/qi/test.hpp
==============================================================================
--- trunk/libs/spirit/test/qi/test.hpp	(original)
+++ trunk/libs/spirit/test/qi/test.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,14 +1,17 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
-#if !defined(BOOST_SPIRIT_TEST_FEB_01_2007_0605PM)
-#define BOOST_SPIRIT_TEST_FEB_01_2007_0605PM
+#if !defined(BOOST_SPIRIT_TEST_FEBRUARY_01_2007_0605PM)
+#define BOOST_SPIRIT_TEST_FEBRUARY_01_2007_0605PM
 
 #include <boost/spirit/include/qi_parse.hpp>
 #include <boost/spirit/include/qi_what.hpp>
+#include <boost/variant/apply_visitor.hpp>
+#include <boost/foreach.hpp>
+#include <iostream>
 
 namespace spirit_test
 {
@@ -67,9 +70,34 @@
         Char const* last = in;
         while (*last)
             last++;
-        return boost::spirit::qi::phrase_parse(in, last, p, attr, s)
+        return boost::spirit::qi::phrase_parse(in, last, p, s, attr)
             && (!full_match || (in == last));
     }
+
+    struct printer
+    {
+        typedef boost::spirit::utf8_string string;
+
+        void element(string const& tag, string const& value, int depth) const
+        {
+            for (int i = 0; i < (depth*4); ++i) // indent to depth
+                std::cout << ' ';
+
+            std::cout << "tag: " << tag;
+            if (value != "")
+                std::cout << ", value: " << value;
+            std::cout << std::endl;
+        }
+    };
+
+    void print_info(boost::spirit::info const& what)
+    {
+        using boost::spirit::basic_info_walker;
+
+        printer pr;
+        basic_info_walker<printer> walker(pr, what.tag, 0);
+        boost::apply_visitor(walker, what.value);
+    }
 }
 
 #endif
Added: trunk/libs/spirit/test/qi/test_attr.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/test_attr.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,123 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_QI_TEST_ATTR_APR_23_2009_0605PM)
+#define BOOST_SPIRIT_QI_TEST_ATTR_APR_23_2009_0605PM
+
+#include <cstring>
+#include <string>
+#include <iterator>
+#include <iostream>
+#include <typeinfo>
+
+#include <boost/spirit/include/qi_parse.hpp>
+#include <boost/spirit/include/qi_what.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 "qi/test_attr.hpp"
+#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define DEFINE_ATTRIBUTE(z, n, _)                                             \
+    BOOST_PP_CAT(A, n) BOOST_PP_CAT(attr, n) = BOOST_PP_CAT(A, n)();
+#define COMPARE_ATTRIBUTE(z, n, _)                                            \
+    BOOST_PP_CAT(attr, n) == BOOST_PP_CAT(val, n) &&
+
+namespace spirit_test
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Parser
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test(Char const *in, Parser const& p
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
+    {
+        namespace qi = boost::spirit::qi;
+
+        // we don't care about the result of the "what" function.
+        // we only care that all parsers have it:
+        qi::what(p);
+
+        Char const* last = in;
+        while (*last)
+            last++;
+
+        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
+        bool result = qi::parse(in, last, p, BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return result && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) in == last;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Parser, typename Skipper
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_skipped(Char const *in, Parser const& p
+      , Skipper const& skipper, BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
+    {
+        namespace qi = boost::spirit::qi;
+
+        // we don't care about the result of the "what" function.
+        // we only care that all parsers have it:
+        qi::what(p);
+
+        Char const* last = in;
+        while (*last)
+            last++;
+
+        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
+        bool result = qi::phrase_parse(in, last, p, skipper
+          , BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return result && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) in == last;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Parser, typename Skipper
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_postskipped(Char const *in, Parser const& p
+      , Skipper const& skipper
+      , BOOST_SCOPED_ENUM(boost::spirit::qi::skip_flag) post_skip
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
+    {
+        namespace qi = boost::spirit::qi;
+
+        // we don't care about the result of the "what" function.
+        // we only care that all parsers have it:
+        qi::what(p);
+
+        Char const* last = in;
+        while (*last)
+            last++;
+
+        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
+        bool result = qi::phrase_parse(in, last, p, skipper, post_skip
+          , BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return result && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) in == last;
+    }
+
+}   // namespace spirit_test
+
+#undef COMPARE_ATTRIBUTE
+#undef DEFINE_ATTRIBUTE
+#undef N
+
+#endif 
Added: trunk/libs/spirit/test/qi/test_manip_attr.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/test_manip_attr.hpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -0,0 +1,101 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_PP_IS_ITERATING)
+
+#if !defined(BOOST_SPIRIT_QI_TEST_MANIP_ATTR_APR_23_2009_0605PM)
+#define BOOST_SPIRIT_QI_TEST_MANIP_ATTR_APR_23_2009_0605PM
+
+#include <cstring>
+#include <string>
+#include <iterator>
+#include <iostream>
+#include <typeinfo>
+
+#include <boost/spirit/include/qi_parse.hpp>
+#include <boost/spirit/include/qi_stream.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+#define BOOST_PP_FILENAME_1 "qi/test_manip_attr.hpp"
+#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+#define DEFINE_ATTRIBUTE(z, n, _)                                             \
+    BOOST_PP_CAT(A, n) BOOST_PP_CAT(attr, n) = BOOST_PP_CAT(A, n)();
+#define COMPARE_ATTRIBUTE(z, n, _)                                            \
+    BOOST_PP_CAT(attr, n) == BOOST_PP_CAT(val, n) &&
+
+namespace spirit_test
+{
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Parser
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test(Char const *in, Parser const& p
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
+    {
+        namespace qi = boost::spirit::qi;
+
+        std::basic_stringstream<Char> strm(in);
+        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
+        strm >> qi::match(p, BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return strm.eof() && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) true;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Parser, typename Skipper
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_skipped(Char const *in, Parser const& p
+      , Skipper const& skipper, BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
+    {
+        namespace qi = boost::spirit::qi;
+
+        std::basic_stringstream<Char> strm(in);
+        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
+        strm >> qi::phrase_match(p, skipper, BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return strm.eof() && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) true;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Parser, typename Skipper
+      , BOOST_PP_ENUM_PARAMS(N, typename A)>
+    inline bool test_postskipped(Char const *in, Parser const& p
+      , Skipper const& skipper
+      , BOOST_SCOPED_ENUM(boost::spirit::qi::skip_flag) post_skip
+      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
+    {
+        namespace qi = boost::spirit::qi;
+
+        std::basic_stringstream<Char> strm(in);
+        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
+        strm >> qi::phrase_match(p, skipper, post_skip
+          , BOOST_PP_ENUM_PARAMS(N, attr));
+
+        return strm.eof() && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) true;
+    }
+
+}   // namespace spirit_test
+
+#undef COMPARE_ATTRIBUTE
+#undef DEFINE_ATTRIBUTE
+#undef N
+
+#endif 
Modified: trunk/libs/spirit/test/qi/tst.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/tst.cpp	(original)
+++ trunk/libs/spirit/test/qi/tst.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,5 +1,5 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
+    Copyright (c) 2001-2009 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -341,10 +341,10 @@
     }
 }
 
-int
-main()
+int main()
 {
-    using namespace boost::spirit::qi;
+    using boost::spirit::qi::tst;
+    using boost::spirit::qi::tst_map;
 
     tests<tst<char, int>, tst<wchar_t, int> >();
     tests<tst_map<char, int>, tst_map<wchar_t, int> >();
Modified: trunk/libs/spirit/test/qi/uint.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/uint.cpp	(original)
+++ trunk/libs/spirit/test/qi/uint.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
@@ -1,6 +1,6 @@
 /*=============================================================================
-    Copyright (c) 2001-2007 Joel de Guzman
-    Copyright (c) 2001-2007 Hartmut Kaiser
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -15,6 +15,7 @@
 #include <boost/spirit/include/phoenix_operator.hpp>
 
 #include "test.hpp"
+#include <cstring>
 
 ///////////////////////////////////////////////////////////////////////////////
 //
@@ -40,32 +41,32 @@
 int
 main()
 {
-    using namespace spirit_test;
-
+    using spirit_test::test;
+    using spirit_test::test_attr;
     ///////////////////////////////////////////////////////////////////////////
     //  unsigned tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::uint;
+        using boost::spirit::qi::uint_;
         unsigned u;
 
-        BOOST_TEST(test("123456", uint));
-        BOOST_TEST(test_attr("123456", uint, u));
+        BOOST_TEST(test("123456", uint_));
+        BOOST_TEST(test_attr("123456", uint_, u));
         BOOST_TEST(u == 123456);
 
-        BOOST_TEST(test(max_unsigned, uint));
-        BOOST_TEST(test_attr(max_unsigned, uint, u));
+        BOOST_TEST(test(max_unsigned, uint_));
+        BOOST_TEST(test_attr(max_unsigned, uint_, u));
         BOOST_TEST(u == UINT_MAX);
 
-        BOOST_TEST(!test(unsigned_overflow, uint));
-        BOOST_TEST(!test_attr(unsigned_overflow, uint, u));
+        BOOST_TEST(!test(unsigned_overflow, uint_));
+        BOOST_TEST(!test_attr(unsigned_overflow, uint_, u));
     }
 
     ///////////////////////////////////////////////////////////////////////////
     //  binary tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::bin;
+        using boost::spirit::qi::bin;
         unsigned u;
 
         BOOST_TEST(test("11111110", bin));
@@ -84,7 +85,7 @@
     //  octal tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::oct;
+        using boost::spirit::qi::oct;
         unsigned u;
 
         BOOST_TEST(test("12545674515", oct));
@@ -103,7 +104,7 @@
     //  hex tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::hex;
+        using boost::spirit::qi::hex;
         unsigned u;
 
         BOOST_TEST(test("95BC8DF", hex));
@@ -127,29 +128,41 @@
     ///////////////////////////////////////////////////////////////////////////
     {
         unsigned u;
-        using boost::spirit::qi::uint_spec;
+        using boost::spirit::qi::uint_parser;
 
-        uint_spec<unsigned, 10, 1, 3> uint3;
+        uint_parser<unsigned, 10, 1, 3> uint3;
         BOOST_TEST(test("123456", uint3, false));
         BOOST_TEST(test_attr("123456", uint3, u, false));
         BOOST_TEST(u == 123);
 
-        uint_spec<unsigned, 10, 2, 4> uint4;
+        uint_parser<unsigned, 10, 2, 4> uint4;
         BOOST_TEST(test("123456", uint4, false));
         BOOST_TEST(test_attr("123456", uint4, u, false));
         BOOST_TEST(u == 1234);
 
+        char const * first = "0000000";
+        char const * last  = first + std::strlen(first);
+        uint_parser<unsigned, 10, 4, 4> uint_exact4;
+        BOOST_TEST(boost::spirit::qi::parse(first, last, uint_exact4, u)
+            && first != last && (last-first == 3) && u == 0);
+
+        first = "0001400";
+        last  = first + std::strlen(first);
+        BOOST_TEST(boost::spirit::qi::parse(first, last, uint_exact4, u)
+            && first != last && (last-first == 3) && u == 1);
+
         BOOST_TEST(!test("1", uint4));
         BOOST_TEST(!test_attr("1", uint4, u));
+        BOOST_TEST(test_attr("014567", uint4, u, false) && u == 145);
     }
 
     ///////////////////////////////////////////////////////////////////////////
-    //  uint_spec<unused_type> tests
+    //  uint_parser<unused_type> tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using boost::spirit::qi::uint_spec;
-        using boost::spirit::unused_type;
-        uint_spec<unused_type> any_int;
+        using boost::spirit::qi::uint_parser;
+        using boost::spirit::qi::unused_type;
+        uint_parser<unused_type> any_int;
 
         BOOST_TEST(test("123456", any_int));
         BOOST_TEST(test("1234567890123456789", any_int));
@@ -159,15 +172,15 @@
     //  action tests
     ///////////////////////////////////////////////////////////////////////////
     {
-        using namespace boost::phoenix;
-        using boost::spirit::arg_names::_1;
+        using boost::phoenix::ref;
+        using boost::spirit::qi::_1;
+        using boost::spirit::qi::uint_;
         using boost::spirit::ascii::space;
-        using boost::spirit::uint;
         int n;
 
-        BOOST_TEST(test("123", uint[ref(n) = _1]));
+        BOOST_TEST(test("123", uint_[ref(n) = _1]));
         BOOST_TEST(n == 123);
-        BOOST_TEST(test("   456", uint[ref(n) = _1], space));
+        BOOST_TEST(test("   456", uint_[ref(n) = _1], space));
         BOOST_TEST(n == 456);
     }
 
Deleted: trunk/libs/spirit/test/support/hold_any.cpp
==============================================================================
--- trunk/libs/spirit/test/support/hold_any.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,201 +0,0 @@
-//  Copyright (c) 2007-2009 Hartmut Kaiser
-//  Copyright (c) Christopher Diggins 2005 
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// #define BOOST_SPIRIT_ANY_IMPLICIT_CASTING
-
-#include <cassert>
-#include <stdexcept>
-#include <typeinfo>
-#include <iostream>
-#include <vector>
-#include <complex>
-#include <string>
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/home/support/detail/hold_any.hpp>
-
-using namespace std; 
-using namespace boost::spirit;
-
-///////////////////////////////////////////////////////////////////////////////
-bool output_any (hold_any const& a, std::string expected) 
-{
-    std::ostringstream o;
-    if (a.type() == typeid(int)) 
-    {
-        o << any_cast<int>(a);
-    }
-    else if (a.type() == typeid(char)) 
-    {
-        o << any_cast<char>(a);
-    }
-    else if (a.type() == typeid(double)) 
-    {
-        o << any_cast<double>(a);
-    }
-    else if (a.type() == typeid(std::complex<int>)) 
-    {
-        o << any_cast<std::complex<int> >(a);
-    }
-    else 
-    {
-        o << "unexpected type: " << a.type().name();
-        return false;
-    }
-    return o.str() == expected;
-}
-
-template <typename T>
-bool output_any_direct (T const& v, std::string expected) 
-{
-    std::ostringstream o;
-    o << v;
-    return o.str() == expected;
-}
-
-void simple_any_test() 
-{
-    BOOST_TEST(output_any(42, "42"));
-    BOOST_TEST(output_any('q', "q"));
-    BOOST_TEST(output_any(3.14, "3.14"));
-    BOOST_TEST(output_any(std::complex<int>(1, 2), "(1,2)"));
-
-    int n = 42; BOOST_TEST(output_any(n, "42"));
-    char c = 'q'; BOOST_TEST(output_any(c, "q"));
-    double d = 3.14; BOOST_TEST(output_any(d, "3.14"));
-    std::complex<int> x(1, 2); BOOST_TEST(output_any(x, "(1,2)"));
-  
-    hold_any a;
-    BOOST_TEST(output_any(a = n, "42"));
-    BOOST_TEST(output_any(a = c, "q"));
-    BOOST_TEST(output_any(a = d, "3.14"));  
-    BOOST_TEST(output_any(a = x, "(1,2)"));
-    BOOST_TEST(output_any(a = 13, "13"));
-
-#ifdef BOOST_SPIRIT_ANY_IMPLICIT_CASTING
-    BOOST_TEST(output_any_direct(n = hold_any(42), "42"));
-    BOOST_TEST(output_any_direct(c = hold_any('q'), "q"));
-    BOOST_TEST(output_any_direct(d = hold_any(3.14), "3.14"));  
-    BOOST_TEST(output_any_direct(x = std::complex<int>(hold_any(std::complex<int>(1, 2))), "(1,2)"));
-#endif
-  
-    BOOST_TEST(output_any_direct(hold_any(42), "42"));
-    BOOST_TEST(output_any_direct(hold_any('q'), "q"));
-    BOOST_TEST(output_any_direct(hold_any(3.14), "3.14"));  
-    BOOST_TEST(output_any_direct(hold_any(std::complex<int>(1, 2)), "(1,2)"));
-
-    BOOST_TEST(!a.empty());
-    a = 0;
-    BOOST_TEST(!a.empty());
-    a.reset();
-    BOOST_TEST(a.empty());
-  
-    try {
-        any_cast<int>(a);
-        BOOST_TEST(false);
-    }
-    catch (boost::spirit::bad_any_cast const&) {
-        BOOST_TEST(true);
-    }
-    catch (...) {
-        BOOST_TEST(false);
-    }
-}
-
-void test2(hold_any const& x, hold_any const& y)
-{
-    BOOST_TEST(x.type() != y.type());
-    BOOST_TEST(x.type().name() != y.type().name());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-int state; 
-
-///////////////////////////////////////////////////////////////////////////////
-struct small_object 
-{
-    small_object() {}
-    small_object(small_object const&) { state = 1; }
-    ~small_object() { state = 2; }
-};
-
-inline std::istream& 
-operator>> (std::istream& i, small_object&)
-{
-    return i;
-}
-
-inline std::ostream& 
-operator<< (std::ostream& o, small_object const&)
-{
-    return o;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-struct large_object 
-{
-    large_object() {}
-    large_object(large_object const&) { state = 3; }
-    ~large_object() { state = 4; }
-    
-    int data0;
-    int data1; 
-    int data2; 
-    int data3;
-};
-
-inline std::istream& 
-operator>> (std::istream& i, large_object&)
-{
-    return i;
-}
-
-inline std::ostream& 
-operator<< (std::ostream& o, large_object const&)
-{
-    return o;
-}
-
-void constructor_test() 
-{
-    small_object lfb;  
-    large_object bfb;  
-    hold_any a;
-    state = 0;
-    
-    a = lfb;  BOOST_TEST(1 == state); state = 0;
-    a = 42;   BOOST_TEST(2 == state); state = 0;
-    a = bfb;  BOOST_TEST(3 == state); state = 0;
-    a = 42;   BOOST_TEST(4 == state); state = 0;
-
-    // test assignment of large objects
-    a = bfb;
-    a = bfb;
-}
-
-int main()
-{  
-    test2(std::string("10"), std::complex<double>(20));
-
-    constructor_test();  
-    simple_any_test();
-
-    hold_any non_const(10);
-    BOOST_TEST(any_cast<int>(non_const) == 10);
-    *any_cast<int>(&non_const) = 15;
-    BOOST_TEST(any_cast<int>(non_const) == 15);
-
-    hold_any const const_(10);
-    BOOST_TEST(any_cast<int>(const_) == *any_cast<int>(&const_));
-
-    hold_any a = 42, b = 'q';
-    swap(a, b);
-    BOOST_TEST(any_cast<int>(b) == 42);
-    BOOST_TEST(any_cast<char>(a) == 'q');
-  
-    return boost::report_errors();
-}
-
Deleted: trunk/libs/spirit/test/support/multi_pass.cpp
==============================================================================
--- trunk/libs/spirit/test/support/multi_pass.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,770 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2001-2003 Daniel Nuffer
-    Copyright (c) 2001-2008 Hartmut Kaiser
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-
-#include <boost/spirit/support/iterators/detail/buf_id_check_policy.hpp>
-#include <boost/spirit/support/iterators/detail/ref_counted_policy.hpp>
-#include <boost/spirit/support/iterators/detail/functor_input_policy.hpp>
-#include <boost/spirit/include/support_multi_pass.hpp>
-#include <boost/spirit/support/iterators/look_ahead.hpp>
-
-#include <boost/scoped_ptr.hpp>
-#include <iterator>
-#include <string>
-#include <boost/detail/lightweight_test.hpp>
-#include "detail/sstream.hpp"
-
-using namespace std;
-using namespace boost::spirit;
-
-sstream_t res;
-
-typedef boost::spirit::multi_pass<istream_iterator<char> > default_multi_pass_t;
-
-typedef look_ahead<istream_iterator<char>, 6> fixed_multi_pass_t;
-
-typedef multi_pass<
-    istream_iterator<char>,
-    multi_pass_policies::input_iterator,
-    multi_pass_policies::first_owner,
-    multi_pass_policies::buf_id_check,
-    multi_pass_policies::std_deque
-> first_owner_multi_pass_t;
-
-
-// a functor to test out the functor_multi_pass
-class my_functor
-{
-    public:
-        typedef char result_type;
-        my_functor()
-            : c('A')
-        {}
-
-        char operator()()
-        {
-            if (c == 'M')
-                return eof;
-            else
-                return c++;
-        }
-
-        static result_type eof;
-    private:
-        char c;
-};
-
-my_functor::result_type my_functor::eof = '\0';
-
-typedef multi_pass<
-    my_functor,
-    multi_pass_policies::functor_input,
-    multi_pass_policies::first_owner,
-    multi_pass_policies::no_check,
-    multi_pass_policies::std_deque
-> functor_multi_pass_t;
-
-void test_default_multi_pass()
-{
-    res << "-*= test_default_multi_pass =*-\n";
-    istream_iterator<char> end;
-    boost::scoped_ptr<default_multi_pass_t> mpend(new default_multi_pass_t(end));
-
-    {
-        sstream_t ss;
-        ss << "test string";
-
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
-
-        while (*mp1 != *mpend)
-        {
-            res << *((*mp1)++);
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(b));
-        boost::scoped_ptr<default_multi_pass_t> mp3(new default_multi_pass_t(b));
-        *mp3 = *mp2;
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp3.reset();
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
-        boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(*mp1));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        while (*mp1 != *mpend)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(b));
-        boost::scoped_ptr<default_multi_pass_t> mp3(new default_multi_pass_t(b));
-        *mp3 = *mp2;
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp3.reset();
-        ++*mp2;
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
-        boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(*mp1));
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        BOOST_TEST(*mp1 != *mp2);
-        BOOST_TEST(*mp1 > *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp2 < *mp1);
-        BOOST_TEST(*mp2 <= *mp1);
-        while (*mp2 != *mp1)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        while (*mp1 != *mpend)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        BOOST_TEST(*mp1 != *mp2);
-        BOOST_TEST(*mp1 > *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp2 < *mp1);
-        BOOST_TEST(*mp2 <= *mp1);
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
-        boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(a));
-        BOOST_TEST(*mp1 != *mp2);
-        ++*mp1;
-        BOOST_TEST(*mp1 != *mp2);
-
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(b));
-        boost::scoped_ptr<default_multi_pass_t> mp3(new default_multi_pass_t(b));
-        *mp3 = *mp2;
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp2->clear_queue();
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        try
-        {
-            res << **mp3; // this should throw illegal_backtracking
-            BOOST_TEST(0);
-        }
-        catch (const boost::spirit::multi_pass_policies::illegal_backtracking& /*e*/)
-        {
-        }
-        res << endl;
-    }
-
-
-}
-
-void test_fixed_multi_pass()
-{
-    res << "-*= test_fixed_multi_pass =*-\n";
-    istream_iterator<char> end;
-    boost::scoped_ptr<fixed_multi_pass_t> mpend(new fixed_multi_pass_t(end));
-
-    {
-        sstream_t ss;
-        ss << "test string";
-
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
-
-        while (*mp1 != *mpend)
-        {
-            res << *((*mp1)++);
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(b));
-        boost::scoped_ptr<fixed_multi_pass_t> mp3(new fixed_multi_pass_t(*mp2));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp3.reset();
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
-        boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(*mp1));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        while (*mp1 != *mpend)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(b));
-        boost::scoped_ptr<fixed_multi_pass_t> mp3(new fixed_multi_pass_t(*mp2));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp3.reset();
-        ++*mp2;
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
-        boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(*mp1));
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        BOOST_TEST(*mp1 != *mp2);
-        BOOST_TEST(*mp1 > *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp2 < *mp1);
-        BOOST_TEST(*mp2 <= *mp1);
-        while (*mp2 != *mp1)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        while (*mp1 != *mpend)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        BOOST_TEST(*mp1 != *mp2);
-        BOOST_TEST(*mp1 > *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp2 < *mp1);
-        BOOST_TEST(*mp2 <= *mp1);
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
-        boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(a));
-        BOOST_TEST(*mp1 != *mp2);
-        ++*mp1;
-        BOOST_TEST(*mp1 != *mp2);
-
-    }
-
-}
-
-void test_first_owner_multi_pass()
-{
-    res << "-*= test_first_owner_multi_pass =*-\n";
-    istream_iterator<char> end;
-    boost::scoped_ptr<first_owner_multi_pass_t> mpend(new first_owner_multi_pass_t(end));
-
-    {
-        sstream_t ss;
-        ss << "test string";
-
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
-
-        while (*mp1 != *mpend)
-        {
-            res << *((*mp1)++);
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(b));
-        boost::scoped_ptr<first_owner_multi_pass_t> mp3(new first_owner_multi_pass_t(*mp2));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp3.reset();
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
-        boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(*mp1));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        while (*mp1 != *mpend)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(b));
-        boost::scoped_ptr<first_owner_multi_pass_t> mp3(new first_owner_multi_pass_t(*mp2));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp3.reset();
-        ++*mp2;
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
-        boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(*mp1));
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        BOOST_TEST(*mp1 != *mp2);
-        BOOST_TEST(*mp1 > *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp2 < *mp1);
-        BOOST_TEST(*mp2 <= *mp1);
-        while (*mp2 != *mp1)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        while (*mp1 != *mpend)
-        {
-            res << **mp1;
-            ++*mp1;
-        }
-
-        BOOST_TEST(*mp1 != *mp2);
-        BOOST_TEST(*mp1 > *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp2 < *mp1);
-        BOOST_TEST(*mp2 <= *mp1);
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        BOOST_TEST(*mp1 == *mp2);
-        BOOST_TEST(*mp1 >= *mp2);
-        BOOST_TEST(*mp1 <= *mp2);
-        res << endl;
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> a(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
-        boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(a));
-        BOOST_TEST(*mp1 != *mp2);
-        ++*mp1;
-        BOOST_TEST(*mp1 != *mp2);
-
-    }
-
-    {
-        sstream_t ss;
-        ss << "test string";
-        istream_iterator<char> b(ss);
-        boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(b));
-        boost::scoped_ptr<first_owner_multi_pass_t> mp3(new first_owner_multi_pass_t(*mp2));
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        mp2->clear_queue();
-
-        while (*mp2 != *mpend)
-        {
-            res << **mp2;
-            ++*mp2;
-        }
-
-        try
-        {
-            res << **mp3; // this should throw illegal_backtracking
-            BOOST_TEST(0);
-        }
-        catch (const boost::spirit::multi_pass_policies::illegal_backtracking& /*e*/)
-        {
-        }
-        res << endl;
-    }
-
-}
-
-
-void test_functor_multi_pass()
-{
-    res << "-*= test_functor_multi_pass =*-\n";
-    functor_multi_pass_t mpend;
-
-    {
-        functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
-
-        while (mp1 != mpend)
-        {
-            res << *(mp1++);
-        }
-
-        res << endl;
-    }
-
-    {
-        functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
-        functor_multi_pass_t mp2 = functor_multi_pass_t(mp1);
-
-        for (int i = 0; i < 4; ++i)
-        {
-            res << *mp1;
-            ++mp1;
-        }
-
-        while (mp2 != mpend)
-        {
-            res << *mp2;
-            ++mp2;
-        }
-
-        while (mp1 != mpend)
-        {
-            res << *mp1;
-            ++mp1;
-        }
-
-        res << endl;
-    }
-
-    {
-        functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
-        functor_multi_pass_t mp2 = functor_multi_pass_t(mp1);
-
-        BOOST_TEST(mp1 == mp2);
-        BOOST_TEST(mp1 >= mp2);
-        BOOST_TEST(mp1 <= mp2);
-        for (int i = 0; i < 4; ++i)
-        {
-            res << *mp1;
-            ++mp1;
-        }
-
-        BOOST_TEST(mp1 != mp2);
-        BOOST_TEST(mp1 > mp2);
-        BOOST_TEST(mp1 >= mp2);
-        BOOST_TEST(mp2 < mp1);
-        BOOST_TEST(mp2 <= mp1);
-        while (mp2 != mp1)
-        {
-            res << *mp2;
-            ++mp2;
-        }
-
-        BOOST_TEST(mp1 == mp2);
-        BOOST_TEST(mp1 >= mp2);
-        BOOST_TEST(mp1 <= mp2);
-        while (mp1 != mpend)
-        {
-            res << *mp1;
-            ++mp1;
-        }
-
-        BOOST_TEST(mp1 != mp2);
-        BOOST_TEST(mp1 > mp2);
-        BOOST_TEST(mp1 >= mp2);
-        BOOST_TEST(mp2 < mp1);
-        BOOST_TEST(mp2 <= mp1);
-        while (mp2 != mpend)
-        {
-            res << *mp2;
-            ++mp2;
-        }
-
-        BOOST_TEST(mp1 == mp2);
-        BOOST_TEST(mp1 >= mp2);
-        BOOST_TEST(mp1 <= mp2);
-        res << endl;
-    }
-
-    {
-        functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
-        functor_multi_pass_t mp2 = functor_multi_pass_t(my_functor());
-        BOOST_TEST(mp1 != mp2);
-        ++mp1;
-        BOOST_TEST(mp1 != mp2);
-
-    }
-}
-
-int main(int, char**)
-{
-
-    test_default_multi_pass();
-    test_fixed_multi_pass();
-    test_first_owner_multi_pass();
-    test_functor_multi_pass();
-
-    BOOST_TEST(getstring(res) == "-*= test_default_multi_pass =*-\n"
-            "teststring\n"
-            "teststring\n"
-            "testteststringstring\n"
-            "testtring\n"
-            "testteststringstring\n"
-            "teststring\n"
-            "-*= test_fixed_multi_pass =*-\n"
-            "teststring\n"
-            "teststring\n"
-            "testteststringstring\n"
-            "testtring\n"
-            "testteststringstring\n"
-            "-*= test_first_owner_multi_pass =*-\n"
-            "teststring\n"
-            "teststring\n"
-            "testteststringstring\n"
-            "testtring\n"
-            "testteststringstring\n"
-            "teststring\n"
-            "-*= test_functor_multi_pass =*-\n"
-            "ABCDEFGHIJKL\n"
-            "ABCDABCDEFGHIJKLEFGHIJKL\n"
-            "ABCDABCDEFGHIJKLEFGHIJKL\n");
-
-    return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/support/multi_pass_compile.cpp
==============================================================================
--- trunk/libs/spirit/test/support/multi_pass_compile.cpp	2009-04-26 10:46:34 EDT (Sun, 26 Apr 2009)
+++ (empty file)
@@ -1,63 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2004-2008 Hartmut Kaiser
-
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
-    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-=============================================================================*/
-
-//  This is a compile only test for verifying, whether the multi_pass<>
-//  iterator works ok with an input iterator, which returns a value_type and not
-//  a reference from its dereferencing operator.
-
-#include <cstdio>
-#include <fstream>
-#include <iterator>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_nonterminal.hpp>
-#include <boost/spirit/include/qi_parse.hpp>
-#include <boost/spirit/include/support_multi_pass.hpp>
-
-#if defined(BOOST_HAS_UNISTD_H)
-#include <unistd.h>    // unlink()
-#endif
-
-#if defined(__MINGW32__)
-#include <io.h>    // unlink()
-#endif
-
-using namespace boost::spirit;
-using namespace boost::spirit::qi;
-using namespace std;
-
-int main ()
-{
-    // create a sample file
-    {
-        ofstream out("./input_file.txt");
-        out << 1.0 << "," << 2.0;
-    }
-
-    // read in the values from the sample file
-    {
-        ifstream in("./input_file.txt"); // we get our input from this file
-
-        typedef multi_pass<istreambuf_iterator<char> > iterator_type;
-
-        iterator_type first(make_multi_pass(istreambuf_iterator<char>(in)));
-        iterator_type last(make_multi_pass(istreambuf_iterator<char>()));
-
-        rule<iterator_type> n_list; 
-        n_list = double_ >> *(char_(',') >> double_);
-        BOOST_TEST(parse(first, last, n_list));
-    }
-
-#if !defined(__COMO_VERSION__)
-    unlink("./input_file.txt");
-#endif
-
-    return boost::report_errors();
-}