Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r61273 - in trunk/libs/spirit/example/scheme: . input
From: joel_at_[hidden]
Date: 2010-04-14 08:00:26


Author: djowel
Date: 2010-04-14 08:00:25 EDT (Wed, 14 Apr 2010)
New Revision: 61273
URL: http://svn.boost.org/trac/boost/changeset/61273

Log:
tweaks
Text files modified:
   trunk/libs/spirit/example/scheme/input/parse_sexpr.hpp | 31 ++++++++++++++++++++++---------
   trunk/libs/spirit/example/scheme/input/parse_sexpr_impl.hpp | 40 ++++++++++++++++++++++++++++------------
   trunk/libs/spirit/example/scheme/scheme_compiler.hpp | 36 +++++++++++++++++++++++++++++++++++-
   trunk/libs/spirit/example/scheme/scheme_interpreter.hpp | 2 +-
   4 files changed, 86 insertions(+), 23 deletions(-)

Modified: trunk/libs/spirit/example/scheme/input/parse_sexpr.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/input/parse_sexpr.hpp (original)
+++ trunk/libs/spirit/example/scheme/input/parse_sexpr.hpp 2010-04-14 08:00:25 EDT (Wed, 14 Apr 2010)
@@ -1,6 +1,7 @@
 // Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// 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)
@@ -8,24 +9,36 @@
 
 #include "../utree.hpp"
 #include "../input/sexpr.hpp"
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_base_of.hpp>
 #include <iosfwd>
-#include <string>
 
 namespace scheme { namespace input
 {
     ///////////////////////////////////////////////////////////////////////////
     template <typename Char>
- bool parse_sexpr(std::basic_istream<Char>& is, utree& result);
+ bool
+ parse_sexpr(std::basic_istream<Char>& is, utree& result);
 
     template <typename Char>
- bool parse_sexpr_list(std::basic_istream<Char>& is, utree& result);
+ bool
+ parse_sexpr_list(std::basic_istream<Char>& is, utree& result);
 
     ///////////////////////////////////////////////////////////////////////////
- template <typename Char>
- bool parse_sexpr(std::basic_string<Char>& str, utree& result);
+ template <typename Range>
+ typename boost::disable_if<
+ boost::is_base_of<std::ios_base, Range>, bool>::type
+ parse_sexpr(Range const& rng, utree& 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);
 
- template <typename Char>
- bool parse_sexpr_list(std::basic_string<Char>& str, utree& result);
+ ///////////////////////////////////////////////////////////////////////////
+ bool parse_sexpr(utree const& in, utree& result);
+
+ bool parse_sexpr_list(utree const& in, utree& result);
 }}
 
 #endif

Modified: trunk/libs/spirit/example/scheme/input/parse_sexpr_impl.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/input/parse_sexpr_impl.hpp (original)
+++ trunk/libs/spirit/example/scheme/input/parse_sexpr_impl.hpp 2010-04-14 08:00:25 EDT (Wed, 14 Apr 2010)
@@ -1,6 +1,7 @@
 // Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// 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)
@@ -18,7 +19,7 @@
 {
     ///////////////////////////////////////////////////////////////////////////
     template <typename Char>
- bool parse_sexpr(std::basic_istream<Char>& is, utree& result)
+ inline bool parse_sexpr(std::basic_istream<Char>& is, utree& result)
     {
         // no white space skipping in the stream!
         is.unsetf(std::ios::skipws);
@@ -36,7 +37,7 @@
 
     ///////////////////////////////////////////////////////////////////////////
     template <typename Char>
- bool parse_sexpr_list(std::basic_istream<Char>& is, utree& result)
+ inline bool parse_sexpr_list(std::basic_istream<Char>& is, utree& result)
     {
         // no white space skipping in the stream!
         is.unsetf(std::ios::skipws);
@@ -53,28 +54,43 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
- template <typename Char>
- bool parse_sexpr(std::basic_string<Char>& str, utree& result)
+ template <typename Range>
+ inline
+ typename boost::disable_if<boost::is_base_of<std::ios_base, Range>, bool>::type
+ parse_sexpr(Range const& rng, utree& result)
     {
- typedef typename std::basic_string<Char>::const_iterator iterator_type;
+ typedef typename Range::const_iterator iterator_type;
 
         scheme::input::sexpr<iterator_type> p;
         scheme::input::sexpr_white_space<iterator_type> ws;
 
         using boost::spirit::qi::phrase_parse;
- return phrase_parse(str.begin(), str.end(), p, ws, result);
+ return phrase_parse(rng.begin(), rng.end(), p, ws, result);
     }
 
- template <typename Char>
- bool parse_sexpr_list(std::basic_string<Char>& str, utree& result)
+ template <typename Range>
+ inline
+ typename boost::disable_if<boost::is_base_of<std::ios_base, Range>, bool>::type
+ parse_sexpr_list(Range const& rng, utree& result)
     {
- typedef typename std::basic_string<Char>::const_iterator iterator_type;
+ typedef typename Range::const_iterator iterator_type;
 
         scheme::input::sexpr<iterator_type> p;
         scheme::input::sexpr_white_space<iterator_type> ws;
 
         using boost::spirit::qi::phrase_parse;
- return phrase_parse(str.begin(), str.end(), +p, ws, result);
+ return phrase_parse(rng.begin(), rng.end(), +p, ws, result);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ inline bool parse_sexpr(utree const& in, utree& result)
+ {
+ return parse_sexpr(in.as<utf8_string_range>(), result);
+ }
+
+ inline bool parse_sexpr_list(utree const& in, utree& result)
+ {
+ return parse_sexpr_list(in.as<utf8_string_range>(), result);
     }
 }}
 

Modified: trunk/libs/spirit/example/scheme/scheme_compiler.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/scheme_compiler.hpp (original)
+++ trunk/libs/spirit/example/scheme/scheme_compiler.hpp 2010-04-14 08:00:25 EDT (Wed, 14 Apr 2010)
@@ -1,4 +1,4 @@
-/*=============================================================================
+/*=============================================================================
     Copyright (c) 2001-2010 Joel de Guzman
 
     Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -222,6 +222,40 @@
         env.define("-", minus);
         env.define("*", times);
     }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // interpreter
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Source>
+ struct interpreter : composite<interpreter<Source> >
+ {
+ interpreter(Source const& in, environment* outer = 0)
+ {
+ if (outer == 0)
+ build_basic_environment(env);
+
+ if (input::parse_sexpr_list(in, program))
+ {
+ compile_all(program, env, flist, fragments);
+ }
+ else
+ {
+ // $$$ Use exceptions $$$
+ BOOST_ASSERT(false);
+ }
+ }
+
+ using composite<interpreter<Source> >::operator();
+ actor operator()(actor_list const& elements) const
+ {
+ return actor(lambda_function(flist.back(), elements));
+ }
+
+ environment env;
+ utree program;
+ actor_list fragments;
+ actor_list flist;
+ };
 }
 
 #endif

Modified: trunk/libs/spirit/example/scheme/scheme_interpreter.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/scheme_interpreter.hpp (original)
+++ trunk/libs/spirit/example/scheme/scheme_interpreter.hpp 2010-04-14 08:00:25 EDT (Wed, 14 Apr 2010)
@@ -126,7 +126,7 @@
         typedef utree result_type;
         utree operator()(args_type args) const
         {
- return utree(boost::ref(*(args.begin()+n)));
+ return utree(boost::ref(args[n]));
         }
     };
 


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