Разработан интерпретатор для упрощенного языка программирования с поддержкой объявления и вызова функций. Реализация выполнена на языке Java и состоит из трех независимых компонентов:
- Scanner (лексический анализатор) - преобразует исходный текст в последовательность токенов
- Parser (синтаксический анализатор) - строит древовидное представление программы (AST)
- 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/ # Директория для пользовательских программ
void test(int x) { print(x); print(2); } test(3);
Вывод:
3
2
int add(int a, int b) { return a + b; }
void show(int n) { print(n); }
show(add(5, 3));
Вывод:
8
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 build -t translator-java .docker run -it --rm translator-javaВведите код программы, завершите ввод комбинацией Ctrl+D.
# Пример 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# Создайте файл с программой
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# Запуск интерактивно
docker-compose run --rm translator
# Запуск с примером
docker-compose run --rm translator /app/examples/example1.txtjavac *.javajava Main# Из папки examples
java Main examples/example1.txt
# С пользовательским файлом
java Main myprogram.txtПри запуске без аргументов программа переходит в интерактивный режим:
Введите код программы (пустая строка для завершения):
>
Введите код программы построчно. Для завершения ввода введите пустую строку или завершите программу точкой с запятой.
Для выполнения программы из файла передайте путь к файлу как аргумент:
java Main программа.txt-
Три уровня диагностики ошибок:
- Лексические ошибки (некорректные символы)
- Синтаксические ошибки (нарушение грамматики)
- Семантические ошибки (необъявленные переменные/функции)
-
Встроенная функция:
print(value)- выводит значение аргумента
-
Ограничения языка:
- Поддерживается только целочисленный тип
int - Нет условных операторов и циклов
- Переменные локальны в пределах функции
- Поддерживаются только операции
+и-
- Поддерживается только целочисленный тип
При запуске программы отображается:
- Исходный код программы
- Результат лексического анализа (список токенов)
- Результат синтаксического анализа (сообщение об успешном построении AST)
- Подробный процесс выполнения с отладкой
- Финальный результат выполнения
Каждая ошибка сопровождается информацией о месте возникновения:
- Номер строки и позиция в исходном коде
- Категория ошибки (лексическая/синтаксическая/семантическая)
- Конкретное описание проблемы
Проект включает три тестовых примера в папке examples/, демонстрирующих основные возможности интерпретатора:
- Простые вызовы функций
- Работу с параметрами
- Возврат значений
- Вложенные вызовы функций
Немков Даниил
Группа: КМБО-05-23
Вариант: 15
Дисциплина: Проектирование трансляторов
Учебный проект для лабораторной работы №5 по курсу "Проектирование трансляторов".