// 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) #if !defined(SCHEME_OUTPUT_SEXPR_MAR_8_2010_829AM) #define SCHEME_OUTPUT_SEXPR_MAR_8_2010_829AM #include #include #include #include #include #include /////////////////////////////////////////////////////////////////////////////// namespace scheme { namespace output { using boost::spirit::karma::grammar; using boost::spirit::karma::space_type; using boost::spirit::karma::rule; using boost::spirit::karma::double_; using boost::spirit::karma::int_; using boost::spirit::karma::string; using boost::spirit::karma::bool_; using boost::spirit::karma::eps; using boost::spirit::karma::uint_generator; using boost::spirit::karma::hex; using boost::spirit::karma::right_align; template struct sexpr : grammar { sexpr() : sexpr::base_type(start) { uint_generator hex2; start = double_ | int_ | bool_ | string_ | symbol | byte_str | list | nil | ref_ ; list = '(' << *start << ')'; string_ = '"' << string << '"'; symbol = string; byte_str = '#' << *right_align(2, '0')[hex2] << '#'; nil = eps << ""; ref_ = start; start.name("start"); list.name("list"); string_.name("string_"); symbol.name("symbol"); byte_str.name("byte_str"); nil.name("nil"); ref_.name("ref_"); } typedef boost::iterator_range utree_list; rule start; rule list; rule symbol; rule string_; rule byte_str; rule nil; rule ref_; }; }} #endif