Каждый программист наверняка когда-нибудь задавался идеей создания своей среды программирования. Составив десятки алгоритмов будущего языка программирования он наконец выполняет свою работу в виде простого интерпретатора - который выполняет написанную программу, но не создает ее законченный вариант в отличие от компилятора. Так вот. В этом уроке я покажу как сделать простенький интерпретатор.
К сожалению я не нашел времени писать "умный" интерпретатор и ограничился тем, что бы наша программа просто умела например считывать переменные.
Что бы упростить процесс создания интерпретатора, я решил сделать его "строковым". То есть на одной строке будет функция, а на второй - ее параметры:
Перед тем, как приступить созданию среды программирования - хотелось бы показать алгоритм будущей программы. Например пусть нам будут доступны в этой среде программирования всего 3 функции:
Write { <текст> } | Вывод <текст> в консоль. | MsgBox{ <текст> } | Вывод <текст> сообщением. | var open{ <тип переменной> <имя переменной> <значение> }
| Создание переменной. |
Весьма скудный набор функций. Но этого думаю пока хватит. Вернемся к алгоритму:
После ознакомления с алгоритмом выполнения функций нашей программы, я наконец перехожу к стадии создания среды программирования. Скинем на форму Memo1, Memo2 и Button. Расположим их в следующем порядке:
Memo1 - это будет окно для ввода программы. Memo2- консоль. Button - кнопка запуска.
Начнем обработку функций. Поскольку нам неизвестно сколько пользователь введет строк в Memo1, то мы создадим цикл. Создаем процедуру нажатия Button1 и пишем примерно следующий шаблон кода:
procedure TForm1.Button1Click(Sender: TObject); var i:integer; c:integer; begin c:=Memo1.Lines.Count; for i:=0 to c do
end;
То есть мы будем выполнять определенную процедуру столько раз - сколько всего строк в Memo1. Теперь дорабатываем код функцией вывода текста:
... for i:=0 to c do begin //Вывод текста в консоль if Memo1.Lines[i]='Write {' then Memo2.Lines.Add(Memo1.Lines[i+1]); end; ...
Прикольненько выходит:
Программа тупо проверяет равна ли строка определенной функции и если да, то программа выполняет следующие действия: например вывод текста.
Дополним программу возможностью вывода сообщения:
for i:=0 to c do begin //Вывод текста в консоль if Memo1.Lines[i]='Write {' then Memo2.Lines.Add(Memo1.Lines[i+1]); //Вывод сообщения if Memo1.Lines[i]='MsgBox {' then ShowMessage(Memo1.Lines[i+1]); end;
Теперь мы действовали точно по такой же схеме и программа тоже сделала требуемые от нее действия. В данный момент - это вывод сообщения.
А теперь самое сложное, относительно всего предыдущего - создание переменной. Поскольку мы не знаем точное количество будущих переменных, то создадим два массива - int и str:
procedure TForm1.Button1Click(Sender: TObject); var i:integer; c:integer; //Создаем массивы int: array [1..5] of integer; str: array [1..5] of string; name: array [1..10] of string; //Счетчика массивов: numstr,numint: integer; ...
Ну а теперь приступаем к функции создания переменной. В общем упущу моменты. Вот такая процедура получилась у нас:
procedure TForm1.Button1Click(Sender: TObject); var i:integer; c:integer; int: array [1..5] of integer; //Переменные типа int str: array [1..5] of string; //Переменные типа str name: array [1..10] of string; //Имя переменной numstr,numint: integer; //Кол-во переменных begin c:=Memo1.Lines.Count;
numstr:=0; numint:=0; for i:=0 to c do begin //Вывод текста в консоль if Memo1.Lines[i]='Write {' then Memo2.Lines.Add(Memo1.Lines[i+1]);
//Вывод сообщения if Memo1.Lines[i]='MsgBox {' then ShowMessage(Memo1.Lines[i+1]);
//Создание переменной if (Memo1.Lines[i]='Var Open{') and (Memo1.Lines[i+1]='str') then begin numstr:=numstr+1; name[numstr+numint]:=Memo1.Lines[i+2]; str[numstr]:=Memo1.Lines[i+3]; end;
if (Memo1.Lines[i]='Var Open{') and (Memo1.Lines[i+1]='int') then begin numint:=numint+1; name[numstr+numint]:=Memo1.Lines[i+2]; int[numstr]:=StrToInt(Memo1.Lines[i+3]); end;
end; end;
Запускаем нашу среду программирования и радуемся, тому что создали первый весьма простенький интерпретатор! Давайте назовем язык программирования так: Figovinka . Комично и в тему!
Источник: |