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

Виртуальная машина на страже порядка

GPcH

Хакер, номер #077, стр. 077-106-5


Итак, давай определимся с требованиями к интерпретатору скриптового языка, который мы собрались писать. Во-первых, он должен уметь понимать не только команды, но и передаваемые им параметры, при этом параметров может быть сколько угодно и все они должны обрабатываться. Во-вторых, интерпретатор должен легко модифицироваться. Для добавления новой команды изменения в исходном коде должны быть минимальны. В-третьих, интерпретатор должен сам определить в строке, где команда, а где параметры и правильно все это дело обработать. Данные будут передаваться нашему интерпретатору в следующем виде: "команда параметр_1, параметр_2, параметр_3, ... , параметр_n". Число параметров ограничим десятью (от 0 до 9), думаю, больше использовать нам вряд ли придется. Возьмем эти данные за основу и напишем движок интерпретатора. Что вышло у меня можно посмотреть на врезке.

Несмотря на то, что, на врезке откомментировано практически все, некоторые участки кода я рассмотрю отдельно. Первое, о чем я хотел бы сказать - это функция InStr. Такой функции нет в Delphi, она присутствует только в Visual Basic'е и служит для нахождения подстроки в строке. В отличие от дельфевой strpos рассматриваемая функция позволяет искать подстроку не только с начала строки, но и начиная с любого символа. Это нам крайне полезно, так как мы ищем по очереди запятые в строчке скрипта чтобы отделить все параметры скриптовой команды и занести их в массив. Тут я не стал париться и написал аналог VB'шной функции InStr на Delphi. Функция получилась очень простая, так что думаю, ты с ней без проблем разберешься:

function InStr(index: integer; str1: string; str2: string): integer;

var

i,len, pos: integer;

begin

pos:=0;

len:=length(str2);

for i:=index to length(str1) do begin

if copy(str1,i,len)=str2 then begin

pos:=i;

break;

end;

end;

result:=pos;

end;

Здесь Index - номер символа строки Str1, с которого начинать искать подстроку Str2. Рекомендую тебе использовать эту функцию в своих программах, как лучшую, на мой взгляд, замену strpos.

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

strText:=pointer(strParametr[0]);

strByte:=StrToInt(strParametr[1]);

strLen:=Length(strParametr[0]);

Назад на стр. 077-106-4  Содержание  Вперед на стр. 077-106-6