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

Пишем свой PHP

Бойко Артем (mr.prutik@mail.ru)

Хакер, номер #089, стр. 089-118-3


str_to_int(char * str);

// преобразовывает строку в число

exit_error(char * error, int line);

// выводит сообщение об ошибке кода

my_type get_vars(char* somevar);

// возвращает структуру переменных

// из строки вида "переменная = значение"

bool like(char * str1, char * str2);

// сравнивает две строки

void show_var(char * var);

// выводит значение переменной на экран

[распознавание кода]

Для того чтобы скрипт читался правильно, предлагаю ввести переменную int step, которая бы показывала, на каком шаге выполнения сейчас находится наш код. Я ввел такую зависимость выполнения от значения переменной:

0 - мы на шаге поиска названия программы;

1 - на шаге поиска слова var;

2 - на шаге получения переменных и поиска слова start;

3 - на шаге выполнения кода и поиска слова stop;

Язык наш очень строгий. Любое нарушение правил влечет за собой сообщение об ошибке. Неверный порядок команд ведет к тому же. Поэтому постараемся быть аккуратнее и не нарушать созданные нами правила.

Итак, поехали. Начнем описывать реакцию интерпретатора на те или иные команды. Например, код вывода значения переменной на экран (команда show):

if (like("show", buf)) // если найдена команда show

{

my_type bt = get_vars(buf);

// получаем структуру из текста вида "show = var"

show_var(bt.ch);

// Выводим на экран

}

Такая легкая конструкция приводит к очень красивому результату. Далее все команды будут находиться посредством функции like и выполняться. Следуя этому принципу, я придумал следующие математические операции:

plus var1 var2 - Равносильно var1 = var1 + var2

minus var1 var2 - Равносильно var1 = var1 - var2

multi var1 var2 - Равносильно var1 = var1 * var2

share var1 var2 - Равносильно var1 = var1 / var2

Так же мы можем добавить даже работу с MySQL. Можно в наш язык добавить поддержку циклов и, вообще, чего только душа пожелает. Но в данном примере я решил оставить только одну очень важную команду, без которой действительно не обойтись – это if. Шаблон у нее будет такой:

if var1 var2

#command

Принцип работы очень простой. Интерпретатор находит команду if, затем, если переменная var1 равняется переменной var2, выполняет команду, записанную в следующей строке, если они не равны, то команду он попросту игнорирует. Реализация проста, зато невероятно полезна. Например, ТОЧНОЕ сравнение строк можно произвести посредством трех функций: like, strstr и strlen.

После условия можно ввести уже не такую необходимую, но все равно очень полезную команду, которая выводила бы содержимое текстового файла, так как писать весь html-код в самой программе – это слишком. Команде я дал название read. Прототип такой:

read = var1

Найдя эту команду, интерпретатор открывает содержимое файла, записанного в var1, и выводит его нам на экран посимвольно. Реализуется команда несложно. В массиве структур находится именно та переменная, которая носит имя var1. Получается ее значение. Далее нами создается объект класса ifstream, с помощью которого читается файл и производится его посимвольный вывод.

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