|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r61475 - in trunk: boost/spirit/home/karma boost/spirit/home/karma/detail boost/spirit/home/karma/nonterminal boost/spirit/home/qi/detail boost/spirit/home/qi/nonterminal boost/spirit/home/support libs/spirit/test libs/spirit/test/karma
From: hartmut.kaiser_at_[hidden]
Date: 2010-04-21 19:35:51
Author: hkaiser
Date: 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
New Revision: 61475
URL: http://svn.boost.org/trac/boost/changeset/61475
Log:
Spirit: fixed gcc compilation problems, added karma debug support, fixed Qi debug indentation
Added:
trunk/boost/spirit/home/karma/nonterminal/debug_handler.hpp (contents, props changed)
trunk/boost/spirit/home/karma/nonterminal/simple_trace.hpp (contents, props changed)
trunk/libs/spirit/test/karma/debug.cpp (contents, props changed)
Text files modified:
trunk/boost/spirit/home/karma/detail/output_iterator.hpp | 28 +++++++++++++++++-----------
trunk/boost/spirit/home/karma/detail/pass_container.hpp | 10 +++++++++-
trunk/boost/spirit/home/karma/nonterminal.hpp | 2 ++
trunk/boost/spirit/home/qi/detail/attributes.hpp | 14 ++++++++++++++
trunk/boost/spirit/home/qi/nonterminal/debug_handler.hpp | 11 +++++++----
trunk/boost/spirit/home/qi/nonterminal/simple_trace.hpp | 27 ++++++++++++++++-----------
trunk/boost/spirit/home/support/attributes.hpp | 14 --------------
trunk/libs/spirit/test/Jamfile | 1 +
8 files changed, 66 insertions(+), 41 deletions(-)
Modified: trunk/boost/spirit/home/karma/detail/output_iterator.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/detail/output_iterator.hpp (original)
+++ trunk/boost/spirit/home/karma/detail/output_iterator.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -170,7 +170,6 @@
// The following classes are used to intercept the output into a buffer
// allowing to do things like alignment, character escaping etc.
///////////////////////////////////////////////////////////////////////////
- template <typename OutputIterator>
class buffer_sink : boost::noncopyable
{
public:
@@ -202,7 +201,8 @@
buffer.push_back(value);
}
- bool copy(OutputIterator& sink, std::size_t maxwidth) const
+ template <typename OutputIterator_>
+ bool copy(OutputIterator_& sink, std::size_t maxwidth) const
{
#if defined(BOOST_MSVC)
#pragma warning(push)
@@ -245,7 +245,6 @@
};
///////////////////////////////////////////////////////////////////////////
- template <typename OutputIterator>
struct buffering_policy
{
public:
@@ -253,10 +252,9 @@
buffering_policy(buffering_policy const& rhs) : buffer(rhs.buffer) {}
// functions related to buffering
- buffer_sink<OutputIterator>* chain_buffering(
- buffer_sink<OutputIterator>* buffer_data)
+ buffer_sink* chain_buffering(buffer_sink* buffer_data)
{
- buffer_sink<OutputIterator>* prev_buffer = buffer;
+ buffer_sink* prev_buffer = buffer;
buffer = buffer_data;
return prev_buffer;
}
@@ -275,7 +273,7 @@
bool has_buffer() const { return NULL != buffer; }
private:
- buffer_sink<OutputIterator>* buffer;
+ buffer_sink* buffer;
};
struct no_buffering_policy
@@ -369,7 +367,7 @@
typedef typename mpl::if_c<
(properties & generator_properties::buffering) ? true : false
- , buffering_policy<most_derived_type>, no_buffering_policy
+ , buffering_policy, no_buffering_policy
>::type buffering_type;
typedef typename mpl::if_c<
@@ -559,15 +557,23 @@
// copy to the remaining characters to the specified sink
template <typename RestIterator>
- bool buffer_copy_rest(RestIterator& sink, std::size_t start_at = 0)
+ bool buffer_copy_rest(RestIterator& sink, std::size_t start_at = 0) const
{
return buffer_data.copy_rest(sink, start_at);
}
+ // copy the contents to the given output iterator
+ template <typename OutputIterator_>
+ bool buffer_copy_to(OutputIterator_& sink
+ , std::size_t maxwidth = std::size_t(-1)) const
+ {
+ return buffer_data.copy(sink, maxwidth);
+ }
+
private:
OutputIterator& sink;
- buffer_sink<OutputIterator> buffer_data; // for buffering
- buffer_sink<OutputIterator>* prev_buffer; // previous buffer in chain
+ buffer_sink buffer_data; // for buffering
+ buffer_sink* prev_buffer; // previous buffer in chain
bool enabled;
};
Modified: trunk/boost/spirit/home/karma/detail/pass_container.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/detail/pass_container.hpp (original)
+++ trunk/boost/spirit/home/karma/detail/pass_container.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -70,6 +70,14 @@
, boost::forward_traversal_tag
, typename boost::detail::iterator_traits<Iterator>::value_type const&>
{
+ typedef typename boost::detail::iterator_traits<Iterator>::value_type
+ base_value_type;
+
+ typedef boost::iterator_facade<
+ indirect_iterator<Iterator>, base_value_type
+ , boost::forward_traversal_tag, base_value_type const&
+ > base_type;
+
public:
indirect_iterator()
: iter_(0)
@@ -94,7 +102,7 @@
return other.iter_ != 0 && *iter_ == *other.iter_;
}
- reference dereference() const
+ typename base_type::reference dereference() const
{
return **iter_;
}
Modified: trunk/boost/spirit/home/karma/nonterminal.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/nonterminal.hpp (original)
+++ trunk/boost/spirit/home/karma/nonterminal.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -12,5 +12,7 @@
#include <boost/spirit/home/karma/nonterminal/rule.hpp>
#include <boost/spirit/home/karma/nonterminal/grammar.hpp>
+#include <boost/spirit/home/karma/nonterminal/debug_handler.hpp>
+#include <boost/spirit/home/karma/nonterminal/simple_trace.hpp>
#endif
Added: trunk/boost/spirit/home/karma/nonterminal/debug_handler.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/karma/nonterminal/debug_handler.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -0,0 +1,124 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 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_KARMA_DEBUG_HANDLER_APR_21_2010_0148PM)
+#define BOOST_SPIRIT_KARMA_DEBUG_HANDLER_APR_21_2010_0148PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/karma/nonterminal/rule.hpp>
+#include <boost/function.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <iostream>
+
+namespace boost { namespace spirit { namespace karma
+{
+ enum debug_handler_state
+ {
+ pre_generate
+ , successful_generate
+ , failed_generate
+ };
+
+ template <
+ typename OutputIterator, typename Context, typename Delimiter
+ , typename Properties, typename F>
+ struct debug_handler
+ {
+ typedef detail::output_iterator<OutputIterator, Properties>
+ output_iterator;
+ typedef detail::enable_buffering<output_iterator> buffer_type;
+
+ typedef function<bool(output_iterator&, Context&, Delimiter const&)>
+ function_type;
+
+ debug_handler(function_type subject, F f, std::string const& rule_name)
+ : subject(subject)
+ , f(f)
+ , rule_name(rule_name)
+ {}
+
+ bool operator()(output_iterator& sink, Context& context
+ , Delimiter const& delim) const
+ {
+ buffer_type buffer(sink);
+ bool r = false;
+
+ f (sink, context, pre_generate, rule_name, buffer);
+ {
+ detail::disable_counting<output_iterator> nocount(sink);
+ r = subject(sink, context, delim);
+ }
+
+ if (r)
+ {
+ f (sink, context, successful_generate, rule_name, buffer);
+ buffer.buffer_copy();
+ return true;
+ }
+ f (sink, context, failed_generate, rule_name, buffer);
+ return false;
+ }
+
+ function_type subject;
+ F f;
+ std::string rule_name;
+ };
+
+ template <
+ typename OutputIterator, typename T0, typename T1, typename T2
+ , typename F>
+ void debug(rule<OutputIterator, T0, T1, T2>& r, F f)
+ {
+ typedef rule<OutputIterator, T0, T1, T2> rule_type;
+
+ typedef
+ debug_handler<
+ OutputIterator
+ , typename rule_type::context_type
+ , typename rule_type::delimiter_type
+ , typename rule_type::properties
+ , F>
+ debug_handler;
+ r.f = debug_handler(r.f, f, r.name());
+ }
+
+ struct simple_trace;
+
+ template <typename OutputIterator, typename T0, typename T1, typename T2>
+ void debug(rule<OutputIterator, T0, T1, T2>& r)
+ {
+ typedef rule<OutputIterator, T0, T1, T2> rule_type;
+
+ typedef
+ debug_handler<
+ OutputIterator
+ , typename rule_type::context_type
+ , typename rule_type::delimiter_type
+ , typename rule_type::properties
+ , simple_trace>
+ debug_handler;
+ r.f = debug_handler(r.f, simple_trace(), r.name());
+ }
+
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+// Utility macro for easy enabling of rule and grammar debugging
+#if !defined(BOOST_SPIRIT_DEBUG_NODE)
+ #if defined(BOOST_SPIRIT_KARMA_DEBUG)
+ #define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r); debug(r)
+ #else
+ #define BOOST_SPIRIT_DEBUG_NODE(r)
+ #endif
+#endif
+
+#endif
Added: trunk/boost/spirit/home/karma/nonterminal/simple_trace.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/karma/nonterminal/simple_trace.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -0,0 +1,133 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 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_KARMA_SIMPLE_TRACE_APR_21_2010_0155PM)
+#define BOOST_SPIRIT_KARMA_SIMPLE_TRACE_APR_21_2010_0155PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/fusion/include/out.hpp>
+#include <iostream>
+
+// The stream to use for debug output
+#if !defined(BOOST_SPIRIT_DEBUG_OUT)
+#define BOOST_SPIRIT_DEBUG_OUT std::cerr
+#endif
+
+// number of tokens to print while debugging
+#if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
+#define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
+#endif
+
+// number of spaces to indent
+#if !defined(BOOST_SPIRIT_DEBUG_INDENT)
+#define BOOST_SPIRIT_DEBUG_INDENT 2
+#endif
+
+namespace boost { namespace spirit { namespace karma
+{
+ struct simple_trace
+ {
+ int& get_indent() const
+ {
+ static int indent = 0;
+ return indent;
+ }
+
+ void print_indent() const
+ {
+ int n = get_indent();
+ n *= BOOST_SPIRIT_DEBUG_INDENT;
+ for (int i = 0; i != n; ++i)
+ BOOST_SPIRIT_DEBUG_OUT << ' ';
+ }
+
+ template <typename Buffer>
+ void print_some(char const* tag, Buffer const& buffer) const
+ {
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << '<' << tag << '>' << std::flush;
+ {
+ std::ostreambuf_iterator<char> out(BOOST_SPIRIT_DEBUG_OUT);
+ buffer.buffer_copy_to(out, BOOST_SPIRIT_DEBUG_PRINT_SOME);
+ }
+ BOOST_SPIRIT_DEBUG_OUT << "</" << tag << '>' << std::endl;
+ }
+
+ template <typename OutputIterator, typename Context, typename State
+ , typename Buffer>
+ void operator()(
+ OutputIterator& sink, Context const& context
+ , State state, std::string const& rule_name
+ , Buffer const& buffer) const
+ {
+ switch (state)
+ {
+ case pre_generate:
+ print_indent();
+ ++get_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << '<' << rule_name << '>' << std::endl;
+ print_indent();
+ ++get_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<try>" << std::endl;;
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<attributes>";
+ traits::print_attribute(
+ BOOST_SPIRIT_DEBUG_OUT,
+ context.attributes
+ );
+ BOOST_SPIRIT_DEBUG_OUT << "</attributes>" << std::endl;
+ if (!fusion::empty(context.locals))
+ {
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "<locals>" << context.locals << "</locals>"
+ << std::endl;
+ }
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "</try>" << std::endl;;
+ break;
+
+ case successful_generate:
+ print_indent();
+ ++get_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<success>" << std::endl;
+ print_some("result", buffer);
+ if (!fusion::empty(context.locals))
+ {
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "<locals>" << context.locals << "</locals>"
+ << std::endl;
+ }
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "</success>" << std::endl;
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</" << rule_name << '>' << std::endl;
+ break;
+
+ case failed_generate:
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT << "<fail/>" << std::endl;
+ --get_indent();
+ print_indent();
+ BOOST_SPIRIT_DEBUG_OUT
+ << "</" << rule_name << '>' << std::endl;
+ break;
+ }
+ }
+ };
+}}}
+
+#endif
Modified: trunk/boost/spirit/home/qi/detail/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/detail/attributes.hpp (original)
+++ trunk/boost/spirit/home/qi/detail/attributes.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -156,6 +156,20 @@
struct transform_attribute<Attribute&, Attribute, qi::domain>
: qi::transform_attribute<Attribute&, Attribute>
{};
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed>
+ void post_transform(Exposed& dest, Transformed const& attr)
+ {
+ return transform_attribute<Exposed, Transformed, qi::domain>::post(dest, attr);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Exposed, typename Transformed>
+ void fail_transform(Exposed& dest, Transformed const&)
+ {
+ return transform_attribute<Exposed, Transformed, qi::domain>::fail(dest);
+ }
}}}
#endif
Modified: trunk/boost/spirit/home/qi/nonterminal/debug_handler.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/nonterminal/debug_handler.hpp (original)
+++ trunk/boost/spirit/home/qi/nonterminal/debug_handler.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -14,6 +14,7 @@
#include <boost/spirit/home/support/unused.hpp>
#include <boost/spirit/home/qi/nonterminal/rule.hpp>
#include <boost/spirit/home/qi/operator/expect.hpp>
+#include <boost/spirit/home/qi/nonterminal/simple_trace.hpp>
#include <boost/function.hpp>
#include <boost/fusion/include/at.hpp>
#include <boost/fusion/include/vector.hpp>
@@ -116,10 +117,12 @@
///////////////////////////////////////////////////////////////////////////////
// Utility macro for easy enabling of rule and grammar debugging
-#if defined(BOOST_SPIRIT_DEBUG)
-#define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r); debug(r)
-#else
-#define BOOST_SPIRIT_DEBUG_NODE(r)
+#if !defined(BOOST_SPIRIT_DEBUG_NODE)
+ #if defined(BOOST_SPIRIT_DEBUG) || defined(BOOST_SPIRIT_QI_DEBUG)
+ #define BOOST_SPIRIT_DEBUG_NODE(r) r.name(#r); debug(r)
+ #else
+ #define BOOST_SPIRIT_DEBUG_NODE(r)
+ #endif
#endif
#endif
Modified: trunk/boost/spirit/home/qi/nonterminal/simple_trace.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/nonterminal/simple_trace.hpp (original)
+++ trunk/boost/spirit/home/qi/nonterminal/simple_trace.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -1,5 +1,6 @@
/*=============================================================================
Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 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)
@@ -20,7 +21,7 @@
#define BOOST_SPIRIT_DEBUG_OUT std::cerr
#endif
-// number of input tokens to print while debugging
+// number of tokens to print while debugging
#if !defined(BOOST_SPIRIT_DEBUG_PRINT_SOME)
#define BOOST_SPIRIT_DEBUG_PRINT_SOME 20
#endif
@@ -95,6 +96,12 @@
struct simple_trace
{
+ int& get_indent() const
+ {
+ static int indent = 0;
+ return indent;
+ }
+
void print_indent(int n) const
{
n *= BOOST_SPIRIT_DEBUG_INDENT;
@@ -108,7 +115,7 @@
, int indent
, Iterator first, Iterator const& last) const
{
- print_indent(indent);
+ print_indent(get_indent());
BOOST_SPIRIT_DEBUG_OUT << '<' << tag << '>';
int const n = BOOST_SPIRIT_DEBUG_PRINT_SOME;
for (int i = 0; first != last && i != n && *first; ++i, ++first)
@@ -127,20 +134,18 @@
, State state
, std::string const& rule_name) const
{
- int static indent = 0;
-
switch (state)
{
case pre_parse:
- print_indent(indent++);
+ print_indent(get_indent()++);
BOOST_SPIRIT_DEBUG_OUT
<< '<' << rule_name << '>'
<< std::endl;
- print_some("try", indent, first, last);
+ print_some("try", get_indent(), first, last);
break;
case successful_parse:
- print_some("success", indent, first, last);
- print_indent(indent);
+ print_some("success", get_indent(), first, last);
+ print_indent(get_indent());
BOOST_SPIRIT_DEBUG_OUT
<< "<attributes>";
traits::print_attribute(
@@ -155,15 +160,15 @@
<< context.locals
<< "</locals>";
BOOST_SPIRIT_DEBUG_OUT << std::endl;
- print_indent(--indent);
+ print_indent(--get_indent());
BOOST_SPIRIT_DEBUG_OUT
<< "</" << rule_name << '>'
<< std::endl;
break;
case failed_parse:
- print_indent(indent);
+ print_indent(get_indent());
BOOST_SPIRIT_DEBUG_OUT << "<fail/>" << std::endl;
- print_indent(--indent);
+ print_indent(--get_indent());
BOOST_SPIRIT_DEBUG_OUT
<< "</" << rule_name << '>'
<< std::endl;
Modified: trunk/boost/spirit/home/support/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/support/attributes.hpp (original)
+++ trunk/boost/spirit/home/support/attributes.hpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -539,20 +539,6 @@
}
///////////////////////////////////////////////////////////////////////////
- template <typename Exposed, typename Transformed>
- void post_transform(Exposed& dest, Transformed const& attr)
- {
- return transform_attribute<Exposed, Transformed, qi::domain>::post(dest, attr);
- }
-
- ///////////////////////////////////////////////////////////////////////////
- template <typename Exposed, typename Transformed>
- void fail_transform(Exposed& dest, Transformed const&)
- {
- return transform_attribute<Exposed, Transformed, qi::domain>::fail(dest);
- }
-
- ///////////////////////////////////////////////////////////////////////////
// make_attribute
//
// All parsers and generators have specific attribute types.
Modified: trunk/libs/spirit/test/Jamfile
==============================================================================
--- trunk/libs/spirit/test/Jamfile (original)
+++ trunk/libs/spirit/test/Jamfile 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -87,6 +87,7 @@
[ run karma/char.cpp : : : : karma_char ]
[ run karma/char_class.cpp : : : : karma_char_class ]
[ run karma/columns.cpp : : : : ]
+ [ run karma/debug.cpp : : : : karma_debug ]
[ run karma/delimiter.cpp : : : : ]
[ run karma/encoding.cpp : : : : karma_encoding ]
[ run karma/eol.cpp : : : : karma_eol ]
Added: trunk/libs/spirit/test/karma/debug.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/debug.cpp 2010-04-21 19:35:50 EDT (Wed, 21 Apr 2010)
@@ -0,0 +1,112 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 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)
+
+#define BOOST_SPIRIT_KARMA_DEBUG
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/karma_operator.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_auxiliary.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+#include <boost/spirit/include/karma_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/spirit/include/phoenix_statement.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include <string>
+#include <cstring>
+#include <iostream>
+#include "test.hpp"
+
+int main()
+{
+ using spirit_test::test;
+ using spirit_test::test_delimited;
+
+ using namespace boost::spirit::ascii;
+ using namespace boost::spirit::karma::labels;
+ using boost::spirit::karma::locals;
+ using boost::spirit::karma::rule;
+ using boost::spirit::karma::char_;
+ using boost::spirit::karma::debug;
+ using boost::spirit::karma::space;
+ using boost::spirit::karma::eps;
+
+ namespace phx = boost::phoenix;
+
+ typedef spirit_test::output_iterator<char>::type outiter_type;
+
+ { // basic tests
+ rule<outiter_type, char()> a, b, c;
+ rule<outiter_type, std::vector<char>()> start;
+
+ std::vector<char> v;
+ v.push_back('a');
+ v.push_back('b');
+ v.push_back('a');
+ v.push_back('c');
+ v.push_back('a');
+ v.push_back('b');
+ v.push_back('b');
+ v.push_back('a');
+
+ a = char_('a');
+ b = char_('b');
+ c = char_('c');
+ BOOST_SPIRIT_DEBUG_NODE(a);
+ BOOST_SPIRIT_DEBUG_NODE(b);
+ BOOST_SPIRIT_DEBUG_NODE(c);
+
+ start = *(a | b | c);
+ BOOST_SPIRIT_DEBUG_NODE(start);
+ BOOST_TEST(test("abacabba", start, v));
+
+ // ignore the delimiter
+ BOOST_TEST(test_delimited("abacabba ", start, v, space));
+
+ std::vector<char> v1;
+ v1.push_back('b');
+ v1.push_back('c');
+
+ start = (a | b) << c;
+ BOOST_SPIRIT_DEBUG_NODE(start);
+ BOOST_TEST(test("bc", start, v1));
+ }
+
+ { // tests with locals
+ rule<outiter_type, char()> a, b, c;
+ rule<outiter_type, std::vector<char>(), locals<int, double> > start;
+
+ std::vector<char> v;
+ v.push_back('a');
+ v.push_back('b');
+ v.push_back('a');
+ v.push_back('c');
+ v.push_back('a');
+ v.push_back('b');
+ v.push_back('b');
+ v.push_back('a');
+
+ a = char_('a');
+ b = char_('b');
+ c = char_('c');
+ BOOST_SPIRIT_DEBUG_NODE(a);
+ BOOST_SPIRIT_DEBUG_NODE(b);
+ BOOST_SPIRIT_DEBUG_NODE(c);
+
+ start %= eps[_a = 0, _b = 2.0] << *(a[++_a] | b | c);
+ BOOST_SPIRIT_DEBUG_NODE(start);
+ BOOST_TEST(test("abacabba", start, v));
+ }
+
+ return boost::report_errors();
+}
+
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk