5.3.1.3. Средства поиска на основе шаблонов
Средства поиска на основе шаблонов в качестве входных данных получают исходный код на языке программирования и запрос на языке шаблонов (образцов). На выходе выдается информация о том, какие строки исходного программного кода соответствуют спецификации шаблона.
В запросе можно также указать поиск последовательности операторов. В таком случае запрос понимается как поиск указанной последовательности операторов в любом месте исследуемого кода. Вся последовательность воспринимается как один запрос.
Для того чтобы специфицировать запрос к исходному коду, используется язык образцов. Язык образцов для спецификации запроса является расширением базового языка. Расширения включают набор специальных символов, которые используются для замены синтаксических сущностей базового языка. Без учета дополнительных расширений запрос может состоять из участка программы для осуществления конкретного поиска по исходному тексту. Когда же спецификация запроса включает дополнительный символ или символы, то они играют роль абстрактных шаблонов. Шаблоны потенциально могут быть заменены реальными фрагментами кода в соответствии с семантикой того или иного символа.
Специальные символы языка запросов применяются для замены синтаксических сущностей, таких как:
декларация произвольной переменной с указанием произвольного типа;
произвольный идентификатор, константа или выражение;
произвольный формальный параметр или группа формальных параметров;
произвольный оператор или группа операторов.
Запросы могут быть следующих типов:
поиск декларации (как локальной, так и глобальной);
поиск определения функции, спецификация кода которой описана в запросе;
поиск группы операторов в произвольном участке кода.
Для примера приведено несколько конструкций запросов. В качестве базового языка выбран язык С.
Найти все операторы цикла while, в которых происходит сравнение какого-нибудь выражения на неравенство его нулю. Запрос будет выглядеть так: while (# != 0) @. На основе данного запроса система производит поиск всех операторов while, удовлетворяющих вышесказанному условию, на любом уровне вложенности. Знак # - это шаблон для произвольного выражения, а @ - шаблон для произвольного оператора. Такой запрос может оказаться полезным, если необходимо выявить все конструкции в программе с таким условием, с целью их замены на while (#) @.
Найти все вхождения трех подряд идущих операторов if. Запрос будет выглядеть так: if (#) @ if (#} @ if (#) @. Целью такого запроса может стать локализация потенциальных кандидатов на преобразование последовательных операторов if в оператор switch.
Найти все вхождения оператора if, где в качестве условия возможно ошибочное использование оператора присваивания = вместо равенства ==. Запрос будет выглядеть так: if (# = #) @. Целью такого запроса может стать локализация часто встречающейся ошибки в коде на языке С, когда в выражениях сравнения используется оператор присваивания.
Найти последовательности операторов, в которых три или более операторов if встречаются подряд, причем возможно их разделение другими операторами. Запрос будет выглядеть так: if (#) @ @* if (#) @ @* if (#) @. Целью такого поиска может стать локализация участков с большой цикломатической сложностью - в данном примере имеется восемь различных путей управления через данную последовательность операторов.
- 5. Системы программирования
- 5.1. Введение в системы программирования
- 5.1.1. Основные понятия и определения
- 5.1.2. История и эволюция
- 5.1.2.1. Некоторые важные даты
- 5.1.2.2. Основные этапы в формировании состава систем программирования
- 5.1.2.3. История развития системы программирования компании Borland Inc. На базе языка Pascal
- 5.1.3. Классификация
- 5.1.3.1. Классификация по ориентации на поддержку процессов
- 5.1.3.2. Функциональная классификация
- 5.1.3.3. Классификация по категориям
- 5.1.3.4. Классификация по предоставляемому интерфейсу
- 5.1.4. Проблемы и перспективы развития
- 5.1.5. Рекомендации по литературе
- 5.2. Процесс-ориентированный инструментарий
- 5.2.1. Возникновение и исследование идеи
- 5.2.2. Управление
- 5.2.2.1. Системы управления проектами
- 5.2.2.2. Организационные средства
- 5.2.2.3. Средства оценки качества
- 5.2.3. Анализ требований и проектирование
- 5.2.3.1. Системы на основе структурной методологии
- 5.2.3.2. Системы на основе объектно-ориентированной методологии
- 5.2.4. Программирование (реализация)
- 5.2.4.1. Трансляторы
- 5.2.4.2. Компиляторы
- 5.2.4.3. Системы генерации трансляторов
- 5.2.4.4. Системы анализа корректности программного кода
- 5.2.4.5. Интерпретаторы
- 5.2.4.6. Декомпиляторы
- 5.2.4.7. Усложнители декомпиляции (шифраторы, обфускаторы)
- 5.2.4.8. Системы управления компиляцией и построением программ
- 5.2.5. Тестирование и отладка
- 5.2.5.1. Тестовые мониторы
- 5.2.5.2. Средства отслеживания тестового покрытия
- 5.2.5.3. Средства динамического построения профиля программы
- 5.2.5.4. Системы построения срезов программы
- 5.2.5.5. Отладчики
- 5.2.5.6. Системы отслеживания проблем (ошибок)
- 5.2.6. Ввод в действие
- 5.2.7. Сопровождение
- 5.2.8. Завершение эксплуатации
- 5.3. Универсальный инструментарий
- 5.3.1. Инструменты работы с текстом
- 5.3.1.1. Средства, базирующиеся на регулярных выражениях
- 5.3.1.2. Средства поиска различий
- 5.3.1.3. Средства поиска на основе шаблонов
- 5.3.1.4. Обозреватели и базы данных программ
- 5.3.1.5. Средства обнаружения плагиата
- 5.3.1.6. Текстовые редакторы
- 5.3.1.7. Синтаксически-ориентированные редакторы
- 5.3.1.8. Гипертекстовые средства
- 5.3.2. Системы документирования
- 5.3.3. Системы разработки интерфейсов
- 5.3.4. Системы управления базами данных
- 5.3.5. Системы управления базами знаний и экспертные системы
- 5.3.5.1. Системы искусственного интеллекта
- 5.3.5.2. Механизмы выводов на знаниях
- 5.3.5.3. Неточный вывод на знаниях
- 5.3.6. Электронные библиотеки и инструментарий Интернета
- 5.3.6.1. Парадигма усиления информации
- 5.3.6.2. Профессиональный поиск информации
- 5.3.6.3. Проблемы работы с информационными ресурсами Интернета
- 5.3.6.4. Коллекции информационных ресурсов в Интернете
- 5.3.6.5. Базы данных в Интернете
- 5.3.6.6. Краткая история поисковых средств Интернета
- 5.3.6.7. Искусственный интеллект и задача поиска в Интернете
- 5.4. Инструментарий поддержки процессов некоторых технологических подходов
- 5.4.1. Системы формального преобразования и верификации программ
- 5.4.2. Средства сборочного программирования
- 5.5. Инструментальные системы
- 5.5.1. Инструментальные среды программирования
- 5.5.2. Средства автоматизации разработки программ (case-средства)
- 5.5.3. Интегрированные среды
- 5.5.4. Репозитории проекта
- 5.6. Средства поддержки коллективной разработки
- 5.6.1. Системы разделения файлов
- 5.6.1.1. Система управления версиями файлов
- 5.6.1.2. Система управления пространствами
- 5.6.1.3. Система синхронизации удаленных пространств
- 5.6.2. Системы поддержки работы виртуальных групп
- 5.7. Естественно-языковый интерфейс
- 5.7.1. Диалоговые системы
- 5.7.2. Вопросно-ответные системы
- 5.7.3. Автоматизированные обучающие системы и системы контроля знаний
- 5.7.4. Системы искусственного интеллекта