Попробуйте проанализировать список, разделенный запятыми - необязательно пустой или полный пробеловC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Попробуйте проанализировать список, разделенный запятыми - необязательно пустой или полный пробелов

Сообщение Anonymous »

Список «a b c, a b c,...» (необязательно пустой) должен быть преобразован в std:vector
это более или менее работает
оставшиеся проблемы: пустая строка не анализируется, а запятая в конце анализируется без ошибок
abc_rule >> *( ',' >> abc_rule )

Мне не ясно, почему синтаксический анализатор допускает одну запятую в конце - разве это не нарушает правило? запятая, а затем должно идти что-то, что заполняет правило abc_rule? анализ кажется недостаточно жадным или что-то в этом роде
и добавление опущенного *qi::space | спереди, чтобы разрешить пустые строки, не работает
Live On Coliru
#include
#include

namespace qi = boost::spirit::qi;

struct Out
{
std::string a, b, c;
};
BOOST_FUSION_ADAPT_STRUCT( Out, a, b, c )

int main()
{
using It = std::string_view::const_iterator;
qi::rule identifier_rule = qi::char_( "a-zA-Z_" ) >> *qi::char_( "a-zA-Z0-9_" );

#if 1
qi::rule abc_rule //
= qi::omit[*qi::space] >> identifier_rule //
>> qi::omit[+qi::space] >> identifier_rule //
>> qi::omit[+qi::space] >> identifier_rule //
>> qi::omit[*qi::space];
#else
qi::rule abc_rule = qi::skip( qi::space )[identifier_rule >> identifier_rule >> identifier_rule];
#endif

qi::rule abc_list_rule = abc_rule >> *( ',' >> abc_rule );

for( std::string_view test : {
"a0 b0 c0,a1 b1 c1", // valid
"a0 b0 c0,", // !!!should be invalid - due to comma at end
"XXXX", // invalid
"a0 b0 c0", // valid
"a0", // invalid
" " // !!!should be valid -> empty list
" , ", // invalid
} )
{
std::cout

Подробнее здесь: https://stackoverflow.com/questions/790 ... -of-spaces
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»