Таблично-контекстное
редактирование определяется задаваемой Таблицей контекстов, основными позициями
которой являются 'контекст поиска' и 'контекст
замены'. Для табличного набора таких простых контекстных замен
действует основное правило редактирования:
Контекстная замена символов производится
путем поиска всех контекстов таблицы последовательно, начиная с первого символа
строки, затем второго, третьего и т.д. пока контекст не будет найден. После
замены контекста поиск контекстов в строке продолжается с символа, стоящего во
входной строке после найденного контекста, и начинается с начала таблицы. Поиск
контекстов по строке прекращается при просмотре всех символов строки.
Однако
следует иметь в виду, что сложные контекстные преобразования требуют явного
управления процессом редактирования, которое включает в себя:
- установку курсора в нужную позицию входной строки для начала поиска следующего
контекста;
- установку номера входной строки таблицы контекстов и области чтения
контекстов в таблице для текущего шага редактирования;
- установку смещения номера строки чтения входного файла (для возможности
повторного считывания строки);
- возможность произведения некоторых действий до начала и после окончания
редактирования файла (например, устанавливать начальные параметры
редактирования или производить коррекцию выходных результатов);
- возможность проведения определенных вычислительных и аналитических операций
в процессе редактирования;
- определение блока строк внутри таблицы контекстов, по которым будет искаться
следующий контекст поиска (остальные строки таблицы контекстов при этом
игнорируются);
- организацию циклов по таблице контекстов и файлу сценария;
- осуществление взаимосвязи между внутренними и внешними объектами Редактора.
В общем случае, Таблица контекстов имеет три последовательные области действия:
начальный граничный контекст (контекст поиска имеет вид <!!> или <!>)
|
контексты поиска/замены для строк файла
|
конечный граничный контекст (контекст поиска имеет вид <!!> или <!>)
|
Каждая
из заданных областей Таблицы контекстов подключается к работе только на своем
этапе. Граничные контексты, начинающиеся с <!!> , работают только по одному разу в
начале или в конце сеанса редактирования, а граничные контексты,
начинающиеся с <!> , работают для
каждого найденного в сеансе редактирования файла в начале или в конце его
редактирования. Граничные контексты позволяют производить некоторые
аналитические исследования и преобразования до или после редактирования файла.
Таким
образом, возможность с помощью специальных средств осуществлять управление
контекстным поиском и заменой составляет сущность таблично-контекстного
редактирования.
Базовое понятие блока редактирования - внутренний список, который создается при нахождении в
редактируемом файле строк, удовлетворяющих заданному в таблице контекстов
специальному блоковому контексту. Этот
контекст в начале строки содержит спецконструкции
для определения начальной и конечной строки блока:
%%<контекст для определения начальной строки блока>
$$<контекст для определения конечной строки блока>
В
качестве ограничителей начала и конца блока могут использоваться
спецконструкции без контекстов:
%%% (в этом случае начальная строка блока совпадает с началом файла)
$$ (в этом случае конечная и начальная строки блока совпадают)
$$$ (в этом случае конечная строка блока совпадает с концом файла)
Таблица
контекстов может содержать произвольное число блоковых контекстов,что
идентифицируются номером |n| в
начале каждой строки блока (n либо
пусто, либо целое положительное число). В общем случае начало блокового
контекста определяется конструкцией |n|%%, а конец - конструкцией |n|$$. Анализ и контекстное редактирование строк блока
можно производить и после его создания. Для указания действий над найденным
блоком служат специальные строки таблицы после контекста поиска конца блока.
Эти строки в позиции контекста поиска имеет конструкцию %$ , а в позиции контекста замены - набор групповых
операторов, определяющий определенную последовательность действий с
использованием блоковых функций. Таким образом, в Таблице контекстов может
присутствовать структура (блоковый
контекст) вида:
Контекст поиска: Контекст
замены:
========================================================
%%<контекст начала блока> <контекст замены>
<контекст внутренних строк
блока> <контекст замены>
.
. .
<контекст внутренних строк
блока> <контекст замены>
$$<контекст конца блока> <контекст замены>
%$
#[<набор групповых
операторов>]
.
. .
%$
#[<набор групповых операторов>]
Эта область таблицы ,
а также строки файла, в которых
только и будет производиться контекстный поиск и замена для данного блокового
контекста, называются блоком
редактирования. Фактически блок редактирования
определяет также созданный внутренний список (мнемоника обращения к блоку
редактирования - {10} ), возможно из нескольких
найденных строк, который может быть каким-то образом отредактирован, а затем
записан в выходной файл. Таким образом, назначение блока редактирования многопланово и чтобы
понять его функцию в процессе таблично-контекстного редактирования рассмотрим
применение блока редактирования на специальном тестовом примере, приводя упрощенные описания используемых
структур.
Пусть исходный файл содержит
строки:
Первая покупка: N руб. N коп.
Вторая покупка: N руб. N коп.
Итого: N руб. N коп.
Надо заменить
каждое "N руб." соответственно на "550 руб.", "700
руб." и их сумму "1250 руб.", все "N коп." - на
"00 коп.", а контекст "Итого:" - на "Сумма
покупок:"
Таким образом, результат
редактирования должен иметь вид:
Первая покупка: 500 руб. 00 коп.
Вторая покупка: 750 руб. 00 коп.
Сумма покупок: 1250 руб. 00 коп.
Рассмотрим соответствие блока
редактирования в файле и Таблице контекстов на тестовом примере, сопоставляя отдельную строку
файла с отдельным блоковым контекстом. Здесь каждый блок редактирования
соответствует отдельной строке файла, которая редактируется в процессе создания
блока. Контексты поиска заданы в виде контекстных групп {…}
, которых в строке поиска может быть несколько (мнемоника обращения к
группе - {n} , где n – целое положительное число от 1 до 9).
Контекст поиска: |
Контекст замены: |
Комментарий: |
================================================================ |
||
|1|%%{Первая
покупка:} |
|
контекст
поиска начала блока для первой покупки; |
___________________ |
_________________ |
__________________________________ |
|1|{N
руб.} |
"550
руб." |
контекст
поиска для замены цены первой покупки; |
_____________________ |
___________________ |
______________________________________ |
|1|$${N
коп.} |
"00
коп." |
контекст
поиска конца блока для первой покупки и его замена; |
_____________________ |
___________________ |
______________________________________ |
|2|%%{Вторая
покупка:} |
|
контекст
поиска начала блока для второй покупки; |
___________________ |
_________________ |
__________________________________ |
|2|{N
руб.} |
"700
руб." |
контекст
поиска для замены цены второй покупки; |
_____________________ |
___________________ |
______________________________________ |
|2|$${N
коп.} |
"00
коп." |
контекст
поиска конца блока для второй покупки и его замена; |
_____________________ |
___________________ |
______________________________________ |
|3|%%{Итого:} |
"Сумма
покупок:" |
контекст
поиска начала блока для итога и его замена; |
_____________________ |
___________________ |
______________________________________ |
|3|{N}{руб.}
|
#["1250"//{1}]
|
контекст
поиска представлен в виде двух групп ( {N} и {руб.} ) и замене через групповое выражение подлежит только
первая группа; |
_____________________ |
___________________ |
______________________________________ |
|3|$${N
коп.} |
"00
коп." |
контекст
поиска конца блока для итога и его замена; |
================================================================ |
Блок редактирования в таблице
контекстов определяет своим номером тот
участок Таблицы контекстов, по которому в данный момент надо производить
дальнейший поиск и выполнение контекстной замены. В нашем примере контекст
"N руб." ищется только в том участке таблицы контекстов, c
которого начинается найденный блок |n| (например, если найден контекст
"Вторая покупка:", то при поиске контекста "N руб.",
выбирается контекст только из блока |2|{N руб.} ).
Конечно, для данного тестового
примера использование блоков необязательно, но в сложных контекстных
преобразованиях без них просто не обойтись.
Редактирование может производиться
до нахождения конца блока (как это сделано в предыдущем пункте), а также после нахождения
конца блока и определяться контекстами, стоящими за блоком редактирования и
начинающимися с конструкции |n|%$. Например, необходимо итоговую строку
в тестовом примере перевести на верхний регистр. Для этого модернизируем блок |3| .
Контекст поиска: |
Контекст замены: |
Комментарий: |
================================================================= |
||
|3|%%{Итого:} |
"Сумма
покупок:" |
контекст
поиска начала блока для итога и его замена; |
__________________ |
________________________ |
_______________________________________ |
|3|{N}{руб.}
|
#["1250"//{1}]
|
контекст
поиска из двух групп контекстов и замена контекста первой группы через групповой оператор; |
__________________ |
________________________ |
_______________________________________ |
|3|$${N
коп.} |
"00
коп." |
контекст
поиска конца блока для итога и его замена; |
__________________ |
________________________ |
_______________________________________ |
|3|%$ |
#[BlockConv({10},,,,up,true)] |
блоковая
функция BlockConv переводит содержимое блока редактирования {10} на верхний регистр (параметр up) и записывает в выходной файл
(параметр true) выходную строку: |
================================================================= |
Более полное описание конструкций языка
таблично-контекстного редактирования приведено