вторник, 13 декабря 2011 г.

Программа компилятор / интерпретатор

Однажды в далекие далекие времена... Еще когда DOS бороздил просторы перфокартных и ламповых компьютеров.. Офицер военно морского флота, причем женского пола спроектировала и разработала самую первую компиляционную программу, с этого времени и появился первый ASM.
На сегодня существует большое множество проектов посвященных созданию собственного компилятора.. Я же просто покажу свою версию, сделанную не без помощи книги Девида Креншоу и его алгоритма синтаксического анализатора написанного на Pascal и переработанного мной на систему Delphi. При этом добавлю лишь, что очень много времени извел на эту туфту и в итоге смог создать базовый практически движок для разработки интерпритационной системы... Или интерпритатор, который работает на динамической памяти и командах сопроцессора.. Простыми словами интерпритатор-это программа способная преобразовывать пользовательскую писанину в реальные коды процессора или сопроцессора.
Данный продукт имеет в своем составе имеет несколько управляющих элементов.

А именно:

1)Поле для ввода значений.

Например

(2+3.454)-34*12

2) Кнопка запуска(Compil) которая запускает программу компиляции.

3) Кнопка вывода(RESHENIE) полученного результата.

4) Поле вывода результата.

5) Поле вывода ошибок.

6) Имеется вкладка основные функции, где расположены функции применяемые в высшей математике


Код программы:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,unit2, ExtCtrls, Menus, ComCtrls, MPlayer,ShellAPI;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Button3: TButton;
Edit2: TEdit;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
ComboBox1: TComboBox;
Label1: TLabel;
TabSheet2: TTabSheet;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Panel1: TPanel;
MediaPlayer1: TMediaPlayer;
Timer1: TTimer;
Label5: TLabel;
MainMenu1: TMainMenu;
File1: TMenuItem;
N1: TMenuItem;
procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N1Click(Sender: TObject);


private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//st:string;
ret:array[1..1000] of byte;
adresskuch:pointer;
adresskodow,adressvozwrata,adressperem1,adressperem2:pointer;
perem1,perem2:longint;
rety:array [1..10] of char;
perprrom:real;
adr:pointer;
flag5:boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
label
metka1,metka2,net,dalee;
var
h:thandle;
i,j:cardinal;
g:textfile;
r,y:longword;
HandHead:cardinal;

begin
flag5:=true;
incremm:=0;
dwa:=180;
for j:=1 to 20 do
begin
st6[k]:=#0;
end;
kk:=0;
chisla:=chisla2;
dincrem:=0;
peremen:='';
flag:=false;
perem1:=0;
for i:=1 to 10 do
rety[i]:=#0;
adressperem1:=@perem1;
adressperem2:=@perem2;
adresskodow:=@ret;
memo1.Clear;
edit2.Clear;
//memo2.Clear;
st:=edit1.Text;
k:=0;
st2:='0';
Init ;
expression;
assignfile(g,'roman.txt');
rewrite(g);
for j:=1 to 200 do
writeln(g,memo1.Lines[j]);
closefile(g);
HandHead:=GetProcessHeap;
adresskuch:=HeapAlloc(HandHead,0,q+3);
BUTTON3.Enabled:=true;
asm
mov eax,offset metka2
push eax
mov ecx,q
mov esi,adresskodow
mov edi,adresskuch
rep movsb
mov ecx,1
mov eax,58h
mov ebx,q
add ebx,0
add ebx,adresskuch
mov edi,ebx
repne stosb
mov ecx,1
mov eax,0ffh
mov ebx,q
add ebx,1
add ebx,adresskuch
mov edi,ebx
repne stosb
mov ecx,1
mov eax,0e0h
mov ebx,q
add ebx,2
add ebx,adresskuch
mov edi,ebx
repne stosb
jmp adresskuch
metka2:
fld qword ptr [esi]
fst perprrom
wait
end;
button1.Enabled:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
mediaplayer1.Display:=panel1;
mediaplayer1.FileName:='roman.avi';
mediaplayer1.Open;
mediaplayer1.Play;
//pagecontrol1.tabSheet1
BUTTON3.Enabled:=FALSE;
ComboBox1.Items.Add('cosyn');
ComboBox1.Items.Add('sinus');
ComboBox1.Items.Add('cor');
//ComboBox1.Items.Add('cotangens');
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;

begin
button1.Enabled:=true;
button3.Enabled:=false;
edit2.Clear;
//memo2.Clear;
//memo2.Lines.Add(floattostr(perprrom));
edit2.Text:=floattostr(perprrom);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex=0 then begin
edit1.SelText:='cosyn()';
end;
if ComboBox1.ItemIndex=1 then begin
edit1.SelText:='sinus()';
end;
if ComboBox1.ItemIndex=2 then begin
edit1.SelText:='cor()';
end;
//if ComboBox1.ItemIndex=3 then begin
//edit1.Text:=edit1.Text+' cotangens';
//end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
mediaplayer1.Play;
end;

procedure TForm1.N1Click(Sender: TObject);
var
h: hwnd;
begin
ShellExecute(h, 'open', 'ИГС.chm', nil, nil, SW_SHOWNORMAL);
end;

end.




unit Unit2;
interface
function GetChar2:char;
procedure GetChar;
procedure Error(s: string);
procedure Abort(s: string);
procedure Expected(s: string);
procedure Match(x: char);
function IsAlpha(c: char): boolean;
function IsDigit(c: char): boolean;
function GetName: char;
function GetNum: char;
procedure Emit(s: string);
procedure EmitLn(s: string);
procedure Init;
procedure factor;
procedure multiply;
procedure divide;
procedure term;
procedure add;
procedure subtract;
procedure expression;
function IsAddop(c: char): boolean;
function GetChar3:char;
procedure Ident;

procedure adresss(rerro:integer);
const
co:string='cosyn';//#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;
si:string='sinus';
ko:string='cor';
dwesti70:array[1..2] of real=(270,90);
trysto60:array[1..2] of real=(360,180);
var
flag:boolean;
i,i2:integer;
q:CARDINAL;
sim,sim1:char;
st:string;
st2:array[0..20] of char;
st3:array[0..20] of byte;
st4:array[1..200] of byte;
st6:array[0..20] of char;
look2:char;
k,b,k2,ch,kk:integer;
chislo:LONGWORD;
kruto:string;
kruto2:string[8];
name:string;
peremen:string;
realper:real;
din:^real;
chisla,chisla2:array[1..200] of real;
dincrem:integer;
adss:pointer;
pro,pro1:real;
dwa:real;
dopolm:integer;
nuli:integer;
slowo:word;
rr:integer;
peremen1:integer;
incremm:integer;
Look:char;
implementation

uses unit1,SysUtils,unit3,dialogs;
label
perexod;
{--------------------------------------------------------------}
{ }
const TAB = ^I;
exp:array[0..9] of longWORD=(1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000);
exp1=16;
{--------------------------------------------------------------}
{ }
{}
{--------------------------------------------------------------}

{Процедура считки символа}
procedure GetChar;
begin
inc(i);
Look:=st[i];{chitaem simwol}
end;
{--------------------------------------------------------------}

function GetChar2:char;
begin
look2:=st[i];{chitaem simwol}
result:=look2;
end;
function GetChar3:char;
begin
look2:=st[i];{chitaem simwol}
result:=upcase(look2);
end;
{ }
procedure Error(s: string);
begin
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add(^G+'Error: '+s+'.');

end;
{--------------------------------------------------------------}

{--------------------------------------------------------------}
{ проверка на +,-}
function IsAddop(c: char): boolean;
begin
IsAddop := c in ['+', '-'];
end;
{--------------------------------------------------------------}

{ }
procedure Abort(s: string);
begin
Error(s);
Halt;
end;
{--------------------------------------------------------------}

{ }
procedure Expected(s: string);
begin
Abort(s + ' Expected');
end;
{--------------------------------------------------------------}

{если скобочка то берем новый символ }
procedure Match(x: char);
begin
if Look = x then GetChar
else Expected('''' + x + '''');
end;
{--------------------------------------------------------------}

{проверка на буквы }
function IsAlpha(c: char): boolean;
begin
IsAlpha := upcase(c) in ['A'..'Z'];
end;
{--------------------------------------------------------------}

{ проверка на числа}
function IsDigit(c: char): boolean;
begin
IsDigit := c in ['0'..'9'];
if c='.' then begin
result:=true;
end;

end;
{--------------------------------------------------------------}

{ }
function GetName: char;
begin
if not IsAlpha(Look) then Expected('Name');
GetName := UpCase(Look);
GetChar;
end;
{--------------------------------------------------------------}

{ }
function GetNum: char;
begin
if not IsDigit(Look) then Expected('Integer');
GetNum := Look;
GetChar;
end;
{--------------------------------------------------------------}

{ }
procedure Emit(s: string);
begin
form1.Memo1.Lines.Add(TAB+s);
end;
{--------------------------------------------------------------}

{ }
procedure EmitLn(s: string);
begin
Emit(s);
form1.Memo1.Lines.Add('');
end;
{--------------------------------------------------------------}

{начало работы транслятора }
procedure Init;
begin
q:=0;
i:=0;
GetChar;{chitaem simwol}
end;
{проверка на (,)}
procedure factor;
begin
if Look = '(' then begin
Match('(');//новый символ
Expression;
Match(')');
end
else
if IsAlpha(Look) then //проверка на буквы

begin {проверка на (A..Z) т.е переменные}
flag5:=true;
Ident;
{inc(q);
ret[q]:=$BE; //mov esi,[chyslo]
inc(q);
ret[q]:=$2c+(8*dincrem);
inc(q);
ret[q]:=$4c;
inc(q);
ret[q]:=$45;
inc(q);
ret[q]:=$00;
inc(kk);

inc(dincrem);}



end;

if isdigit(look) then BEGIN//если число
while (getchar2 in ['0'..'9']) or (getchar2=',') do
begin
peremen:=peremen+st[i];

inc(i);

end;
inc(kk);
chisla[kk]:=strtofloat(peremen);
adss:=@chisla[kk];
peremen1:=integer(adss);
adresss(peremen1);
////////////////////////////////////
adss:=@dwesti70;
peremen1:=integer(adss);
adresss(peremen1);
////////////////////////////////////
adss:=@slowo;
peremen1:=integer(adss);
adresss(peremen1);

//////////////////////////////////
adss:=@dwa;
realper:=chisla[kk];
peremen1:=integer(adss);
adresss(peremen1);
///////////////////////////////////
////////////////////////////////////
adss:=@trysto60;
peremen1:=integer(adss);
adresss(peremen1);

peremen:='';
dec(i);
getchar;

{Создаем для каждого числа адрес}
inc(q);
ret[q]:=$BE; //mov esi,[chyslo]
inc(q);
ret[q]:=st4[1]+(8*dincrem); // chisla[kk]
inc(q);
ret[q]:=st4[2];
inc(q);
ret[q]:=st4[3];
inc(q);
ret[q]:=st4[4];
{-------------------------------}

inc(dincrem);
k:=0;
END;

end;


procedure Ident;
var Name: string;
begin
for k:=0 to 20 do
begin
st6[k]:=#0;
end;
k:=0;
while getchar3 in ['A'..'Z'] do
begin
st6[k]:=st[i];
inc(i);
inc(k);
end;
if (st[i]<>'(') then
begin
flag5:=false;
end;
if string(st6)=co then
begin
cosinusRun;
end;
if string(st6)=si then
begin
sinusRun;
end;

if string(st6)=ko then
begin
korenrun;
end;

if (k<>0)and (flag5=true) then
begin
form1.Memo1.Lines.Add('OSHIBKA FUNCIJA '+st6+ ' NEOPREDElENA!!!');
form1.Button3.Enabled:=false;
end;
dec(i);
getchar;

end;






procedure multiply;
begin
match('*');
factor;

{Загрузка в сопроцессор умножаемых чисел}

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;

inc(q); // pop [esi] предыдущее число
ret[q]:=$5E;

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;
{----------------------------------------}

{Умножение!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
INC(Q);
RET[Q]:=$DE; //fmul
INC(Q);
RET[Q]:=$C9;
{----------------------------------------}

{Сохранение информации }
INC(Q);
RET[Q]:=$DD; //fst
INC(Q);
RET[Q]:=$1E;
{-----------------------------------------}

end;
procedure divide;
begin
match('/');
factor;
inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;

inc(q);
ret[q]:=$5E; //pop [esi]

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;

inc(q);
ret[q]:=$DE; //Деление fdiv
inc(q);
ret[q]:=$F1;

{Сохранение информации }
INC(Q);
RET[Q]:=$DD; //fst
INC(Q);
RET[Q]:=$1E;
{-----------------------------------------}


end;
{проверка на *,/}
procedure term;
begin
factor;//на скобки
while look in ['*','/'] do
begin

inc(q);
ret[q]:=$56; //push [esi]

case look of
'*':multiply;
'/':divide;
else expected('mulor');
end;
end;
end;
procedure add;
begin
match('+');
term;

inc(q);
ret[q]:=$DD;
inc(q); //В st число
ret[q]:=$06;


INC(Q);
RET[Q]:=$DE; //fadd
INC(Q);
RET[Q]:=$C1;

INC(Q);
RET[Q]:=$DD;
INC(Q); //fst
RET[Q]:=$1E;
end;
{--------------------------------------------------------------}
procedure subtract;
begin
match('-');
term;

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;

inc(q);
RET[Q]:=$DE; //fsub
inc(q);
ret[q]:=$E9;

INC(Q);
RET[Q]:=$DD; //fst
INC(Q);
RET[Q]:=$1E;

end;
procedure expression; {Обработкка знаков(-,+)}
begin
if (look='-') then//если (-,+) то
begin {Проверяет на минус}


inc(kk);
chisla[kk]:=0;
inc(q);
ret[q]:=$BE; //[esi] равно 0
inc(q);
ret[q]:=st4[1]+(8*dincrem); // chisla[kk]
inc(q);
ret[q]:=st4[2];
inc(q);
ret[q]:=st4[3];
inc(q);
ret[q]:=st4[4];
inc(dincrem);
end
else
term;//проверка на умнож,дел
while look in ['-','+'] do
begin

inc(q);
ret[q]:=$DD; ////В st число
inc(q);
ret[q]:=$06;

case look of
'+':add;
'-':subtract
else expected('addop');
end;
end;
end;



procedure adresss(rerro:integer);

begin

kruto:=inttohex(rerro,8);
kruto2:=kruto[7]+kruto[8]+kruto[5]+kruto[6]+kruto[3]+kruto[4]+kruto[1]+kruto[2];

k2:=0;
while k2<>9 do
begin
inc(k2);
if kruto2[k2]='A'
then begin
kruto2[k2]:=':';
end;
if kruto2[k2]='B' then begin
kruto2[k2]:=';';
end;
if kruto2[k2]='C' then begin
kruto2[k2]:='<'; end; if kruto2[k2]='D' then begin kruto2[k2]:='='; end; if kruto2[k2]='E' then begin kruto2[k2]:='>';
end;
if kruto2[k2]='F' then begin
kruto2[k2]:='?';
end;
end;
st4[1+incremm]:=(ord(kruto2[2])-$30)+(ord(kruto2[1])-$30)*($10);
st4[2+incremm]:=(ord(kruto2[4])-$30)+(ord(kruto2[3])-$30)*($10);
st4[3+incremm]:=(ord(kruto2[6])-$30)+(ord(kruto2[5])-$30)*($10);
st4[4+incremm]:=(ord(kruto2[8])-$30)+(ord(kruto2[7])-$30)*($10);
st2:='0';
incremm:=incremm+4;
end;
BEGIN
{ }
end.


unit Unit3;

interface
procedure cosinus;
procedure cosinusRun;
procedure sinuss;
procedure sinusRun;
procedure koren;
procedure korenrun;
implementation
uses unit1,unit2;
procedure cosinus;

begin
////////////////////////////
inc(q);
ret[q]:=$D9; // pi
inc(q);
ret[q]:=$EB;



inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;



INC(Q);
RET[Q]:=$DE; //fmul
INC(Q);
RET[Q]:=$C9;

inc(q);
ret[q]:=$BF; // 180
inc(q); //adress dwa
ret[q]:=st4[13];
inc(q);
ret[q]:=st4[14];
inc(q);
ret[q]:=st4[15];
inc(q);
ret[q]:=st4[16];

inc(q);
ret[q]:=$DD; //В st число (edi)
inc(q);
ret[q]:=$07;

inc(q);
ret[q]:=$DE; //Деление fdiv
inc(q);
ret[q]:=$F9;



inc(q);
ret[q]:=$D9; // Cos
inc(q);
ret[q]:=$FF;



//////////////////////////////
inc(q);
ret[q]:=$D9; // pi
inc(q);
ret[q]:=$EB;


inc(q);
ret[q]:=$BE; //mov esi,[chyslo]
inc(q);
ret[q]:=st4[5]+8*rr; //dwesti70
inc(q);
ret[q]:=st4[6];
inc(q);
ret[q]:=st4[7];
inc(q);
ret[q]:=st4[8];

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;



INC(Q);
RET[Q]:=$DE; //fmul
INC(Q);
RET[Q]:=$C9;

inc(q);
ret[q]:=$BF; // 180
inc(q); //adress dwa
ret[q]:=st4[13];
inc(q);
ret[q]:=st4[14];
inc(q);
ret[q]:=st4[15];
inc(q);
ret[q]:=st4[16];

inc(q);
ret[q]:=$DD; //В st число (edi)
inc(q);
ret[q]:=$07;

inc(q);
ret[q]:=$DE; //Деление fdiv
inc(q);
ret[q]:=$F9;

inc(q);
ret[q]:=$D9; // Cos
inc(q);
ret[q]:=$FF;

inc(q);
ret[q]:=$DD; // fucomp
inc(q);
ret[q]:=$E9;
//////////////////////

inc(q);
ret[q]:=$DD; //
inc(q);
ret[q]:=$3D;

//
inc(q); // !!!!!!Slowo
ret[q]:=st4[9];
inc(q);
ret[q]:=st4[10];
inc(q);
ret[q]:=st4[11];
inc(q);
ret[q]:=st4[12];

inc(q);
ret[q]:=$66; // mov ax
inc(q);
ret[q]:=$A1;

// 180
inc(q);
ret[q]:=st4[9];
inc(q);
ret[q]:=st4[10]; // !!!!!!Slowo
inc(q);
ret[q]:=st4[11];
inc(q);
ret[q]:=st4[12];

inc(q);
ret[q]:=$9E;
dec(dincrem);
inc(q);
ret[q]:=$BE; //mov esi,[chyslo]
inc(q);
ret[q]:=st4[1]+(8*dincrem);
inc(q);
ret[q]:=st4[2]; // chisla[kk]
inc(q);
ret[q]:=st4[3];
inc(q);
ret[q]:=st4[4];

{Сохранение информации }
INC(Q);
RET[Q]:=$DD; //fst
INC(Q);
RET[Q]:=$1E;
{-----------------------------------------}


inc(q);
ret[q]:=$74;
inc(q);
ret[q]:=$02;


inc(q);
ret[q]:=$75;
inc(q);
ret[q]:=$04;

inc(q);
ret[q]:=$D9;
inc(q);
ret[q]:=$EE;


inc(q);
ret[q]:=$DD;
inc(q);
ret[q]:=$1E;
inc(dincrem);

end;

procedure cosinusRun;
begin
k:=0;
look:=look2;

Name :=string(st6);
if Look = '(' then begin
Match('(');
/////////////////////////////////////
Expression;
Match(')');
rr:=0;
if (chisla[kk]<>90) then
begin
cosinus;
end;
if chisla[kk]=90 then begin
inc(rr);
cosinus;
end;
end;
end;
procedure sinuss;
begin
inc(q);
ret[q]:=$D9; // pi
inc(q);
ret[q]:=$EB;



inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;



INC(Q);
RET[Q]:=$DE; //fmul
INC(Q);
RET[Q]:=$C9;

inc(q);
ret[q]:=$BF; // 180
inc(q); //adress dwa
ret[q]:=st4[13];
inc(q);
ret[q]:=st4[14];
inc(q);
ret[q]:=st4[15];
inc(q);
ret[q]:=st4[16];

inc(q);
ret[q]:=$DD; //В st число (edi)
inc(q);
ret[q]:=$07;

inc(q);
ret[q]:=$DE; //Деление fdiv
inc(q);
ret[q]:=$F9;



inc(q);
ret[q]:=$D9; // sin
inc(q);
ret[q]:=$FE;


inc(q);
ret[q]:=$D9; // pi
inc(q);
ret[q]:=$EB;


inc(q);
ret[q]:=$BE; //mov esi,[chyslo]
inc(q);
ret[q]:=st4[17]+8*rr; //dwesti70
inc(q);
ret[q]:=st4[18];
inc(q);
ret[q]:=st4[19];
inc(q);
ret[q]:=st4[20];

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;



INC(Q);
RET[Q]:=$DE; //fmul
INC(Q);
RET[Q]:=$C9;

inc(q);
ret[q]:=$BF; // 180
inc(q); //adress dwa
ret[q]:=st4[13];
inc(q);
ret[q]:=st4[14];
inc(q);
ret[q]:=st4[15];
inc(q);
ret[q]:=st4[16];

inc(q);
ret[q]:=$DD; //В st число (edi)
inc(q);
ret[q]:=$07;

inc(q);
ret[q]:=$DE; //Деление fdiv
inc(q);
ret[q]:=$F9;

inc(q);
ret[q]:=$D9; // Cos
inc(q);
ret[q]:=$FE;

inc(q);
ret[q]:=$DD; // fucomp
inc(q);
ret[q]:=$E9;
//////////////////////

inc(q);
ret[q]:=$DD; //
inc(q);
ret[q]:=$3D;

//
inc(q); // !!!!!!Slowo
ret[q]:=st4[9];
inc(q);
ret[q]:=st4[10];
inc(q);
ret[q]:=st4[11];
inc(q);
ret[q]:=st4[12];

inc(q);
ret[q]:=$66; // mov ax
inc(q);
ret[q]:=$A1;

// 180
inc(q);
ret[q]:=st4[9];
inc(q);
ret[q]:=st4[10]; // !!!!!!Slowo
inc(q);
ret[q]:=st4[11];
inc(q);
ret[q]:=st4[12];

inc(q);
ret[q]:=$9E;
dec(dincrem);
inc(q);
ret[q]:=$BE; //mov esi,[chyslo]
inc(q);
ret[q]:=st4[1]+(8*dincrem);
inc(q);
ret[q]:=st4[2]; // chisla[kk]
inc(q);
ret[q]:=st4[3];
inc(q);
ret[q]:=st4[4];

{Сохранение информации }
INC(Q);
RET[Q]:=$DD; //fst
INC(Q);
RET[Q]:=$1E;
{-----------------------------------------}


inc(q);
ret[q]:=$74;
inc(q);
ret[q]:=$02;


inc(q);
ret[q]:=$75;
inc(q);
ret[q]:=$04;

inc(q);
ret[q]:=$D9;
inc(q);
ret[q]:=$EE;


inc(q);
ret[q]:=$DD;
inc(q);
ret[q]:=$1E;
inc(dincrem);

end;
procedure sinusRun;
begin
k:=0;
look:=look2;

Name :=string(st6);
if Look = '(' then begin
Match('(');
/////////////////////////////////////
Expression;
Match(')');
rr:=0;
if (chisla[kk]<>180) then
begin
sinuss;
end;
if chisla[kk]=180 then begin
inc(rr);
sinuss;
end;
end;
end;

procedure koren;
begin

inc(q);
ret[q]:=$DD; //В st число
inc(q);
ret[q]:=$06;
{Сохранение информации }
INC(Q);
RET[Q]:=$D9; //fst
INC(Q);
RET[Q]:=$FA;
{-----------------------------------------}
{Сохранение информации }
INC(Q);
RET[Q]:=$DD; //fst
INC(Q);
RET[Q]:=$1E;
{-----------------------------------------}
end;

procedure korenrun;
begin
k:=0;
look:=look2;

Name :=string(st6);
if Look = '(' then begin
Match('(');
/////////////////////////////////////
Expression;
Match(')');
koren;
end;
end;
end.