Skip to content

Repository files navigation

Лабораторная работа №5: Интерпретатор языка с функциями

Описание проекта

Разработан интерпретатор для упрощенного языка программирования с поддержкой объявления и вызова функций. Реализация выполнена на языке Java и состоит из трех независимых компонентов:

  1. Scanner (лексический анализатор) - преобразует исходный текст в последовательность токенов
  2. Parser (синтаксический анализатор) - строит древовидное представление программы (AST)
  3. Executor (исполнитель) - выполняет программу и выводит результат

Грамматика языка

<программа> ::= <объявления_функций> <вызов_функции> ";"
<объявления_функций> ::= <объявление_функции>+
<объявление_функции> ::= <тип_возврата> ИМЯ "(" <список_параметров> ")" "{" <тело_функции> "}"
<тип_возврата> ::= "void" | "int"
<список_параметров> ::= <параметр> ("," <параметр>)* | ε
<параметр> ::= "int" ИМЯ
<тело_функции> ::= <инструкция>* 
<инструкция> ::= <возврат> | <вызов_функции> ";" | "int" ИМЯ ";"
<возврат> ::= "return" <выражение>? ";"
<вызов_функции> ::= ИМЯ "(" <список_аргументов> ")"
<список_аргументов> ::= <выражение> ("," <выражение>)* | ε
<выражение> ::= <слагаемое> (("+" | "-") <слагаемое>)*
<слагаемое> ::= ЧИСЛО | ИМЯ | <вызов_функции>

Требования

  • Docker
  • Или Java 21+ (если запуск без Docker)

Структура проекта

translator-java/
├── Dockerfile              # Конфигурация Docker
├── docker-compose.yml      # Конфигурация docker-compose
├── README.md               # Этот файл
├── entrypoint.sh           # Скрипт запуска
├── Main.java               # Главный класс
├── TokenTypes.java         # Типы токенов
├── ASTNodes.java           # Классы AST узлов
├── ScannerModule.java      # Лексический анализатор
├── Parser.java             # Синтаксический анализатор
├── Executor.java           # Исполнитель
├── examples/               # Примеры программ
│   ├── example1.txt       # Простая функция
│   ├── example2.txt       # Функция с возвратом значения
│   └── example3.txt       # Вложенные вызовы функций
└── programs/              # Директория для пользовательских программ

Примеры программ

Пример 1: Простая функция (examples/example1.txt)

void test(int x) { print(x); print(2); } test(3);

Вывод:

3
2

Пример 2: Функция с возвращаемым значением (examples/example2.txt)

int add(int a, int b) { return a + b; }
void show(int n) { print(n); }
show(add(5, 3));

Вывод:

8

Пример 3: Вложенные вызовы функций (examples/example3.txt)

int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
void show(int n) { print(n); }
show(add(10, subtract(20, 5)));

Вывод:

25

Запуск с Docker

1. Сборка Docker образа

docker build -t translator-java .

2. Запуск в интерактивном режиме

docker run -it --rm translator-java

Введите код программы, завершите ввод комбинацией Ctrl+D.

3. Запуск с файлом из папки examples

# Пример 1
docker run --rm translator-java /app/examples/example1.txt

# Пример 2
docker run --rm translator-java /app/examples/example2.txt

# Пример 3
docker run --rm translator-java /app/examples/example3.txt

4. Запуск с пользовательским файлом

# Создайте файл с программой
echo "void hello() { print(1); print(2); } hello();" > myprogram.txt

# Запустите контейнер с файлом
docker run -it --rm -v $(pwd)/myprogram.txt:/app/program.txt translator-java /app/program.txt

5. Использование docker-compose

# Запуск интерактивно
docker-compose run --rm translator

# Запуск с примером
docker-compose run --rm translator /app/examples/example1.txt

Запуск без Docker (требуется Java 21+)

1. Компиляция

javac *.java

2. Запуск в интерактивном режиме

java Main

3. Запуск с файлом

# Из папки examples
java Main examples/example1.txt

# С пользовательским файлом
java Main myprogram.txt

Использование интерпретатора

Интерактивный режим

При запуске без аргументов программа переходит в интерактивный режим:

Введите код программы (пустая строка для завершения):
> 

Введите код программы построчно. Для завершения ввода введите пустую строку или завершите программу точкой с запятой.

Режим файла

Для выполнения программы из файла передайте путь к файлу как аргумент:

java Main программа.txt

Особенности реализации

  1. Три уровня диагностики ошибок:

    • Лексические ошибки (некорректные символы)
    • Синтаксические ошибки (нарушение грамматики)
    • Семантические ошибки (необъявленные переменные/функции)
  2. Встроенная функция:

    • print(value) - выводит значение аргумента
  3. Ограничения языка:

    • Поддерживается только целочисленный тип int
    • Нет условных операторов и циклов
    • Переменные локальны в пределах функции
    • Поддерживаются только операции + и -

Формат вывода

При запуске программы отображается:

  1. Исходный код программы
  2. Результат лексического анализа (список токенов)
  3. Результат синтаксического анализа (сообщение об успешном построении AST)
  4. Подробный процесс выполнения с отладкой
  5. Финальный результат выполнения

Обработка ошибок

Каждая ошибка сопровождается информацией о месте возникновения:

  • Номер строки и позиция в исходном коде
  • Категория ошибки (лексическая/синтаксическая/семантическая)
  • Конкретное описание проблемы

Тестирование

Проект включает три тестовых примера в папке examples/, демонстрирующих основные возможности интерпретатора:

  • Простые вызовы функций
  • Работу с параметрами
  • Возврат значений
  • Вложенные вызовы функций

Автор

Немков Даниил
Группа: КМБО-05-23
Вариант: 15
Дисциплина: Проектирование трансляторов

Лицензия

Учебный проект для лабораторной работы №5 по курсу "Проектирование трансляторов".

About

Интерпретатор упрощенного языка программирования с поддержкой функций

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages