===== Кейс 001: Арифметические выражения (gram:case-001) ===== === Общая информация === ^ Уровень сложности ^ 🟢 Начальный ^ ^ Рекомендуемые языки ^ Python, C++ ^ ^ Основные инструменты ^ ANTLR4, LLVM-lite ^ ^ Требуемые знания ^ Базовый синтаксис выбранного языка ^ === Описание кейса === Разработка компилятора для языка арифметических выражений с поддержкой переменных, базовых операций и функций. === Грамматика языка === ==== Лексические токены ==== NUMBER : [0-9]+ ('.' [0-9]+)? ID : [a-zA-Z_][a-zA-Z_0-9]* PLUS : '+' MINUS : '-' MUL : '*' DIV : '/' ASSIGN : '=' LPAREN : '(' RPAREN : ')' SEMI : ';' WS : [ \t\r\n]+ -> skip ==== Синтаксические правила ==== program : statement+ EOF statement : expr SEMI | ID ASSIGN expr SEMI expr : term ( (PLUS | MINUS) term )* term : factor ( (MUL | DIV) factor )* factor : NUMBER | ID | ID LPAREN expr (',' expr)* RPAREN | LPAREN expr RPAREN === План лабораторных работ === ==== Лабораторная 1: Лексический анализ ==== **Задачи:** - Реализовать грамматику токенов в ANTLR4 - Создать лексический анализатор - Обработать основные типы лексем: - Числовые литералы - Идентификаторы - Операторы и разделители **Тестовые примеры:** x = 5; y = 3.14 * (2 + x); **Результат:** Токенизатор, возвращающий последовательность токенов. ==== Лабораторная 2: Синтаксический анализ (Парсинг) ==== **Задачи:** - Реализовать синтаксические правила - Построить парсер с помощью ANTLR4 - Сгенерировать абстрактное синтаксическое дерево - Реализовать визитор для обхода AST **Тестовые примеры:** a = 10; b = a * (2 + sin(3.14/2)); **Результат:** Парсер, строящий AST для корректных выражений. ==== Лабораторная 3: Семантический анализ ==== **Задачи:** - Реализовать таблицу символов - Проверить типы выражений - Валидировать существование переменных - Реализовать базовые функции (sin, cos, sqrt) **Функции проверки:** - Проверка объявления переменных - Валидация типов в операциях - Проверка аргументов функций **Результат:** Семантически проверенное AST. ==== Лабораторная 4: Генерация кода ==== **Задачи:** - Сгенерировать LLVM IR для выражений - Реализовать поддержку переменных - Добавить математические функции - Создать исполняемый файл **Генерация кода для:** x = 2 * (3 + 4); // -> 14 **Результат:** Работающий компилятор, генерирующий исполняемый код. === Расширенные возможности === Для повышения оценки можно реализовать: * **Оптимизации:** постоянное свертывание, удаление мертвого кода * **Дополнительные типы:** булевы значения, строки * **Расширенный синтаксис:** условные выражения, циклы * **Поддержка JIT-компиляции** === Примеры реализации === ==== Базовая структура проекта ==== math_compiler/ ├── grammar/ │ ├── MathLexer.g4 │ └── MathParser.g4 ├── src/ │ ├── ast/ │ ├── semantic/ │ └── codegen/ ├── tests/ └── requirements.txt === Рекомендуемые ресурсы === - [[https://github.com/antlr/antlr4|ANTLR4 официальная документация]] - [[https://llvm.org/docs/tutorial/|LLVM Tutorial для начинающих]] - [[https://github.com/antlr/antlr4/tree/master/runtime/Python3/examples|Примеры реализации на GitHub]] === Оценка и критерии === ^ Критерий ^ Базовый уровень ^ Продвинутый уровень ^ | **Лексический анализ** | Базовые токены | Поддержка всех токенов + ошибки | | **Синтаксический анализ** | Простые выражения | Полная грамматика + AST | | **Семантический анализ** | Проверка типов | Полная валидация + оптимизации | | **Генерация кода** | Базовый LLVM IR | Оптимизации + JIT | ---- [[gram:labs|← К списку лабораторных]] | [[gram:main|На главную]]