Как стать автором
Обновить

Комментарии 7

Зачем у класса Repeat заведёно значение root?
А вообще, без примера использования статья выглядит незаконченной.
Спасибо за Ваш комментарий. На счет Вашего вопроса: создаем дерево с корнем root и добавляем, в качестве детей, последовательно все разобранные значения. Если же Repeat ни разу не сработает, то возвращается пустое дерево с корнем root.
В следующей статье я планировал описать разработку лексера и пример разбора математических выражений с помощью этой библиотеки.
Интересно. Только бы побольше теории. А то статья выглядит написанной для тех, кто в теме.
По сути похоже на описание библиотеки construct. Загляните в код. Очень занимательно.
Boost.Spirit та ещё гадость. Проще писать самому, да и код получается более читабельный. Пример парсинга конструкции типа __attribute__ ((reqd_work_group_size(x,y,z))) на чистом Си:

	bool attribute(KernelDeclaration & kd) {
		auto was = current;
		int x,y,z;
		if (sterm("__attribute__") && sterm("(") && sterm("(") && sterm("reqd_work_group_size") && sterm("(")
		&& sint(x) && sterm(",") && sint(y) && sterm(",") && sint(z) && sterm(")") && sterm(")") && sterm(")")) {
			kd.requiredWorkgroupSize[0] = x;
			kd.requiredWorkgroupSize[1] = y;
			kd.requiredWorkgroupSize[2] = z;
			return true;
		}
		current = was;
		return false;
	}


Где sterm(t) пропускает пробелы и комментарии, после чего считывает данный терминал. На Boost.Spirit даже не рискну это воспроизвести — не силён в головоломках.
Автор, спасибо за статью! Довольно любопытно было почитать. Теперь с нетерпением жду продолжения с живыми примерами использования.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории