blob: 5dc562238502b303e9b6f94cdb3a5147f4d2efa2 [file] [log] [blame]
/*==============================================================================
Copyright (c) 2001-2011 Hartmut Kaiser
Copyright (c) 2010-2011 Bryce Lelbach
Distributed under the Boost Software License, Version 1.0. (See accompanying
file BOOST_LICENSE_1_0.rst or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#if !defined(BOOST_SPIRIT_UTREE_EXAMPLE_SEXPR_GENERATOR_HPP)
#define BOOST_SPIRIT_UTREE_EXAMPLE_SEXPR_GENERATOR_HPP
#include <boost/spirit/include/support_utree.hpp>
#include <boost/spirit/include/karma.hpp>
namespace boost {
namespace spirit {
namespace traits {
template<>
struct transform_attribute<utree::nil_type, unused_type, karma::domain> {
typedef unused_type type;
static unused_type pre (utree::nil_type&) { return unused_type(); }
};
} // traits
} // spirit
} // boost
namespace sexpr
{
namespace karma = boost::spirit::karma;
namespace standard = boost::spirit::standard;
using boost::spirit::utree;
using boost::spirit::utf8_symbol_range_type;
using boost::spirit::utf8_string_range_type;
using boost::spirit::binary_range_type;
struct bool_output_policies : karma::bool_policies<>
{
template <typename CharEncoding, typename Tag, typename Iterator>
static bool generate_true(Iterator& sink, bool)
{
return string_inserter<CharEncoding, Tag>::call(sink, "#t");
}
template <typename CharEncoding, typename Tag, typename Iterator>
static bool generate_false(Iterator& sink, bool)
{
return string_inserter<CharEncoding, Tag>::call(sink, "#f");
}
};
template <typename Iterator>
struct generator : karma::grammar<Iterator, utree()>
{
typedef boost::iterator_range<utree::const_iterator> utree_list;
karma::rule<Iterator, utree()>
start, ref_;
karma::rule<Iterator, utree_list()>
list;
karma::rule<Iterator, utf8_symbol_range_type()>
symbol;
karma::rule<Iterator, utree::nil_type()>
nil_;
karma::rule<Iterator, utf8_string_range_type()>
utf8;
karma::rule<Iterator, binary_range_type()>
binary;
generator() : generator::base_type(start)
{
using standard::char_;
using standard::string;
using karma::bool_generator;
using karma::uint_generator;
using karma::double_;
using karma::int_;
using karma::lit;
using karma::right_align;
uint_generator<unsigned char, 16> hex2;
bool_generator<bool, bool_output_policies> boolean;
start = nil_
| double_
| int_
| boolean
| utf8
| symbol
| binary
| list
| ref_;
ref_ = start;
list = '(' << -(start % ' ') << ')';
utf8 = '"' << *(&char_('"') << "\\\"" | char_) << '"';
symbol = string;
binary = '#' << *right_align(2, '0')[hex2] << '#';
nil_ = karma::attr_cast(lit("nil"));
start.name("sexpr");
ref_.name("ref");
list.name("list");
utf8.name("string");
symbol.name("symbol");
binary.name("binary");
nil_.name("nil");
}
};
} // sexpr
#endif // BOOST_SPIRIT_UTREE_EXAMPLE_SEXPR_GENERATOR_HPP