Используем Flex — генератор лексических анализаторов на C • Live coding

Первая часть компилятора — лексический анализатор. Ну и что? А то, что, оказывается, код такого анализатора можно создать автоматически. И вместе с ним — коды многих и многих полезных программ для посимвольной обработки файлов. Одно только превращение CSV в двумерные массивы чего стоит! В общем, встречайте flex. Таймлайн: 00:02 — Вступление: «неприличная» тема, генераторы кода 01:33 — Что такое генератор лексических анализаторов (на примере Flex) 02:51 — Как работает результирующая программа: ищем шаблоны в потоке символов 04:12 — Зачем это нужно: повседневные кейсы «на вход подаётся…» 05:06 — Исторический контекст: компиляторы и первый этап — токенизация 06:12 — Поток символов → поток токенов: примеры (ключевые слова, числа, комментарии) 08:00 — Польза токенизированного потока вне компиляции 10:01 — Flex в Linux: что это, где лежит, зачем учить 11:02 — Поведение Flex: жадность матчей 11:43 — Модель конечного автомата (DFA) в основе Flex 12:48 — Практика: берём текст с числами (Фибоначчи) 14:34 — Структура .l-файла: три секции и where-вставки C-кода 16:13 — Паттерны как регулярные выражения: целые числа и игнор остального 19:04 — Заголовки, yylex(), stdio: собираем минимальную программу 21:21 — Makefile-пайплайн: flex → gcc (с -lfl) → запуск 22:54 — Заглядываем в сгенерированный C: ~1700 строк инфраструктуры 25:05 — Таблицы DFA: где «живёт» автомат 26:06 — Минимальный пример: извлекаем числа из текста 27:05 — Задача 2: суммируем все найденные числа 29:00 — Демонстрация суммы и небольшая уборка вывода 29:48 — Задача 3: проверяем, что последовательность — это Фибоначчи 34:52 — Демонстрация: корректная и «сломанная» последовательность 36:06 — Задача 4: вычисляем следующий элемент Фибоначчи 39:22 — Фикс типичной ошибки «== вместо =», получаем next=89 39:34 — Задача 5: печатаем номер строки для каждого числа (yylineno) 41:42 — Демо: числа с номерами строк 42:31 — Идея: автогенерация тестов на базе токенов 43:05 — Хуки Flex: YY_USER_ACTION — считаем позицию в строке 45:02 — Реализация счётчиков line/col и сохранение Tline/Tcol 50:09 — Проверка: совпадение колонок с Vim 51:16 — Дальнейшие возможности и ограничения 52:02 — Задача 6: генерируем C-код массива из найденных чисел 53:34 — Флаг первого элемента: убираем лишнюю запятую 55:28 — Макрос SIZE и подсчёт COUNT для размера массива на этапе препроцессора 58:07 — Демо: SIZE=10, аккуратный сгенерированный код 1:00:06 — Эксперимент: интерактивное «a + b = ?» на Flex 1:00:19 — Разбор готового примера (08) 1:01:11 — Почему stdin мешает ждать ввода и как это обойти 1:02:38 — Переназначаем источник ввода: работаем через файловый дескриптор 1:03:50 — Демо: мини-«викторина» по Фибоначчи 1:04:41 — Вывод: вынос stdin обязателен для интерактива 1:05:41 — Бонус: из CSV делаем двумерный массив (double) генерацией кода 1:06:48 — Паттерн для double и оговорки про точность шаблонов 1:07:50 — Демо: печать матрицы, замечание о хвостовой запятой 1:09:23 — Фишки Flex: вложенные токены/контексты (поиск «внутри» объектов) 1:10:16 — Альтернатива: re2c — быстрее и «промышленнее», но с goto; trade-offs 1:11:21 — Ещё раз смотрим на «монстра»: как выглядит автосгенерённый код 1:11:54 — Завершение: что брать от Flex и где его применять Конспект:

Смотрите также