Хабр / ML & AI
476 subscribers
5.44K links
Telegram-канал, где вы можете найти публикации из RSS-фидов тематических хабов "Машинное обучение" и "Искусственный интеллект" портала Хабр.

Данный канал не является официальным представительством платформы Хабр.

Администратор - @evilfreelancer
Download Telegram
QapGen: Создаём мощные парсеры на C++

QapDSLv2 — это язык который транслируется в обычный C++ код. Он позволяет удобно и компактно задавать грамматики/правила разбора кода программ, значительно упрощая разработку компиляторов/анализаторов/трансляторов.

QapGen — это генератор дерева_лексеров/парсеров описанных на QapDSLv2. Сама грамматика QapDSLv2 описана на QapDSLv2 на 100%. Поэтому QapGen как основной читатель этой грамматики сам генерирует часть своего кода(весь парсер QapDSLv2).

Основные фишки QapDSLv2 + QapGen — это:

1) Отсутствие этапа токенизации — дерево лексеров разбивает входной поток на лексемы и сохраняет их в строго типизированных древовидных С++ структурах пропуская этап токенизации.

2) Генерация оптимизированного кода полиморфных лексеров.

3) Полное сохранение всех лексем(даже разделители сохраняются, такие как пробелы/переходы на новую строку и комментарии) в результирующем дереве.

4) Возможность сохранить как оригинальное дерево, так и модифицированное обратно в код/текст без потери разделителей/комментариев.

5) Автоматическая генерация кода посетителей(это такой паттерн проектирования).

А теперь пример самой сочной части(рекурсивно самоописывающийся код):

structt_target_struct:i_target_item{

structt_keyword{

stringkw=any_str_from_vec(split("struct,class",","));

" "? // optional separator

};

structt_body_semicolon:i_struct_impl{";"};

structt_body_impl:i_struct_impl{

"{" // жрём скобочку

vectornested?; //рекурсия!

" "?

vectorarr?; // парсим поля

" "?

TAutoPtrc?; // остальной С++ код

" "?

"}"

};

structt_parent{

stringa_or_c=any_str_from_vec(split("=>,:",","));

" "?

t_namename;

};

//точка входа в парсер:

TAutoPtrkw?; //парсимstruct/class

t_namename; //парсим имя

" "?

TAutoPtrparent?;

" "?

TAutoPtrbody;

}; Читать далее

#parser #parser_generator #lexers #c_ #tree #ast #gamedev #dsl #compiler | @habr_ai