Комментарии 31
Да, удобная штука.
В новых версиях boost'a появились boost::qi, boost::karma, boost::lex. Вы что-нибудь из этого пробовали использовать?
XML-фанатики, которые так и не перешли на JSON :)
А статья интересная. Будет возможность, попробую :)
Кстати предлагаемый сокращенный синтаксис визуально очень похож на YAML (который в свежих инкарнациях совместим с JSON)
JSON является подмножеством YAML, но с одним важным отличием, в нём нет конечного перевода строки (если не ошибаюсь).
Использование JSON для любой коммуникации с Javascript более православно, чем использование XML, по множеству причин (более красивый код, меньшее потребление памяти, большая производительность).
Более того, тенденция к переходу от XML к JSON существует даже в таких системах, где Javascript и не пахнет.
Использование JSON для любой коммуникации с Javascript более православно, чем использование XML, по множеству причин (более красивый код, меньшее потребление памяти, большая производительность).
Более того, тенденция к переходу от XML к JSON существует даже в таких системах, где Javascript и не пахнет.
а для JSON есть аналог XSLT? я не в плане наехать на JSON, а в познавательном?
В примере для парсинга число-число ошибка, скобки не совпадают, поправьте плиз
Круто, только надо сразу сказать, что чуть более сложный парсер на boost::spirit превращается в кашу, а его компиляция отжирает гигабайты оперативки и может выполняться минутами и десятками минут. Я уж не говорю о километровых выводов ошибок в темплейтах, если что нибудь накосячить или спирит поменяется в следующей версии. Используйте ANTLR или Bison+FLEX и ваши волосы будут мягкими и шелковистыми :)
И все проекты — опенсорсными.
ну я же в начале написал, чтобы не разводить холивар — каждому свое.
кому-то нравятся блондинки, другому — рыжие. кому-то большие большие груди, а кому-то сандра баллок :)
по теме: сложные парсеры может быть лучше писать на чем-то, отличном от Спирита. но мелкие — самое оно.
кому-то нравятся блондинки, другому — рыжие. кому-то большие большие груди, а кому-то сандра баллок :)
по теме: сложные парсеры может быть лучше писать на чем-то, отличном от Спирита. но мелкие — самое оно.
да, boost удобен и очень хорош. Не представляю себе жизнь на С++ без boosta. Будет возможность, попробую boost::spirit. Пока довольствовался другими библиотеками: boost::asio (кроссплатформенные сокеты), boost::thread и boost::program_options (для парсинга параметров программы) и многие другие.
> Вот например, как вы поступите если нужно распарсить строку вида «число-число», которая задает диапазон страниц для печати?
scanf("%d-%d", &a, &b);
scanf("%d-%d", &a, &b);
ответ неправильный, так как не учитывает пробелы
Удачи :)
Пример из жизни. Проект около 600мб исходников, все id-шники хранятся в int-ах. Выводятся в лог, и при формировании запросов с в 70% случаев с помощью sprintf. Читаются хоть и редко, но с помощью sscanf.
У одних из клиентов заканчиваются айдишники. Внезапно… (с запасом пол-года)
Не буду двадаться в подробности как это всё происходило, но пара ребят героически, с помощью компилятора и регекспов отловили большинство использований айди, и поменяли их на новый тип db_id_t.
И вот случаи с sprintf и sscanf — отливливались дольше всего…
очень редко, но до сих пор qa специалисты ловят коры.
Пример из жизни. Проект около 600мб исходников, все id-шники хранятся в int-ах. Выводятся в лог, и при формировании запросов с в 70% случаев с помощью sprintf. Читаются хоть и редко, но с помощью sscanf.
У одних из клиентов заканчиваются айдишники. Внезапно… (с запасом пол-года)
Не буду двадаться в подробности как это всё происходило, но пара ребят героически, с помощью компилятора и регекспов отловили большинство использований айди, и поменяли их на новый тип db_id_t.
И вот случаи с sprintf и sscanf — отливливались дольше всего…
очень редко, но до сих пор qa специалисты ловят коры.
Забыл добавить. Самая большая проблема вашего scanf("%d-%d", &a, &b); — в том что при изменении типа a и b — нужно делать два изменения.
Менять тип у переменной, и менять тип во всех использованиях scanf.
Менять тип у переменной, и менять тип во всех использованиях scanf.
Ну так граждане. Надо было изначально завести typedef. А вот с %d хз что делать. наверное только макросом. В таких случаях лучше перейти на с++ с iostream.
>> Надо было изначально завести typedef.
ага. тайпдеф был, только лет пять назад, на этом проекте еще не применялось код-ревью и в большинстве мест тайпдеф не ипользовался.
>> А вот с %d хз что делать. наверное только макросом. В таких случаях лучше перейти на с++ с iostream.
Согласен, использую stream-ы.
Я просто немного покритиковал вариант со scanf.
ага. тайпдеф был, только лет пять назад, на этом проекте еще не применялось код-ревью и в большинстве мест тайпдеф не ипользовался.
>> А вот с %d хз что делать. наверное только макросом. В таких случаях лучше перейти на с++ с iostream.
Согласен, использую stream-ы.
Я просто немного покритиковал вариант со scanf.
От обилия всяких @<":>.>>,<<&|{][ рябит в глазах. Я после третьего-четвертого такого символа в строке теряю нить повествования (как, например, после пятой-шестой вложенности цикла или массива). Вы считаете это хорошим стилем программирования? (Я не о стиле автора статьи, а о том, к чему вынуждает spirit).
Парсер это, конечно, вещь нужная и всё такое, но для xml чем не угодил кошерный tinyxml и биндинги к нему на плюсах?
господи, какой ужас.
Первый пример, число-число, без Boost.Spirit — одна строчка:
bool ok = (std::cin >> res.first) && (std::cin.get() == '-') && (std::cin >> res.second);
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Практическое использование Boost.Spirit