2012-01-25 1 views
2

У меня есть импульс Xpressive sregex и семантическое действие, которое эквивалентно следующему:Как ссылаться на необязательную подсылку внутри семантического действия с boost :: xpressive static?

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

Раньше я использовал это на прирост 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); 
    } 
}; 

В:

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, есть некоторые сведения об этом?

+0

Не уверен, что он поддерживается, но вы попробовали 'some_op (как > (s1))'? – ildjarn

+0

@ildjam К сожалению, я не думаю, что это поможет, поскольку (даже если «необязательный» можно использовать здесь), «lexical_cast» все равно будет иметь место и все еще выдавать ошибку. Единственный способ, с помощью которого я могу видеть «необязательный», здесь - это то, что сам 's1' был объявлен с его использованием, но это потребует изменений внутри самого' xpressive'. В любом случае я попробовал ваше предложение, но не мог заставить его работать полезным образом. –

+0

Да, я не был уверен, поддерживает ли Xpressive интеграцию с Boost.Optional (Boost.Spirit делает, вот почему я думал, что Xpressive может). Я считаю, что лучше всего иметь 'some_op' правильную' sub_match' и выполнить соответствующую проверку успеха перед преобразованием в строку. – ildjarn

ответ

1

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

+0

Это действительно регресс в 'lexical_cast'. Я подал [ошибку] ​​(https://svn.boost.org/trac/boost/ticket/6452). Спасибо за отчет! –

 Смежные вопросы

  • Нет связанных вопросов^_^