Разработка интегрированной среды разработки и исполнения программ на языке Pascal--, поддерживающей:
- написание и анализ кода;
- синтаксическую проверку;
- выполнение программ с пользовательским вводом и базовой логикой.
- Представление текста в виде иерархического списка (приближённо — абстрактное синтаксическое дерево).
- Поддержка базовых конструкций Pascal--:
const,var,begin...end,if ... then ... else,Read,Write.- Арифметические и логические выражения.
- Вложенные блоки и условные операторы.
Хранение переменных и констант в одной из структур (на выбор):
- упорядоченная таблица;
- дерево поиска;
- хеш-таблица.
Каждая запись должна содержать:
- имя;
- тип (
integer,double); - значение.
- Выражения (арифметические и условные) преобразуются в постфиксную форму (Reverse Polish Notation).
- Исполнение производится с использованием стека.
Поддерживаемые операторы:
- Арифметические:
+,-,*,/,div,mod. - Логические:
=,<>,<,>,<=,>=.
Исполняемые действия:
- Построчное выполнение с учётом вложенных блоков;
Read— пользовательский ввод;Write— вывод значений.
- Сборка синтаксического дерева.
- Проверка структуры программы:
- отсутствие
begin/end; - несоответствие типов;
- недопустимые символы или конструкции;
- неверные имена переменных и констант.
- отсутствие
- Консольный (редактирование необязательно) или графический интерфейс (по желанию).
- Возможности:
- загрузка и отображение программ;
- запуск и вывод результатов;
- отображение ошибок.
Пример исходной программы:
const a = 5;
var x, y;
begin
Read(x);
y := a * x + 3;
if y > 10 then
Write(y)
else
Write(a)
end.Ввод: x = 2
Результат: Write -> 13
(так как y = 5 * 2 + 3 = 13 > 10, выводится 13)
Ввод: x = 1
Результат: Write -> 5
(так как y = 8, выполняется else, выводится a = 5)
- Язык реализации: C++.
- Поддержка сборки в Visual Studio.
- Подключение Google Test для модульного тестирования.
- Структура проекта:
Parser/— синтаксический анализ;Executor/— выполнение программ;SymbolTable/— таблица идентификаторов;RPN/— постфиксная форма и стек.
| Участник | Задачи |
|---|---|
| Долов Вячеслав | Таблица идентификаторов, структура программы |
| Константинов Семён | Интерпретатор, пользовательский интерфейс |
| Кутергин Валентин | Постфиксный калькулятор, синтаксический разбор |
| Неделя | Задачи |
|---|---|
| 1 | Подготовка технического задания, создание репозитория |
| 2 | Анализ предметной области, список объектов и алгоритмов |
| 3 | Проектирование классов, структура программы |
| 4 | Заготовки классов, пустые юнит-тесты |
| 5–7 | Реализация компонентов, тестирование, интеграция |
| 8 | Финальная проверка, документация, сдача проекта |
Тестирование должно включать:
- Проверку всех операций с идентификаторами:
- Добавление, поиск, извлечение;
- Поведение при дублирующихся именах;
- Корректность вычислений:
- Арифметические и логические выражения;
- Преобразование в постфиксную форму;
- Вычисление выражений, включая вложенные;
- Проверку интерпретации:
- Выполнение вложенных блоков;
- Обработка
ReadиWrite;
- Обнаружение ошибок:
- Деление на ноль;
- Неинициализированные переменные;
- Ошибки синтаксиса (
:=,;,begin/end); - Недопустимые идентификаторы и символы.
- Исходный код — в репозитории GitHub.
- Документация (файл
README.md) — с инструкцией по сборке и запуску. - Примеры программ — для демонстрации возможностей.
- Отчёт о тестировании — с описанием покрытых случаев.
Описание: Выполняет выражения в постфиксной форме через стек.
Методы:
double Evaluate(const std::vector<Token>& postfix)— вычисление значения;- Поддержка переменных (доступ к таблице символов);
- Обработка ошибок: деление на ноль, неизвестная переменная и т.п.
Описание: Представляют иерархический текст программы.
Методы:
void AddChild(ASTNode*);void Execute()— рекурсивное выполнение;void CheckSyntax()— проверка синтаксической корректности.
Описание: Главный интерпретатор — обходит дерево программы и выполняет действия.
Методы:
void Run(ASTNode* root)— запуск исполнения;void ExecuteBlock(ASTNode*),void ExecuteIf(ASTNode*)и т.п.;- Использует
RPNExecutorиSymbolTable.
Описание: Отвечает за лексический анализ программы — разбиение текста на лексемы.
Типы токенов:
enum class TokenType { Keyword, Identifier, Number, Operator, Separator, StringLiteral, EndOfFile, ... };
Описание: Выполняет парсинг и проверку на корректность грамматики.
Методы:
ASTNode* BuildAST(const std::vector<Token>& tokens)std::vector<Token> GenerateRPN(ASTNode* node)