МЕТОДИКА ТАБЛИЧНО-КОНТЕКСТНОГО РЕДАКТИРОВАНИЯ

 

Что такое таблично-контекстное редактирование

 

Таблично-контекстное редактирование определяется задаваемой Таблицей контекстов, основными позициями которой являются 'контекст поиска' и 'контекст замены'. Для табличного набора таких простых контекстных замен действует основное правило редактирования:

 

Контекстная замена символов производится путем поиска всех контекстов таблицы последовательно, начиная с первого символа строки, затем второго, третьего и т.д. пока контекст не будет найден. После замены контекста поиск контекстов в строке продолжается с символа, стоящего во входной строке после найденного контекста, и начинается с начала таблицы. Поиск контекстов по строке прекращается при просмотре всех символов строки.

 

Однако следует иметь в виду, что сложные контекстные преобразования требуют явного управления процессом редактирования, которое включает в себя:

     - установку курсора в нужную позицию входной строки для начала поиска следующего
       контекста;
     - установку номера входной строки таблицы  контекстов и области чтения 
       контекстов в таблице для текущего шага редактирования;
     - установку смещения номера строки чтения входного файла (для возможности
       повторного считывания строки);
     - возможность произведения некоторых действий до начала и после окончания 
       редактирования файла (например, устанавливать начальные параметры
       редактирования или производить коррекцию выходных результатов);
     - возможность проведения определенных вычислительных и аналитических операций 
       в процессе редактирования;
     - определение блока строк внутри таблицы контекстов, по которым будет искаться
       следующий контекст поиска (остальные строки таблицы контекстов при  этом 
       игнорируются);
     - организацию циклов по таблице контекстов и файлу сценария;
     - осуществление взаимосвязи между внутренними и внешними объектами Редактора.
 
В общем случае, Таблица контекстов имеет три последовательные области действия:
 
 
    начальный граничный контекст (контекст поиска имеет вид <!!> или <!>)
 
 
    контексты поиска/замены для строк файла
 
 
    конечный граничный контекст (контекст поиска имеет вид <!!> или <!>)
 
 

Каждая из заданных областей Таблицы контекстов подключается к работе только на своем этапе. Граничные контексты, начинающиеся с <!!> , работают только по одному разу в начале или в конце сеанса редактирования, а граничные контексты, начинающиеся  с  <!>  , работают для каждого найденного в сеансе редактирования файла в начале или в конце его редактирования. Граничные контексты позволяют производить некоторые аналитические исследования и преобразования до или после редактирования файла.

 

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

 
 
Блок редактирования  -  база таблично-контекстного редактирования

 

     1. Понятие блока редактирования в многоплановом аспекте

 

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

%%<контекст для определения начальной строки блока>
$$<контекст для определения конечной строки блока>
 

В качестве ограничителей начала и конца блока могут использоваться спецконструкции без контекстов:

%%%     (в этом случае начальная строка блока совпадает с началом файла) 
$$             (в этом случае конечная и начальная строки блока совпадают)
$$$           (в этом случае конечная строка блока совпадает с концом файла)
 

Таблица контекстов может содержать произвольное число блоковых контекстов,что идентифицируются номером |n| в начале каждой строки блока (n либо пусто, либо целое положительное число). В общем случае начало блокового контекста определяется конструкцией  |n|%%, а конец - конструкцией |n|$$. Анализ и контекстное редактирование строк блока можно производить и после его создания. Для указания действий над найденным блоком служат специальные строки таблицы после контекста поиска конца блока. Эти строки в позиции контекста поиска имеет конструкцию %$ , а в позиции контекста замены - набор групповых операторов, определяющий определенную последовательность действий с использованием блоковых функций. Таким образом, в Таблице контекстов может присутствовать структура (блоковый контекст) вида:

 

Контекст поиска:                                   Контекст замены:

========================================================

%%<контекст начала блока>               <контекст замены>

 

<контекст внутренних строк блока>    <контекст замены>

.  .  .

<контекст внутренних строк блока>    <контекст замены>

$$<контекст конца блока>                    <контекст замены>

 

%$                                                            #[<набор групповых операторов>]

.  .  .

%$                                                            #[<набор групповых операторов>]

 

Эта область таблицы , а также строки файла, в которых только и будет производиться контекстный поиск и замена для данного блокового контекста, называются блоком редактирования.  Фактически блок редактирования определяет также созданный внутренний список (мнемоника обращения к блоку редактирования - {10} ), возможно из нескольких найденных строк, который может быть каким-то образом отредактирован, а затем записан в выходной файл. Таким образом, назначение блока редактирования многопланово и чтобы понять его функцию в процессе таблично-контекстного редактирования рассмотрим применение блока редактирования на специальном тестовом примере, приводя упрощенные описания используемых структур.

 

Тестовый пример

Пусть исходный файл содержит строки:

 

Первая покупка: N руб. N коп.

Вторая покупка: N руб. N коп.

Итого: N руб. N коп.

 

Надо заменить каждое "N руб." соответственно на "550 руб.", "700 руб." и их сумму "1250 руб.", все "N коп." - на "00 коп.", а контекст "Итого:" - на "Сумма покупок:"

 

Таким образом, результат редактирования должен иметь вид:

 

Первая покупка: 500 руб. 00 коп.

Вторая покупка: 750 руб. 00 коп.

Сумма покупок: 1250 руб. 00 коп.

 

     2. Редакция файловых строк через блок редактирования

 

Рассмотрим соответствие блока редактирования в файле и Таблице контекстов на тестовом примере, сопоставляя отдельную строку файла с отдельным блоковым контекстом. Здесь каждый блок редактирования соответствует отдельной строке файла, которая редактируется в процессе создания блока. Контексты поиска заданы в виде контекстных групп {…} , которых в строке поиска может быть несколько (мнемоника обращения к группе - {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 коп."

контекст поиска конца блока для итога и его замена;

================================================================

 

     3. Редакция файловой строки после контекста конца блока редактирования

 

Блок редактирования в таблице контекстов  определяет своим номером тот участок Таблицы контекстов, по которому в данный момент надо производить дальнейший поиск и выполнение контекстной замены. В нашем примере контекст "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) выходную строку:
СУММА ПОКУПОК: 1250 РУБ. 00 КОП.

=================================================================

                                                                                                                                                                   

                                                                                                                                                                    

                                                                                                                                                                    

Более полное описание конструкций языка таблично-контекстного редактирования приведено

в Компьютерном учебнике и Документации TeConv .