如何使用boost::expression-static在语义操作中引用可选子匹配

How to reference an optional submatch inside a semantic action with boost::xpressive static?

本文关键字:引用 操作 boost 何使用 expression-static 语义      更新时间:2023-10-16

我有一个提升表达式sregex和语义操作,它等效于以下内容:

Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))];

以前我在boost 1.43上使用这个,没有任何问题。我最近不得不升级到一个新的提升,现在我遇到了以下问题。在boost 1.48中,当子匹配与任何内容都不匹配时(因为它是可选的),当as在空的s1对象上执行时,语义动作会抛出bad_lexical_cast异常。

我该如何解决这个问题,它以前起作用只是巧合吗?我应该用一些更好、更安全的方法来解决这个问题?或者这只是lexical_cast代码中的一些变化,现在破坏了xpressive

其他信息

我通过在regex_actions.hpp:中更改以下内容,暂时解决了实际问题

template<typename T>
struct as
{
    BOOST_PROTO_CALLABLE()
    typedef T result_type;
    template<typename Value>
    T operator()(Value const &val) const
    {
        return lexical_cast<T>(val);
    }
};

进入:

template<typename T>
struct as
{
    BOOST_PROTO_CALLABLE()
    typedef T result_type;
    template<typename Value>
    T operator()(Value const &val) const
    {
        if(val.first==val.second)
        {
            return T();
        }
        else
        {
            return lexical_cast<T>(val);
        }
    }
};

这让我相信,也许这是xpressive本身需要解决的问题。然而,我还没有100%相信这不是我做错的事情,有人对xpressive有更多的了解吗?

经过进一步调查并与Xpressive的作者交谈,我得出的结论是,这要么是lexical_cast行为的回归,要么是xpressive预期lexical_cast行为方式的错误。