blob: 2cc68a3a24909ac9eba33109eed44c28130330db [file] [log] [blame]
// 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_PARSE_SEXPR_IMPL)
#define BOOST_SPIRIT_PARSE_SEXPR_IMPL
#include <iostream>
#include <string>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/spirit/include/qi_parse.hpp>
#include <input/sexpr.hpp>
#include <input/parse_sexpr.hpp>
#include <support/line_pos_iterator.hpp>
namespace scheme { namespace input
{
///////////////////////////////////////////////////////////////////////////
template <typename Char>
bool parse_sexpr(
std::basic_istream<Char>& is,
utree& result,
std::string const& source_file)
{
// no white space skipping in the stream!
is.unsetf(std::ios::skipws);
typedef
boost::spirit::basic_istream_iterator<Char>
stream_iterator_type;
stream_iterator_type sfirst(is);
stream_iterator_type slast;
typedef line_pos_iterator<stream_iterator_type> iterator_type;
iterator_type first(sfirst);
iterator_type last(slast);
scheme::input::sexpr<iterator_type> p(source_file);
scheme::input::sexpr_white_space<iterator_type> ws;
using boost::spirit::qi::phrase_parse;
return phrase_parse(first, last, p, ws, result);
}
///////////////////////////////////////////////////////////////////////////
template <typename Char>
bool parse_sexpr_list(
std::basic_istream<Char>& is,
utree& result,
std::string const& source_file)
{
// no white space skipping in the stream!
is.unsetf(std::ios::skipws);
typedef
boost::spirit::basic_istream_iterator<Char>
stream_iterator_type;
stream_iterator_type sfirst(is);
stream_iterator_type slast;
typedef line_pos_iterator<stream_iterator_type> iterator_type;
iterator_type first(sfirst);
iterator_type last(slast);
scheme::input::sexpr<iterator_type> p(source_file);
scheme::input::sexpr_white_space<iterator_type> ws;
using boost::spirit::qi::phrase_parse;
bool ok = phrase_parse(first, last, +p, ws, result);
result.tag(1); // line
return ok;
}
///////////////////////////////////////////////////////////////////////////
template <typename Range>
typename boost::disable_if<boost::is_base_of<std::ios_base, Range>, bool>::type
parse_sexpr(
Range const& rng,
utree& result,
std::string const& source_file)
{
typedef
line_pos_iterator<typename Range::const_iterator>
iterator_type;
scheme::input::sexpr<iterator_type> p(source_file);
scheme::input::sexpr_white_space<iterator_type> ws;
iterator_type first(rng.begin());
iterator_type last(rng.end());
using boost::spirit::qi::phrase_parse;
return phrase_parse(first, last, p, ws, result);
}
template <typename Range>
typename boost::disable_if<boost::is_base_of<std::ios_base, Range>, bool>::type
parse_sexpr_list(
Range const& rng,
utree& result,
std::string const& source_file)
{
typedef
line_pos_iterator<typename Range::const_iterator>
iterator_type;
scheme::input::sexpr<iterator_type> p(source_file);
scheme::input::sexpr_white_space<iterator_type> ws;
iterator_type first(rng.begin());
iterator_type last(rng.end());
using boost::spirit::qi::phrase_parse;
bool ok = phrase_parse(first, last, +p, ws, result);
result.tag(1); // line
return ok;
}
///////////////////////////////////////////////////////////////////////////
bool parse_sexpr(
utree const& in,
utree& result,
std::string const& source_file)
{
return parse_sexpr(in.get<utf8_string_range>(), result, source_file);
}
bool parse_sexpr_list(
utree const& in,
utree& result,
std::string const& source_file)
{
return parse_sexpr_list(in.get<utf8_string_range>(), result, source_file);
}
}}
#endif