Boost logo

Boost Users :

Subject: [Boost-users] [Proto] Processing literal strings in context
From: Steffen Rauh (steffen.rauh_at_[hidden])
Date: 2010-03-02 03:30:01


Hi all,

I am using Boost.Proto with Boost 1.42.0 and Visual Studio 2005/2008. I try to handle literal strings in the context of my DSEL:

struct CContext
{
...
    template<>
    struct eval<CExpression<proto::terminal<const char*>::type> >
    {
        typedef void result_type;

        result_type operator()(CExpression<proto::terminal<const char*>::type> Expr, CContext& Ctx) const
        {
            return;
        }
    };
...
};

But the eval for literal strings is never matched. Instead the general proto::tag::terminal eval is matched which is defined afterwards. I tried several variations like char const[proto::N] and the like, without success. What am I missing here?

A full example follows at the end.

Regards,
Steffen

------------------------------

#include <iostream>
#include <boost/proto/proto.hpp>

namespace proto = boost::proto;

struct CTerminal;

struct CGrammar
    : proto::or_<
        proto::shift_right<CGrammar, CGrammar>,
        proto::terminal<proto::_> >
{
};

struct CDomain;

template <typename TExpr>
struct CExpression
    : proto::extends<TExpr, CExpression<TExpr>, CDomain>
{
    typedef proto::extends<TExpr, CExpression<TExpr>, CDomain> base_type;

    CExpression(const TExpr& Expr = TExpr())
      : base_type(Expr)
    {
    }
};

struct CDomain
    : proto::domain<proto::generator<CExpression>, CGrammar>
{
};

struct CTerminal
    : CExpression<proto::terminal<int>::type>
{
    typedef proto::terminal<int>::type expr_type;

    CTerminal()
      : CExpression<expr_type>(expr_type::make(int(0)))
    {
    }

    template <typename TExpr>
    void operator=(TExpr& Expr)
    {
        CContext Ctx;
        proto::eval(Expr, Ctx);
        return;
    }
};

// typedef CExpression<proto::terminal<char const[8]>::type> TLiteralString;
// typedef CExpression<proto::terminal<char const[proto::N]>::type> TLiteralString;
typedef CExpression<proto::terminal<const char*>::type> TLiteralString;

struct CContext
{
    template<typename TExpr, typename Tag = typename TExpr::proto_tag>
    struct eval
    {
    };

    template<>
    struct eval<CTerminal>
    {
        typedef void result_type;

        result_type operator()(const CTerminal& Expr, CContext& Ctx) const
        {
            std::cout << "CTerminal\n";
            return;
        }
    };

    // why is the literal string not matched by this eval???
    template<>
    struct eval<TLiteralString>
    {
        typedef void result_type;

        result_type operator()(TLiteralString Expr, CContext& Ctx) const
        {
            std::cout << "Literal string \"" << proto::value(Expr) << "\"\n";
            return;
        }
    };

    // instead the literal string matches this
    template<typename TExpr>
    struct eval<TExpr, proto::tag::terminal>
    {
        typedef void result_type;

        result_type operator()(const TExpr& Expr, CContext& Ctx) const
        {
            std::cout << "*** Terminal \"" << proto::value(Expr) << "\"\n";
            std::cout << "*** " << typeid(Expr).name() << "\n";
            std::cout << "*** " << typeid(TLiteralString).name() << "\n";
            return;
        }
    };

    template<typename TExpr>
    struct eval<TExpr, proto::tag::shift_right>
    {
        typedef void result_type;

        result_type operator()(const TExpr& Expr, CContext& Ctx) const
        {
            std::cout << "ShiftRight\n";
            proto::eval(proto::left(Expr), Ctx);
            proto::eval(proto::right(Expr), Ctx);
            return;
        }
    };
};

int main(int argc, char* argv[])
{
    CTerminal Foo, Bar;
    Foo = Bar >> "keyword";
    return 0;
}

-- 
Sicherer, schneller und einfacher. Die aktuellen Internet-Browser -
jetzt kostenlos herunterladen! http://portal.gmx.net/de/go/atbrowser

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net