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

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

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

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


Теперь дадим названия контролам:

Label1 -< "Путь к скрипту, обрабатывающему текст"

Label2 -< "Обрабатываемый текст"

Button1 -< "Обработать текст c использованием скрипта"

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

Создание обработчика скриптов

Лично я делю интерпретатор скрипта на три основных модуля: парсер, анализатор и исполнитель команд. Первый модуль, парсер, предназначен для разделения строки с командой, т.е записи в разных переменных названия функции и параметров. На входе парсер получает строку, а на выходе дает несколько различных переменных. У нас максимальное количество параметров - 3, поэтому заголовок функции парсера будет выглядеть следующим образом:

procedure parser(inp:string; var func,param1,param2,param3:string);

inp - это строка на входе парсера, func - полученное в результате обработки название функции, param1, param2, param3 - параметры функции. Так как имя функции и параметры разделяются пробелом, то дйствия парсера сведутся к поиску символа пробела, копированию части строки до пробела, удалению этой части и повтору процедуры. Цикл завершается, когда в строке не остается ни одного пробела. И только тогда оставшаяся часть строки присваивается последнему параметру. Всю процедуру ты можешь видеть на врезке "Листинг процедуры parser":

Листинг процедуры parser

procedure parser(inp:string; var func,param1,param2,param3:string);

var a, i : integer;

begin

a:=1;

while pos(' ',inp)<0 do

begin

i:=pos(' ',inp);

case a of

1: func:=copy(inp,1,i-1);

2: param1:=copy(inp,1,i-1);

3: param2:=copy(inp,1,i-1);

4: param3:=copy(inp,1,i-1);

end;

a:=a+1;

inp:=copy(inp,i+1,length(inp)-i);

end;

if a=1 then func:=inp;

if a=2 then param1:=inp;

if a=3 then param2:=inp;

if a=4 then param3:=inp;

end;

Переменная A нужна для обработки функций с числом параметров меньше 3. Теперь на выходе мы получаем переменные func и param с названием функции и параметрами соответственно. Их мы и будем использовать для исполнения команд по обработке скриптов. Самое время перейти к следующей части нашего обработчика - анализатору.

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

Небольшая конструкция

if func='REPLACE' then

begin

{Твои действия по замене}

end;

else if func='FIND' then

begin

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