Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Виртуальные методы, напомню, требуют дополнительную память и ресурсы процессора
else if (type == Node::QUOTE)
open_node = static_cast<Title*>(open_node)->open_italic();
yacc/bisonВыглядят как г-но мамонта. Серьёзно? Глобальные переменные, чтение из stdin/FILE* (а если у меня в компиляторе исходники читаются из zip-потока, мне их в файл пересохранять?). Каждый найденный токен копируется в отдельную область памяти, чтобы сделать из него asciiz-строку (ладно, string_view тогда не было, но хотя бы кортеж [char*,size_t]). Перемешанный си-код с грамматикой (удачи подебажить). Если тупо хочу построить AST, а не сразу выдавать что-то наружу, всё равно надо писать кучу бойлерплейта.
буду рад увидеть yacc/bison (или любой другой кодогенератор) в проекте, куда приду работать, чем тонну недокументированного кодаТак там и будет тонна недокументированного кода, в файле с грамматикой. Только его ещё и не подебажишь — на выходе куски юзер-кода, перемешанные с кодом парсера.
использует bison и поддерживается больше 20 летМне интересно, что говорят в коммерческой разработке, когда появляется хотелка, не предусмотренная генератором (как пример выше с вложенными ф-циями). Говорят: «извините, это невозможно, у нас Бизон», или начинают корёжить грамматику, описывая некорректные конструкции как корректные, но транслирующиеся в код выдачи ошибки. Вот уж где граблей и костылей можно насобирать.
// main.cpp
#include «fgl_glut_t.h»
//=============================
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
auto my_gl = std::make_unique<MyGL::GlEngine>();
}
StaticFun::StaticFun()
{
auto *bispiral = std::make_unique;
if (!bispiral)
std::exit(0);
}
Искусство парсинга 2 или транслитерация собственной разметки