$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r61679 - in trunk/libs/spirit/example/scheme: example/generate_qiexpr output qi
From: hartmut.kaiser_at_[hidden]
Date: 2010-04-29 12:18:10
Author: hkaiser
Date: 2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
New Revision: 61679
URL: http://svn.boost.org/trac/boost/changeset/61679
Log:
Spirit: Qi generator fully functional now
Text files modified: 
   trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qi_test.cpp          |    10 ++--                                    
   trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qiexpr.cpp           |     1                                         
   trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_sexpr_to_ostream.cpp |     1                                         
   trunk/libs/spirit/example/scheme/output/utree_traits.hpp                               |    94 ++++++++++++++++++++++++++++----------- 
   trunk/libs/spirit/example/scheme/qi/generate_qiexpr.hpp                                |     3 +                                       
   trunk/libs/spirit/example/scheme/qi/generate_qiexpr_impl.hpp                           |    12 +++++                                   
   trunk/libs/spirit/example/scheme/qi/qiexpr_generator.hpp                               |    41 ++++++++++++++---                       
   7 files changed, 121 insertions(+), 41 deletions(-)
Modified: trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qi_test.cpp
==============================================================================
--- trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qi_test.cpp	(original)
+++ trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qi_test.cpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -24,8 +24,8 @@
 {
     if (scheme::input::parse_qi_expr(str, result))
     {
-//         std::string scheme_str;
-//         scheme::output::generate_sexpr(scheme_str, result);
+        std::string scheme_str;
+        scheme::output::generate_sexpr(scheme_str, result);
 
         std::string strout;
         if (scheme::output::generate_qi_expr(result, strout))
@@ -72,10 +72,10 @@
     if (scheme::input::parse_qi_grammar(str, result))
     {
         std::string scheme_str;
-        scheme::output::generate_sexpr(scheme_str, result);
+        scheme::output::generate_sexpr_list(scheme_str, result);
 
         std::string strout;
-        if (scheme::output::generate_qi_expr(result, strout))
+        if (scheme::output::generate_qi_expr_list(result, strout))
         {
             std::cout << strout << std::endl;
             return true;
@@ -115,7 +115,7 @@
     }
 
     // now test grammar rule
-//     BOOST_TEST(test_grammar(rules));
+    BOOST_TEST(test_grammar(rules));
 
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qiexpr.cpp
==============================================================================
--- trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qiexpr.cpp	(original)
+++ trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_qiexpr.cpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -14,6 +14,7 @@
 namespace scheme { namespace output
 {
     template bool generate_qi_expr(utree& u, std::string& str);
+    template bool generate_qi_expr_list(utree& u, std::string& str);
 }}
 
 namespace scheme
Modified: trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_sexpr_to_ostream.cpp
==============================================================================
--- trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_sexpr_to_ostream.cpp	(original)
+++ trunk/libs/spirit/example/scheme/example/generate_qiexpr/generate_sexpr_to_ostream.cpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -14,6 +14,7 @@
 {
     template bool generate_sexpr(BOOST_TYPEOF(std::cout)&, utree const& result);
     template bool generate_sexpr(std::string& str, utree const& result);
+    template bool generate_sexpr_list(std::string& str, utree const& result);
 }}
 
 #if defined(SCHEME_USE_SPIRIT_IO)
Modified: trunk/libs/spirit/example/scheme/output/utree_traits.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/output/utree_traits.hpp	(original)
+++ trunk/libs/spirit/example/scheme/output/utree_traits.hpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -11,7 +11,6 @@
 #include <string>
 
 #include <boost/cstdint.hpp>
-#include <boost/mpl/bool.hpp>
 #include <boost/spirit/include/karma.hpp>
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -42,9 +41,11 @@
       : mpl::true_
     {
         typedef iterator_range<scheme::utree::iterator> compatible_type;
-        typedef mpl::int_<scheme::utree_type::list_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::list_type; 
+        }
     };
 
     template <>
@@ -53,9 +54,11 @@
       : mpl::true_
     {
         typedef iterator_range<scheme::utree::const_iterator> compatible_type;
-        typedef mpl::int_<scheme::utree_type::list_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::list_type; 
+        }
     };
 
     template <>
@@ -63,9 +66,11 @@
       : mpl::true_
     {
         typedef scheme::nil compatible_type;
-        typedef mpl::int_<scheme::utree_type::nil_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::nil_type; 
+        }
     };
 
     template <>
@@ -73,9 +78,11 @@
       : mpl::true_
     {
         typedef bool compatible_type;
-        typedef mpl::int_<scheme::utree_type::bool_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::bool_type; 
+        }
     };
 
     template <>
@@ -83,9 +90,11 @@
       : mpl::true_
     {
         typedef int compatible_type;
-        typedef mpl::int_<scheme::utree_type::int_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::int_type; 
+        }
     };
 
     template <>
@@ -93,9 +102,11 @@
       : mpl::true_
     {
         typedef double compatible_type;
-        typedef mpl::int_<scheme::utree_type::double_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::double_type; 
+        }
     };
 
     template <>
@@ -104,9 +115,11 @@
       : mpl::true_
     {
         typedef scheme::utf8_string_range compatible_type;
-        typedef mpl::int_<scheme::utree_type::string_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::string_type; 
+        }
     };
 
     template <>
@@ -115,9 +128,11 @@
       : mpl::true_
     {
         typedef scheme::utf8_string compatible_type;
-        typedef mpl::int_<scheme::utree_type::string_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::string_type; 
+        }
     };
 
     template <>
@@ -126,9 +141,11 @@
       : mpl::true_
     {
         typedef scheme::utf8_symbol_range compatible_type;
-        typedef mpl::int_<scheme::utree_type::symbol_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::symbol_type; 
+        }
     };
 
     template <>
@@ -137,9 +154,11 @@
       : mpl::true_
     {
         typedef scheme::utf8_symbol compatible_type;
-        typedef mpl::int_<scheme::utree_type::symbol_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::symbol_type; 
+        }
     };
 
     template <>
@@ -148,9 +167,11 @@
       : mpl::true_
     {
         typedef scheme::binary_range compatible_type;
-        typedef mpl::int_<scheme::utree_type::binary_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::binary_type; 
+        }
     };
 
     template <>
@@ -159,9 +180,11 @@
       : mpl::true_
     {
         typedef scheme::binary_string compatible_type;
-        typedef mpl::int_<scheme::utree_type::binary_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::binary_type; 
+        }
     };
 
     template <>
@@ -169,7 +192,20 @@
       : mpl::true_
     {
         typedef scheme::utree compatible_type;
-        typedef mpl::int_<scheme::utree_type::reference_type> distance;
+
+        static bool is_compatible(int d) 
+        { 
+            return d >= scheme::utree_type::nil_type &&
+                   d <= scheme::utree_type::reference_type; 
+        }
+    };
+
+    template <>
+    struct compute_compatible_component_variant<
+            scheme::utree, std::vector<scheme::utree> >
+      : mpl::true_
+    {
+        typedef scheme::utree compatible_type;
 
         static bool is_compatible(int d) 
         { 
@@ -185,9 +221,11 @@
       : mpl::true_
     {
         typedef iterator_range<scheme::utree::const_iterator> compatible_type;
-        typedef mpl::int_<scheme::utree_type::list_type> distance;
 
-        static bool is_compatible(int d) { return d == distance::value; }
+        static bool is_compatible(int d) 
+        { 
+            return d == scheme::utree_type::list_type; 
+        }
     };
 
     ///////////////////////////////////////////////////////////////////////////
Modified: trunk/libs/spirit/example/scheme/qi/generate_qiexpr.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/qi/generate_qiexpr.hpp	(original)
+++ trunk/libs/spirit/example/scheme/qi/generate_qiexpr.hpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -12,6 +12,9 @@
 {
     template <typename String>
     bool generate_qi_expr(utree& result, String& str);
+
+    template <typename String>
+    bool generate_qi_expr_list(utree& result, String& str);
 }}
 
 #endif
Modified: trunk/libs/spirit/example/scheme/qi/generate_qiexpr_impl.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/qi/generate_qiexpr_impl.hpp	(original)
+++ trunk/libs/spirit/example/scheme/qi/generate_qiexpr_impl.hpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -25,6 +25,18 @@
         scheme::qi::qiexpr_generator<output_iterator_type> g;
         return generate_delimited(output_iterator_type(str), g, space, u);
     }
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename String>
+    bool generate_qi_expr_list(utree& u, String& str)
+    {
+        using boost::spirit::karma::space;
+
+        typedef std::back_insert_iterator<String> output_iterator_type;
+
+        scheme::qi::qiexpr_generator<output_iterator_type> g;
+        return generate_delimited(output_iterator_type(str), g.grammar_, space, u);
+    }
 }}
 
 #endif
Modified: trunk/libs/spirit/example/scheme/qi/qiexpr_generator.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/qi/qiexpr_generator.hpp	(original)
+++ trunk/libs/spirit/example/scheme/qi/qiexpr_generator.hpp	2010-04-29 12:18:09 EDT (Thu, 29 Apr 2010)
@@ -33,6 +33,26 @@
     using boost::spirit::karma::symbols;
 
     ///////////////////////////////////////////////////////////////////////////
+    namespace traits
+    {
+        template <typename Count>
+        struct deref_spec 
+          : boost::spirit::result_of::terminal<boost::spirit::tag::repeat(Count)>
+        {};
+    };
+
+    template <typename Count>
+    inline typename traits::deref_spec<Count>::type
+    deref_spec(Count const& count)
+    {
+        using boost::spirit::karma::repeat;
+        return repeat(count);
+    }
+
+    typedef traits::deref_spec<int>::type deref_tag_type;
+    deref_tag_type const deref = deref_spec(1);
+
+    ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator>
     struct qiexpr_generator : grammar<OutputIterator, space_type, utree()>
     {
@@ -43,20 +63,23 @@
             using boost::spirit::karma::eps;
             using boost::spirit::karma::ascii::string;
             using boost::spirit::karma::omit;
-            using boost::spirit::karma::repeat;
             using boost::spirit::karma::_r1;
             using boost::spirit::karma::strict;
             using boost::spirit::karma::eol;
 
             start = 
                     nil 
-                |   rule_ % eol
                 |   rule_
                 ;
 
+            grammar_ =
+                    nil 
+                |   rule_ % eol
+                ;
+
             rule_ =
                     &symbol(std::string("define")) 
-                        << repeat(1)[rule_name] << '=' << repeat(1)[alternative]
+                        << deref[rule_name] << '=' << deref[alternative]
                 |   alternative
                 ;
 
@@ -79,18 +102,18 @@
                 ;
 
             term = strict[
-                        unary << '(' << repeat(1)[alternative] << ')'
+                        unary << '(' << deref[alternative] << ')'
                     |   primitive2 << '(' << literal << ',' << literal << ')'
                     |   primitive1 << '(' << literal << ')'
                     |   primitive0_rule
-                    |   directive0 << '[' << repeat(1)[alternative] << ']'
+                    |   directive0 << '[' << deref[alternative] << ']'
                     |   alternative_rule 
                 ];
 
-            primitive0_rule = strict[repeat(1)[primitive0]];
+            primitive0_rule = strict[deref[primitive0]];
             alternative_rule = alternative;
 
-            rule_name = strict[repeat(1)[any_symbol]];
+            rule_name = strict[deref[any_symbol]];
 
             any_symbol = string;
             symbol = string(_r1);
@@ -115,6 +138,7 @@
                 directive0.add(utf8_symbol(name + *p));
 
             BOOST_SPIRIT_DEBUG_NODE(start);
+            BOOST_SPIRIT_DEBUG_NODE(grammar_);
             BOOST_SPIRIT_DEBUG_NODE(rule_);
             BOOST_SPIRIT_DEBUG_NODE(rule_name);
             BOOST_SPIRIT_DEBUG_NODE(alternative);
@@ -132,7 +156,8 @@
         typedef rule<OutputIterator, space_type, utree()> delimiting_rule_type;
 
         delimiting_rule_type start, alternative, permutation, sequence, term;
-        delimiting_rule_type rule_, rule_name, primitive0_rule, alternative_rule;
+        delimiting_rule_type grammar_, rule_;
+        delimiting_rule_type rule_name, primitive0_rule, alternative_rule;
         rule<OutputIterator, nil()> nil;
         rule<OutputIterator, scheme::utf8_string()> literal;
         rule<OutputIterator, scheme::utf8_symbol(std::string)> symbol;