Цель данной работы — разработать программную систему для компиляции и исполнения программы на языке программирования Pascal--.
Выполнение работы предполагает решение следующих задач:
- Разработка интерфейса системы классов для лексического анализа текста на языке Pascal--.
- Разработка интерфейса системы классов для cинтаксического анализа текста на языке Pascal--.
- Разработка интерфейса системы классов для семантического анализа текста на языке Pascal--.
- Разработка интерфейса системы классов для компиляции и исполнения кода на языке Pascal--.
- Реализация методов каждой системы классов.
- Разработка и реализация модульных тестов для классов.
- Публикация исходных кодов в командном репозитории на GitHub.
- Демонстрация результатов работы заказчику.
- Система контроля версий Git.
- Фреймворк для написания автоматических тестов Google Test.
- Среда разработки Microsoft Visual Studio.
- Утилита CMake для генерации проектов по сборке исходных кодов.
- Бугров Андрей
- Колесников Денис
- Цветков Алексей
Структура проекта:
gtest
— библиотека Google Test.base
— каталог с основным проектом ЛР.base_test
— каталог с проектом с модульными тестами.README.md
— информация о проекте.mp2-lab7-compiler.sln
- файл с решением (solution) для Microsoft Visual Studio.- Служебные файлы
.gitignore
— перечень расширений файлов, игнорируемых Git при добавлении файлов в репозиторий.CMakeLists.txt
— корневой файл для сборки проекта с помощью CMake.
- Поддержка обработки синтаксиса и языковых конструкций языка Pascal--.
- Поддержка контроля синтаксиса.
- Хранение текста программы в иерархическом списке.
- Хранение констант в таблице констант и переменных в таблице переменных (хеш-таблица).
- Выполнение вычислений арифметических выражений с помощью постфиксной формы.
Удаляет информацию из кода, которая не нужна во время разбора. Она включают в себя комментарии и пробелы в коде. Лексический анализ выявляет в входных данных следующие лексемы: ключевые слова, имена переменных и констант, арифметические операции, операторы. Результатом работы является иерархический список.
Синтаксический анализ следит за соблюдением формальных правил языка программирования. Проверяет, написана ли программа корректно, а затем определяет порядок выполнения команд.
Семантический анализ представляет связи и семантические правила языка программирования. Обрабатывает иерархический список, построенный лексическим анализатором. Анализатор определяет, обрабатываются ли операции в правильном порядке, и далее осуществляется анализ их типов и назначений. Также осуществялется проверка, содержит ли данное условие действительные (сопоставимые) выражения, строятся таблица переменных и констант.
Имитирует исполнение построенного кода.
Представляет собой дерево. У каждого звена есть указатели на потомков (находятся на уровень ниже) и следующее звено (находится том же уровне). Корнем дерева является звено, содержащее весь текст программы. Атомарный уровень - уровень элементарных операторов (операторов без вложенных операторов).
- Алгоритм прохода по списку - алгоритм Top-Down-Next.
Для расчета арифметических операций используется постфиксная форма. Она реализуется при помощи стека.
- Алгоритм перевода инфиксной формы в постфиксную:
- Перебираем инфиксную запись слева направо.
- Если входящий элемент число, то он добавляется в постфикс. Если входящий элемент операция (+, -, *, /) то происходит проверка:
- Если стек операций пуст или содержит левую скобку в вершине, то входящий элемент добавляется в стек.
- Если входящий элемент имеет более высокий приоритет чем вершина, он помещается в стек.
- Если входящий элемент имеет более низкий или равный приоритет, чем вершина, стек выгружается в постфикс, пока не обнаружится элемент с меньшим приоритетом или левая скобка на вершине стека, затем входящий элемент добавляется в стек.
- Если входящий элемент является левой скобкой, он помещается в стек.
- Если входящий элемент является правой скобкой, стек выгружается в постфикс, до тех пор пока на вершине стека не окажется левая скобка, которая удаляется из стека.
- В конце инфиксной записи все элементы, оставшиеся в стеке, выгружаются в постфиксную запись.
Структура данных, реализованная на таких структурах хранения, как список и массив. Положение элемента задаётся хэш-функцией. Для разрешения коллизий используется метод цепочек. Все записи, для которых функция хеширования определяет одно и то же значение, представляются в виде линейного списка.
- Алгоритмы:
- Поиск. Вычисление индекса с помощью хеш-функции. Проход по списку, расположенному по индексу в таблице, до совпадения ключа.
- Добавление. Вычисление индекса с помощью хеш-функции. Вставка в начало списка, расположенному по индексу в таблице.
- Удаление. Вычисление индекса с помощью хеш-функции. Проход по списку, расположенному по индексу в таблице до совпадения ключа, удаление найденной записи.
Интерфейс, обеспечивающий передачу информации между пользователем-человеком и программно-аппаратными компонентами компьютерной системы. В программе представлен в виде консольного интерфейса и предоставляет доступ к пользовательским операциям модулей программной системы. Служит для операций консольного ввода/вывода при непосредственной работе успешно скомпилированной программы.