Skip to content

balunov-alex/cpp-preprocessor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

Проект: ПРЕПРОЦЕССОР

Этот проект представляет собой реализацию простого препроцессора на языке C++, который предназначен для обработки исходных файлов, содержащих директивы #include. Препроцессор рекурсивно обрабатывает все включённые файлы и объединяет их содержимое в один выходной файл. Основная цель проекта — продемонстрировать, как можно автоматизировать обработку файлов с вложенными включениями, а также как работать с файловой системой и регулярными выражениями в C++.


Основные функции и возможности

1. Обработка директив #include

Препроцессор поддерживает два типа директив #include:

  • Пользовательские включения: Директивы вида #include "file". Препроцессор ищет такие файлы сначала в той же директории, где находится исходный файл, а затем в указанных пользователем директориях.
  • Стандартные включения: Директивы вида #include <file>. Препроцессор ищет такие файлы только в указанных пользователем директориях.

Препроцессор рекурсивно обрабатывает все включённые файлы, что позволяет корректно обрабатывать сложные структуры проектов с множеством вложенных включений.

2. Поиск файлов в указанных директориях

Препроцессор позволяет указать несколько директорий для поиска включаемых файлов. Это особенно полезно в больших проектах, где заголовочные файлы могут находиться в разных местах. Поиск файлов осуществляется в следующем порядке:

  1. В директории, где находится исходный файл.
  2. В указанных пользователем директориях.
  3. Если файл не найден, препроцессор выводит сообщение об ошибке.

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

Если файл, указанный в директиве #include, не найден, препроцессор выводит сообщение об ошибке. Сообщение включает:

  • Имя файла, который не удалось найти.
  • Имя исходного файла, в котором произошла ошибка.
  • Номер строки, на которой была обнаружена директива #include.

Это позволяет быстро находить и исправлять ошибки в структуре проекта.

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

В проекте реализован тестовый сценарий, который проверяет корректность работы препроцессора. Тест создаёт несколько файлов с вложенными включениями и проверяет, что препроцессор корректно объединяет их содержимое. Тестовый сценарий включает:

  • Создание тестовых файлов и директорий.
  • Запуск препроцессора.
  • Проверку содержимого выходного файла.

Тест позволяет убедиться, что препроцессор корректно обрабатывает как пользовательские, так и стандартные включения, а также правильно ищет файлы в указанных директориях.


Как работает препроцессор

1. Чтение исходного файла

Препроцессор начинает работу с чтения исходного файла, указанного пользователем. Он построчно анализирует содержимое файла, используя регулярные выражения для поиска директив #include.

2. Обработка директив #include

Когда препроцессор встречает директиву #include, он выполняет следующие действия:

  1. Определяет тип включения (пользовательское или стандартное).
  2. Ищет файл в соответствующей директории.
  3. Если файл найден, препроцессор рекурсивно обрабатывает его содержимое.
  4. Если файл не найден, выводится сообщение об ошибке.

3. Запись результата

Все строки, которые не являются директивами #include, записываются в выходной файл без изменений. Таким образом, препроцессор объединяет содержимое всех обработанных файлов в один выходной файл.

4. Рекурсивная обработка

Препроцессор рекурсивно обрабатывает все включённые файлы. Это означает, что если файл, указанный в директиве #include, сам содержит другие директивы #include, они также будут обработаны. Это позволяет корректно обрабатывать сложные структуры проектов с множеством вложенных включений.


Пример использования

Предположим, у нас есть следующий набор файлов:

  • a.cpp: Основной файл, содержащий директивы #include.
  • dir1/b.h: Пользовательский заголовочный файл, который также содержит директивы #include.
  • dir1/subdir/c.h: Вложенный заголовочный файл.
  • include1/std1.h: Стандартный заголовочный файл.
  • include2/lib/std2.h: Другой стандартный заголовочный файл.

Препроцессор обрабатывает файл a.cpp, находит все включённые файлы, рекурсивно обрабатывает их содержимое и объединяет всё в один выходной файл. В результате получается файл, содержащий всё необходимое для дальнейшей компиляции.


Преимущества проекта

1. Автоматизация обработки файлов

Препроцессор автоматически обрабатывает все включённые файлы, что упрощает работу с большими проектами.

2. Гибкость

  • Поддержка пользовательских и стандартных включений.
  • Возможность указания нескольких директорий для поиска файлов.

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

Препроцессор выводит подробные сообщения об ошибках, что упрощает отладку.

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

В проекте реализован тестовый сценарий, который позволяет убедиться в корректности работы препроцессора.


Заключение

Этот проект демонстрирует, как можно реализовать простой, но мощный инструмент для обработки файлов с вложенными включениями. Препроцессор может быть полезен в различных сценариях, например:

  • Для автоматической обработки исходных файлов перед компиляцией.
  • Для анализа структуры проекта.

Проект также служит хорошим примером работы с файловой системой, регулярными выражениями и рекурсией в C++.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages