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: Лексический анализ

Задачи:

  1. Реализовать грамматику токенов в ANTLR4
  2. Создать лексический анализатор
  3. Обработать основные типы лексем:
    1. Числовые литералы
    2. Идентификаторы
    3. Операторы и разделители

Тестовые примеры:

x = 5;
y = 3.14 * (2 + x);

Результат: Токенизатор, возвращающий последовательность токенов.

Лабораторная 2: Синтаксический анализ (Парсинг)

Задачи:

  1. Реализовать синтаксические правила
  2. Построить парсер с помощью ANTLR4
  3. Сгенерировать абстрактное синтаксическое дерево
  4. Реализовать визитор для обхода AST

Тестовые примеры:

a = 10;
b = a * (2 + sin(3.14/2));

Результат: Парсер, строящий AST для корректных выражений.

Лабораторная 3: Семантический анализ

Задачи:

  1. Реализовать таблицу символов
  2. Проверить типы выражений
  3. Валидировать существование переменных
  4. Реализовать базовые функции (sin, cos, sqrt)

Функции проверки:

  1. Проверка объявления переменных
  2. Валидация типов в операциях
  3. Проверка аргументов функций

Результат: Семантически проверенное AST.

Лабораторная 4: Генерация кода

Задачи:

  1. Сгенерировать LLVM IR для выражений
  2. Реализовать поддержку переменных
  3. Добавить математические функции
  4. Создать исполняемый файл

Генерация кода для:

x = 2 * (3 + 4);  // -> 14

Результат: Работающий компилятор, генерирующий исполняемый код.

Расширенные возможности

Для повышения оценки можно реализовать:

Примеры реализации

Базовая структура проекта

math_compiler/
├── grammar/
│   ├── MathLexer.g4
│   └── MathParser.g4
├── src/
│   ├── ast/
│   ├── semantic/
│   └── codegen/
├── tests/
└── requirements.txt

Рекомендуемые ресурсы

Оценка и критерии

Критерий Базовый уровень Продвинутый уровень
Лексический анализ Базовые токены Поддержка всех токенов + ошибки
Синтаксический анализ Простые выражения Полная грамматика + AST
Семантический анализ Проверка типов Полная валидация + оптимизации
Генерация кода Базовый LLVM IR Оптимизации + JIT

← К списку лабораторных | На главную