| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
операции. Маркер делит строку на три части, условно: A B C — до, под маркером
и после маркера (некоторые из которых могут иметь нулевой размер). Ну так
-*"ххх" вставит ххх перед маркером (т.е. между A и B), +*"ххх" — после маркера
(т.е. между B и C), а просто *"ххх" — вместо маркера (т.е. удалив
предварительно фрагмент B). Но при нулевом размере фрагмента B всё это — без
разницы (во всех трёх случаях вставит между A и C). А вот операция / без
причитающегося ей числового операнда, который бы указал ей, сколько символов
удалять, для -/ / +/ удалит части A, B и C соответственно.
Таким образом операции * причитается строчный операнд, / числовой, ~ тоже
числовой, а операциям ^ и $ — не причитаются. И префиксы на них тоже не
действуют. (Не придумал пока, что бы это значило. Хотя есть идеи...)
Разумеется операнд может быть не только константой (это было бы слишком
грустно и не универсально), но и значением переменной: #Х (где Х — буква или
цифра), и результатом вычисления выражения: {...} и даже #{...}.
(Противоположные операции =Х и ={...} тоже очень даже имеют смысл!)
Целая часть числа берется из фокаловской переменной со специфическим именем
#Х, которая, впрочем, от других переменных ничем кроме имени не отличается.
А вот строка (если Х — цифра, так что лучше писать как #N =N) — из "регистра"
форматного механизма. Которых получилось ровно десять штук. И операцией =N
туда же помещается: для -=N =N +=N берутся части строки A B и C соответственно.
Одновременно в фокаловскую переменную с именем #N пишется размер этого
фрагмента. Для -=Х =Х +=Х (где Х — буква) — только размер.
Числовое выражение в {...} отличается от обычного только тем, что там не
должно быть лишних пробелов, и надо по-аккуратней с как раз и заменяющим
пробел символом _ (подчеркивание). А строчное отличается от него тем, что
начинается со строчной константы ("..." ! :N) и единственная операция -
сцепление входящих туда компонентов ("конкатенация"), которая, впрочем, никак
не обозначается — просто перечень компонентов, может быть разделенных
подчеркиваниями (чисто для красоты и наглядности). Понадобилась например на
случай, когда нам нужны все три кавычки: "'` (там это будет {'"'_"'"_"`"}).
Числовые значения, если встретятся, обозначают коды символов. Еще внутри {...}
допускается конструкция =Х — присваивание, но не до, как например в операторе
Set, а ПОСЛЕ того как вычислено то, что хотим присвоить.
#{...} и ={...} — форматные преобразования. (Еще более форматные, чем само
форматное выражение, компонентом которого являются, хотя казалось бы что
форматней уже некуда.) Формат там внутри — позаимствованный у Си-шных функций
printf() и scanf(), да и сами эти конструкции являются их аналогами. (Вот
только о преобразовании в код как-то не. Что то тут недодумано...)
И теперь, когда у нас появились регистры форматного механизма, везде, где
по смыслу допустимо "..." может быть не только ! указывающий на А2 но и :цифра
указывающая на один из этих регистров. (Но опять же кроме операторов Ask, Type
и функции FCHr которые и без того со всем этим работают.)
Write Reg; выдаёт текущее содержимое аккумулятора А2 и регистров,
а Eraze Reg; очищает их. (Но вроде бы только со второй очереди?)
* * *
Это была первая очередь форматного механизма оператора Write %
Она включает так же префикс повторения @ для организации циклов и круглые
скобки для группировки операций: префикс повторения (так же как и + -) действует
только на один элемент, но (в отличии от + -) не только на отдельную операцию,
но и вот на такую группу. Например: Write %@(+"Васисуалий"*"Вася").... здесь
все найденные вхождения слова "Васисуалий" будут заменены на слово "Вася", но
остаток форматного выражения, обозначенный здесь как .... выполнен не будет,
потому что очереднной поиск слова "Васисуалий" завершится неуспешно и на этом
закончится не только цикл, но и выполнение всего форматного выражения.
На этот случай есть постфиксы условного выполнения: & ? выполняющие (или
пропускающие) следующую после них операцию для случаев успешности выполнения
предыдущей, неуспешности, а так же ? предусматривающий оба варианта. То есть
например, если в: Write %+"Вася"(^*"###").... фрагмент "Вася" не найден то
выполнение форматного выражения (остаток которого обозначен как ....) всё равно
продолжится. Но строчка без Васи будет помечена в начале символами "###". Если
подобного нам не надо — после можно поставить ничего не делающую "пустую"
операцию _ (подчеркивание).
Префикс повторения может иметь как числовой операнд, просто указывающий
количество повторений, так и заключенный в {} заголовок, аналогичный заголовку
оператора For. Префикс повторения с загловком но без тела цикла вместе с
постфиксом составляет условное выражение.
Кроме того, в первой очереди предусмотрена операция ! для немедленного
прекращения выполнения форматного выражения и одновременно подавления вывода
строки из А2. (В том числе с префиксами + и — "со скандалом": прекращением
работы оператора Write в т.ч. и с ошибкой 3.6 или какой указано), и
противоположная к ней операция . (точка) предписывающая немедленный вывод
строки из А2 (с префиксами — одной из частей строки). Есть даже обращение к
подпрограмме: %Цифра (где цифра указывает один из регистров). Но нету ни
одного встроенного формата, для которых и приберегаются буковки, ни "шаблонов"
(они же "регулярные выражения") в виде конструкции <...> (Вернее шаблоны-то
как раз сперва были, но потом отправились на реконструкцию.)
С появлением операции ! устройство NUL более не надобно: Write %! "метка"
* * *
Шаблоны и некоторые встроенные форматы (те самые, для которых мы и
приберегали буковки), в том числе преобразования из одной кодировки в другую,
можно считать "второй очередью".
Шаблон (он же "регулярное выражение") — конструкция вида <....> так же как
и "....", нужен для поиска фрагмента строки (это — "анализирующий" шаблон),
ну и конешно как правый операнд операции вставки * (звёздочка), указывающий что
именно ей вставлять ("генерирующий"). Шаблон <....> отличается от текстовой
константы "...." тем, что в ней каждый символ изображает самого себя (кроме
ограничивающих конструкцию кавычек, разумеется), а в шаблоне некоторые из
символов имеют специальный смысл. Например . (точка) изображает вовсе не точку
а заменяет собою абсолютно любой символ; ^ и $ — изображают начало и конец
строки в аккумуляторе, а ! (восклицательный знак) — СИМВОЛ конца строки, что
совсем не тоже самое! Да, такой символ УКАЗЫВАЕТ на конец строки; оператор Ask
читая из А2 очередную строку, определяет где у неё конец вот по такому
символу... А состоит он как правило из ДВУХ символов, известных как "перевод
строки" (ПС, он же 'n' в языке Си) и "возврат каретки" (ВК, 'r') с кодами
10 и 13. Именно с этой парой (в любом порядке) ! и сопоставляется. Но так же
если один из них (тоже любой) — в гордом одиночестве. Соответственно, в конце
строки такой "символ" как правило и присутствует. Но совсем не обязательно...
Да и вставить его можно посередь строки, разрывая её надвое...
Так что <.$.> или <.^.> — заведомо ни с чем не сопоставятся. Потому
что ни до начала строки ни после её конца никаких символов быть не может
просто по определению, а вот <.!.> — очень даже может.
А главный баламут всея Фокала символ % (процент) отбирает у таких вот
специальных символов их специальный смысл, заставляя изображать самоё себя.
Но и придаёт некоторым "обычным" символам специальный смысл "встроенного
шаблона", изображающего собою группу символов. Например: %c — любая цифра,
%b — любая буква, %r — любая русская, %l — любая латинская, а вот %л и %Л
только заглавная и только строчная. Аналогично для русских букв %р %Р и для
букв вообще %б %Б. И кроме того %Г %г %G %g — любой символ псевдографики;
%С %с %S %s — строка в кавычках; %П %п %P %p пробел и "слепые" символы (с
кодом меньше чем у пробела). При чем для %П %п — плюс знаки препинания,
способные завершать слова . , : ; ! ? и конец строки. При чем %П и %P
сопоставляются с одним, а %п и %p — с нулём таких символов, то есть просто
обнаруживают конец слова.
Однако, сила и мощь регулярных выражений — в * ? ("повторение")...
Регулярные выражения встречаются... ну не то что бы сплошь и рядом, но
по-моему достаточно известны — используются при поиске. Чего либо. Например
файлов в каталоге командой операционной системы: DIR имя_файла где вместо
конкретного имени может быть и вот такой шаблон. Где * (звёздочка), которая в
именах файлов не встречается, заменяет собою любое количество любых символов,
в том числе и ни одного, а ? (вопросительный знак) — ровно один символ, но
тоже любой. (В именах файлов ? разумеется тоже не встречается.) Например под
шаблон "*ася" подойдёт и "Вася" и "вася" и "мася" и "ася" и "ЫЫася" и "123ася",
а под "?ася" только три первые.
Следует заметить, что и в ДОС`е и в винде механизм этот сделан крайне
халтурно. И как он себя поведёт, когда в шаблоне две звёздочки — одному Аллаху
известно.
А вот в UNIX`овском ls — всё по честному. И есть еще один элемент: [...]
заменяющие собой тоже один символ, но не любой, а один из внутри перечисленных.
Или его негативный вариант [~...] — любой из внутри не встречающихся. Внутри
могут быть как сами эти символы, так и "диапазон": чтобы не перечислять все с
подряд идущими кодами. Например: [a-zA-Z] это все латинские буквы. С русскими
буквами такой простой фокус к сожалению не получается. Очень уж от кодировки
зависит...
Но таки в файловых системах вариант регулярных выражений — крайне
упрощенный (можно даже сказать "выхолощенный"). Это как если бы в выражении
арифметическом почему-то нельзя было использовать скобки. И функции. Но ведь
можно же! А здесь у нас этих скобок — аж два вида: <...> и [...]
Кстати, напоминаю: регулярное выражение потому и "шаблон", что
"сопоставляется" с фрагментом строки, определяет — подходит он под него или
нет. Ну так конструкция <...> сопоставляется когда сопоставились все её
элементы, а конструкция [...] — когда один, любой. (Следующие после него даже
и не рассматриваются). А элементом может быть любая конструкция, в том числе и
вот такая. В результате чего они могут вкладываться друг в дружку как матрешки
на любую глубину. Как впрочем и подвыражения в арифметических выражениях...
Повторюсь: главная фенька шаблонов — префиксы повторения! Здесь * и ? не
сами заменяют какое получится количество символов, а только предписывают
сделать это следующему после них элементу. Так что вместо просто звёздочки
придётся написать *. а *А соответственно сопоставится с любым количеством
букв А идущих подряд — от того места, до куда дошло сопоставление.
Но количество повторений может быть и ограничено: {N} или {N,M} — ровно N,
или >= N но <= M где N и M — фокаловские выражения. Если отсутствуют то для
первого — "от 0", а для второго — "до бесконечности". Так что * это {,} а
? это {,1}. Есть еще + (плюс) эквивалентный {1,} и — (минус) предписывающий
данному префиксу не "жадный", а "ленивый" алгоритм сопоставления. Их смысл
ясен из названия и проявляется, когда элементов с префиксами повторения в
шаблоне несколько...
Впрочем, хватит и одного. Например в тексте _____аББаБа___ ленивый *-[Ба]Б
выделит только аБ в то время, как жадный *[Ба]Б всё аББаБ целиком.
Среди вышеупомянутых встроенных шаблонов есть так же %Д %В %И %К %У
изображающие заглавные русские буквы в других кодировках и %д %в %и %к %у
изображающие строчные (дД — в ДОС`овской, она же CP-866, вВ — в виндовой, она
же CP-1251, иИ — ИСО-8859.5, кК — КОИ-8 а так же уУ — пресловутый уникод.)
На предмет преобразования символов между кодировками: типа в анализирующем
шаблоне указана одна, а в парном к нему генерирующем — другая. Только русские,
потому, что латинские там везде как в ASCII. (Который содран с давнего
стандарта ISO. А его похоже спёрли у фашистов: климат — великая вещь! Казалось
бы — что такого, подумаешь... А ничего, что в европах даже при ручной обработке
почвы один земледелец кроме себя мог прокормить еще одного горожанина, а у нас
для этого надо было десять крестьян? И результаты труда вот этих лишних
работников накапливаются из года в год, из века в век... Или же с приятностью
проедаются... Немцы смогли это грамотно использовать, приняв во всех своих
землях еще аж в конце XVIII века, когда и Германии-то еще небыло, законы об
обязательном всеобщем школьном образовании. Над которыми долго потешались все
остальные европеи. Но лет через сто — к концу XIX века это уже была "страна
хорошистов и отличников". И по очень многим пунктам — "впереди планеты всей".
Вплоть до того, что тогда в мире было две науки: мировая (читай
англо-саксонская) — отсталая, и немецкая — передовая. А Первую Мировую немцы
проиграли (уже практически выигрывая "по очкам") чисто в результате
предательства собственной элиты: договорняка вишь им захотелось... (Нашли с
кем договариваться!) Возвращаясь к нашей теме: еще до Второй Мировой у них
уже была телетайпетная сеть с автоматической коммутацией, сопоставимая по
эффективности с нынешним интернетом. Вот нулевая страница ASCII и заполнена в
основом командами управления этой сетью. Ну и телетайпом немножко. В пятибитном
коде, используемом тогда в телеграфии, сунуть эти команды было просто некуда.
Поэтому и понадобился вот этот вот семибитный. Который потом и превратился в
ASCII...) Так что шаблона %L для них всех вполне достаточно. Вот если и когда
будет какая либо экзотика, типа собственной ("нативной") американской кодировки
с неприличным названием ЕБЗДИК или её вариант с русскими буквами ДКОИ, активно
использовавшийся в серии ЕС-ЭВМ, сдуру содранной с идиотской IBM-360, что,
помнится, еще Дейкстра назвал величайшей победой запада в холодной войне!...
Разумеется, в самом форматном выражении преобразования символов между
кодировками обозначаются теми же самыми буквами. (И тоже только русскими.)
При чем заглавная буква указывает преобразование "на экспорт" — из текущей
кодировки в указанную, а строчная — из указанной в текущую. (Которая — всегда
ДОС`овская.) Преобразуется тот фрагмент строки, что под маркером. Но префиксы
на это тоже действуют.
Из других "встроенных форматов" (кроме перекодировок) пока только R r
| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |