===== Кейс 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|На главную]]