gram:case-001
Table of Contents
Кейс 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
Рекомендуемые ресурсы
Оценка и критерии
| Критерий | Базовый уровень | Продвинутый уровень |
|---|---|---|
| Лексический анализ | Базовые токены | Поддержка всех токенов + ошибки |
| Синтаксический анализ | Простые выражения | Полная грамматика + AST |
| Семантический анализ | Проверка типов | Полная валидация + оптимизации |
| Генерация кода | Базовый LLVM IR | Оптимизации + JIT |
gram/case-001.txt · Last modified: by eugeneai
