Средства, базирующиеся на регулярных выражениях 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Средства, базирующиеся на регулярных выражениях



Развитыми средствами определения шаблонов и осуществления поиска являются средства семейства grep в операционной системе Unix. Как grep, так и egrep могут искать участки текста, используя регулярные выражения. Наряду со специальными утилитами используются механизмы, встроенные в некоторые языки обработки текстов, например Perl (http://www.perl.org/).

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

  • Написание конкретного шаблона для поиска в исходном тексте может быть затруднительным, а иногда и невозможным. Например, пусть требуется локализовать два последовательных оператора цикла: цикл типа for, следующий за циклом типа while, причем оба с произвольными условиями и блоками операторов, на одном и том же уровне вложенности. Возможная спецификация для grep может быть такой:.*while.*for. Однако такая спецификация grep отыщет не только последовательные операторы цикла, но и вложенные. Дополнительно будут найдены такие последовательные операторы, которые непосредственно не следуют друг за другом. Кроме того, оба требуемых ключевых слова могут оказаться в комментарии.
  • Вторая проблема, связанная с использованием grep, заключается в написании шаблонов для отыскания деклараций. Рассмотрим написание шаблона для поиска декларации целой переменной х и символьной с. Поскольку порядок деклараций на одном и том же уровне вложенности в большинстве случаев не столь важен, они могут оказаться в любом порядке в исходном тексте. Поэтому для отыскания, например, двух деклараций с помощью регулярных выражений надо применять конструкцию такого вида: (.*int[ ]*x[ ]*;.*char[ ]*c[ ]*;) | (.*char[ ]*c[ ]*;.*int[ ]*x[ ]*;). Сложность же такой спецификации для более чем двух отыскиваемых деклараций очевидна. Если в исходном тексте была декларирована инициализированная целая переменная (int x=0;), то поиск для нее окажется неудачным в любом случае.
  • Третья проблема, которая может возникнуть при использовании средств семейства grep, связана со специальными символами. Обычно эти средства воспринимают символ "новая строка" как разделитель даже тогда, когда мы ищем выражение в многострочном контексте. Это особенно мешает поиску в исходном тексте, поскольку зачастую предмет поиска охватывает несколько строк. К тому же необходимость постоянно учитывать разделители (пробелы, символы "новая строка", символы табуляции) затрудняет составление регулярных выражений.

Регулярные выражения для поиска по шаблонам используются в утилитах ed, sed, awk и perl:

  • ed и sed являются текстовыми преобразователями. Они позволяют находить и заменять фрагменты, базируясь на регулярных подвыражениях (в случае sed - многострочных). Они тоже воспринимают входной текст как поток символов, что некорректно;
  • awk воспринимает входной текст как набор записей, и, несмотря на то, что это уже более подходящая абстракция, нежели символ, она все же не адекватна в применении к программному тексту. Семантически разные части могут оказаться в одной записи. Например, for (i=0;i<5,-i++) { - это все одна запись;
  • perl, в частности версии 5, обладает более широким механизмом регулярных выражений, но даже и они остаются не столь удобными для поиска в исходном тексте программы, поскольку не учитывают его особенности.

Средства поиска различий

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

Примеры таких систем:



Поделиться:


Последнее изменение этой страницы: 2021-01-08; просмотров: 70; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.41.187 (0.006 с.)