
On Wed, Mar 2, 2011 at 3:03 PM, Alexander Ospin <aospin@email.ru> wrote:
Is it possible to evaluate terminal and custom_terminal expressions in the some custom actions class? For instance how to implement "terminal_eval" to print something in the following code?
#include <boost/phoenix/phoenix.hpp> #include <iostream>
using namespace boost;
struct actions { template <typename Rule, typename Dummy = void> struct when; };
template <> struct actions::when<phoenix::rule::terminal> : phoenix::call<terminal_eval> {};
int main() { int var = 11; phoenix::eval(phoenix::val(var), phoenix::context(int(), actions())); return 0; }
I've tried to use the following form, but encountered some compiler errors: (GCC-4.2.1[FreeBSD], boost and phoenix were taken from SVN, latest versions)
struct terminal_eval { typedef void result_type; template <typename Context, typename Expr> result_type operator ()(Context const &ctx, Expr const &expr) { std::cout << "terminal" << std::endl; } };
Hi, phoenix::call does not work with terminals (which have an arity of 0). The reason for this is because I didn't want to dictate what should be passed to the eval function, the possibilities are: the value of the terminal, or the proto::terminal type itself, the reason i couldn't decide is because phoenix::call passes along proto expressions to the to be called function object, and not the result of the evaluation. You're code will work by doing the following: template <> struct actions::when<phoenix::rule::terminal> : proto::call<terminal_eval(phoenix::_ctx, proto::_)> {}; or: template <> struct actions::when<phoenix::rule::terminal> : proto::call<terminal_eval(phoenix::_ctx, proto::_value)> {}; HTH, Thomas