123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- /*==============================================================================
- 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
|