более развитая онтология типов данных. Shell и Tcl обладают сравнительно простой онтологией, a Perl, Python и Java — более сложной. Данные универсальные языки подробнее рассматриваются в главе 14.
8.2. Применение мини-языков
Разработка программ с помощью мини-языков затрагивает две отдельные проблемы. Одна из них заключается в том, чтобы уметь пользоваться имеющимися в инструментарии мини-языками и понимать, когда их можно применять такими, как они есть. Другая проблема — знать, когда целесообразно разрабатывать для приложения нестандартный мини-язык. Для того чтобы помочь читателю развить оба аспекта конструкторского мышления, почти половина данной главы состоит из учебных примеров.
8.2.1. Учебный пример:
В главе 6 рассматривалась утилита
Однако SNG действительно имеет одну общую важную характеристику с узкоспециальными мини- языками, которую не поддерживают структурированные двоичные форматы данных, подобные PNG, — прозрачность. Структурированные файлы данных позволяют без использования мини-языка взаимодействовать средствам редактирования, преобразования и создания, которые не имеют информации о конструкторских 'предположениях' друг друга. В случае SNG добавляется то, что данный формат как узкоспециальный мини-язык, предназначен для простого просмотра и редактирования с помощью универсальных средств.
8.2.2. Учебный пример: регулярные выражения
Одним из видов спецификации, который периодически появляется в инструментах Unix и языках сценариев, является
В данном введении не рассматриваются такие подробности, как POSIX-расширения, обратные ссылки и особенности интернационализации. Более подробное изложение способа их применения представлено в книге
Регулярные выражения описывают шаблоны, которые могут либо совпадать, либо не совпадать со строками. Простейшим средством для работы с регулярными выражениями является утилита
Таблица 8.1. Примеры регулярных выражений
Регулярное выражение | Соответствующая строка |
---|---|
'x.y' | x, за которым следует любой символ с последующим у |
'x.y' | х, за которым следует точка с последующим у |
'xz?y' | х, за которым следует не более одного символа z с последующим у, т.е. 'xy' или 'xzy', но не 'xz' или 'xdy' |
'xz*y' | х, за которым следует любое количество символов z, за которыми следует y, т.е. 'xy' или 'xzy' или 'xzzzy', но не 'xz' или 'xdy' |
'xz+y' | x , за которым следует один или несколько экземпляров символа z , за которыми следует у, т.е. 'xzy ' или 'xzzy ', но не 'xy ', 'xz ' или 'xdy ' |
's[xyz]t' | s , за которым следует любой из символов х , у или z , за которым следует t , т.е. 'sxt ', 'syt ' или 'szt ', но не 'st ' или 'sat ' |
'a[x0-9]b' | а , за которым следует либо х , либо символ в диапазоне 0-9, за которым следует b , то есть, 'axb ', 'a0b ' или 'а4b ', но не 'ab ' или 'aab ' |
's[^xyz] t' | s , за которым следует любой символ, кроме х , у или z , за которым следует t , т.е. |