User Tools

Site Tools


gram:case-001

This is an old revision of the document!


Кейс 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)

Функции проверки: - Проверка объявления переменных - Валидация типов в операциях - Проверка аргументов функций

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

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

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

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

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.1763089051.txt.gz · Last modified: by eugeneai