Виртуальная машина на страже порядка 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]); |