Сегодня: 22.05.2024г. 02:27
http://professional-pc.ucoz.ru/
Навигация
Рубрики
Категории
OC и Программное обеспечение [16]
Программирование [29]
Игры PC [11]
Интернет [13]
Железо [8]
Delphi [31]
Windows [57]
Прочее [0]
Мини-чат
 
300

Открыть большой чат в окне
в окне сайта
Реклама
Разместить кнопку
Разместить кнопку
Разместить кнопку
Пишем интерпретатор в Delphi

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

К сожалению я не нашел времени писать "умный" интерпретатор и ограничился тем, что бы наша программа просто умела например считывать переменные. 

Что бы упростить процесс создания интерпретатора, я решил сделать его "строковым". То есть на одной строке будет функция, а на второй - ее параметры:


Перед тем, как приступить созданию среды программирования - хотелось бы показать алгоритм будущей программы. Например пусть нам будут доступны в этой среде программирования всего 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 . Комично и в тему! 


Помогли ли вам наши статьи?
Всего ответов: 465


Источник:
Категория: Программирование | Добавил: BRESS (22.10.2011) | Автор: EW
Просмотров: 1979 | Комментарии: 0 | Теги: | Рейтинг: 5.0/1
>Всего комментариев>: 0
Авторизация
Опрос
Помогли ли вам наши статьи?
Всего ответов: 465
Online
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Статистика


CY-PR.com
© 2024 Professional-PC.Ucoz..Ru