Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #67, ИЮЛЬ 2004 г.

Интерпретируй ЭТО!

Диман Dr.X (xdiman@mail.ru)

Xakep, номер #067, стр. 067-086-3


{Твои действия по поиску текста}

end;

{skipped}

else if func='INSERT':

begin

{Вставка текста}

end;

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

Анализирующе-исполнительный модуль

Для начала объявим две переменные в коде кнопки: currentline и currentchar, обе типа integer. Они будут указывать текущее положение курсора: линию и позицию на строке. Также объяви те переменные для названия функции и параметров: func, param1, param2, param3. Вначале напишем код, считывающий построчно из файла команды и записывающий эти данные в массив. А теперь будем писать код для каждой команды. Например, чтобы переместиться на линию и определенное количество символов, требуется всего лишь присвоить значения координатным переменным:

if func='GOLINE' then Val(param1,currentline,NULL);

if func='GOCHAR' then Val(param1,currentchar,NULL);

Теперь курсор будет находиться в определенном месте текста. Для вставки можно объявить дополнительную переменную h для упрощения кода и использовать следующую конструкцию (текст находится в Memo1):

Вставка

if func='INSERT' then begin

h:=Memo1.Lines.Strings[currentline];

h:=Concat(copy(h,1,currentchar),param1,copy(h,currentchar+1,length(h)-currentchar));

Memo1.Lines.Strings[currentline]:=h;

end;

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

Тестирование: обработка текстов

Вот и написан простенький текстовый редактор с поддержкой скриптов для обработки текста. Уверен, что ты сможешь найти ему множество применений, если часто приходится редактировать различные тексты по одному правилу. Например, преобразование текста в html - преобразование всех >,<, пробелов в записи типа  .

Кроме того, набор команд легко дополним, а изложенные здесь методы можно будет легко приспособить для работы в других целях. На этом все. Будет интересно узнать о реализации какой-либо функции - пиши мне, помогу.

Матрица: Продвижение

Конечно, написанный нами исходник довольно прост и понятен каждому кодеру. Но все же, если ты рано или поздно займешься серьезным проектом, стоит подумать о некоторых вещах. Например, описанная нами структура:

while not EOF(fin) do

begin

readln(fin, temp);

parser(temp,func,param1,param2,param3);

if func='GOLINE' then ...;

…

if func='DELAFTER' then ...;

end;

- конечно, вполне корректна и будет работать. Но заметь, что во всех проходах цикла while not EOF(fin) do будут выполняться ВСЕ проверки по "if". А теперь представь, что операторов типа GOLINE, GOCHAR и т.п. пара сотен? Сколько времени уйдет на парсинг и исполнение входного файла, если в нем несколько тысяч строк? Для повышения скорости обработки можно, конечно, в каждый оператор if после выполнения всех операций по then вставить процедуру Continue (которая компилируется в одну ассемблерную команду). Однако есть способ лучше. Пусть процедура

Назад на стр. 067-086-2  Содержание  Вперед на стр. 067-086-4