Как сослаться на необязательный субматч внутри семантического действия с boost :: xpressive static? - PullRequest
2 голосов
/ 26 января 2012

У меня есть boost xpressive sregex и семантическое действие, эквивалентное следующему:

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

Ранее я использовал это на boost 1.43 без каких-либо проблем.Недавно мне пришлось перейти на более новую версию, и теперь я сталкиваюсь со следующей проблемой.На бусте 1.48, когда субматч ничего не соответствует (как это необязательно), семантическое действие создает исключение bad_lexical_cast, когда as выполняется для пустого s1 объекта.

Как исправитьэта проблема, это просто совпадение, что это работало раньше, и есть какой-то более безопасный способ, который я должен использовать, чтобы сделать это?Или это просто, например, какое-то изменение в коде 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);
    }
};

Into:

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 имеет некоторое представление об этом?

1 Ответ

1 голос
/ 26 января 2012

После более подробного изучения и разговора с автором Xpressive я пришел к выводу, что это либо регрессия в поведении lexical_cast, либо ошибка в способе xpressive ожидаемого lexical_cast к вести себя.

...