Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Разработка компилятора модельного языка программирования - файл Приложения.doc


Загрузка...
Разработка компилятора модельного языка программирования
скачать (300 kb.)

Доступные файлы (5):

Аннотация.doc48kb.14.01.2010 21:50скачать
Пояснительная записка.doc600kb.18.12.2009 05:12скачать
Приложения.doc180kb.18.12.2009 05:13скачать
Содержание.doc37kb.14.01.2010 21:50скачать
Титульник.doc21kb.14.01.2010 21:47скачать

Приложения.doc

Реклама MarketGid:
Загрузка...
Приложение А.

Исходный текст программы.
unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, ComCtrls, ExtCtrls, StdCtrls, Buttons;

type

TAutoState=(Auto_H, Auto_L, Auto_N, Auto_O2, Auto_O1, Auto_E, Auto_F1, Auto_F2,

AUTO_Sk, AUTO_Sk1, AUTO_Q, AUTO_C1, AUTO_R, AUTO_Q1, AUTO_A, AUTO_I, AUTO_O, AUTO_X);
TForm1 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

OpenDialog1: TOpenDialog;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

GroupBox3: TGroupBox;

StringGrid1: TStringGrid;

Button1: TButton;

Button2: TButton;

StringGrid2: TStringGrid;

Button3: TButton;

Panel1: TPanel;

Panel2: TPanel;

Button6: TButton;

Button7: TButton;

Panel3: TPanel;

Button4: TButton;

Edit1: TEdit;

Memo1: TMemo;

Memo2: TMemo;

Memo3: TMemo;

BitBtn1: TBitBtn;

Button5: TButton;

GroupBox4: TGroupBox;

GroupBox5: TGroupBox;

Memo4: TMemo;

Button8: TButton;

StringGrid3: TStringGrid;

GroupBox6: TGroupBox;

Button9: TButton;

Button10: TButton;

GroupBox7: TGroupBox;

Memo5: TMemo;

Label1: TLabel;

Label2: TLabel;

BitBtn2: TBitBtn;

GroupBox8: TGroupBox;

Memo6: TMemo;

Button11: TButton;

GroupBox9: TGroupBox;

Memo7: TMemo;

GroupBox10: TGroupBox;

StringGrid4: TStringGrid;

GroupBox11: TGroupBox;

GroupBox12: TGroupBox;

TreeView1: TTreeView;

BitBtn3: TBitBtn;

GroupBox13: TGroupBox;

Memo8: TMemo;

Memo9: TMemo;

Button12: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Memo1Change(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Button11Click(Sender: TObject);

procedure Button12Click(Sender: TObject);

private

{ Private declarations }

public

Words:TStringList;
{ Public declarations }

end;
var

Form1: TForm1;

Sl:array[0..366] of integer;

implementation
{$R *.dfm}

function HeshFunc(St:string):integer;

var dlina,sred:integer;

begin

dlina:=length(St);

if dlina=0 then Result:=0

else begin

sred:=(dlina+1)div 2;

if dlina=1 then Result:=ord(St[1])-64 else

if dlina=2 then Result:=ord(St[1])+ord(St[dlina])-64 else

Result:=(ord(St[1])+ord(St[sred])+ord(St[dlina]))-64;

end

end;
procedure TForm1.FormCreate(Sender: TObject);

var i:integer;

begin

Edit1.Text:='';

Memo1.Text:='';

Memo2.Text:='';

Memo3.Text:='';

Memo4.Text:='';

Memo5.Text:='';

Memo6.Text:='';

Memo7.Text:='';

Memo8.Text:='';

Memo9.Text:='';

StringGrid2.Cells[0,0]:='Номер';

StringGrid2.Cells[1,0]:='Иден-р';

StringGrid1.Cells[0,0]:='Номер';

StringGrid1.Cells[1,0]:='Иден-р';

StringGrid3.Cells[0,0]:='Номер';

StringGrid3.Cells[1,0]:='Лексема';

StringGrid3.Cells[2,0]:='Информация';

StringGrid4.Cells[0,0]:='Номер';

StringGrid4.Cells[1,0]:='Лексема';

StringGrid4.Cells[2,0]:='Тип лексемы';

Memo8.Lines.Add('1. F -> a:=F;');

Memo8.Lines.Add('');

Memo8.Lines.Add('2. F -> F+F');

Memo8.Lines.Add('');

Memo8.Lines.Add('3. F -> F*F');

Memo8.Lines.Add('');

Memo8.Lines.Add('4. F -> F/F');

Memo8.Lines.Add('');

Memo8.Lines.Add('5. F -> (F)');

Memo8.Lines.Add('');

Memo8.Lines.Add('6. F -> -(F)');

Memo8.Lines.Add('');

Memo8.Lines.Add('7. F -> a');


end;
procedure TForm1.Button1Click(Sender: TObject);

label Shag3;
var

S,Word:String;

NRow, i, Kol, u, KolO, Com, Key, Key1: Integer;

begin

{Рисование ХТ и занесение пустых значений во все ее ячейки}

KolO:=0;{Количество колизий}

Com:=0;{Количество сравнений}

u:=1;

with StringGrid1 do

begin
For NRow:=1 to 302 do

begin

cells[0,NRow]:=InttoStr(NRow+64);

cells[1,NRow]:=''

end

end;

{Собственно хэширование}

for i:=0 to Words.Count-1 do

begin

Kol:=0;
s:=Words[i];

key:=HeshFunc(s);
if StringGrid1.Cells[1,Key]='' then begin {ячейка с данным значением ХФ свободна}

Com:=Com+1;{число сравнений}

StringGrid1.Cells[1,Key]:=S;{Заносим запись в ТИ по значению указателя}

end

else {ячейка с данным заначением ХФ занята}

begin

Shag3: Kol:=Kol+1;

KolO:=KolO+1;

Com:=Com+1;

Key1:=((Key + Sl[u]) mod 302)+64;

if StringGrid1.Cells[1,Key1]='' then begin

{ячейка с данным значением ХФ свободна}

Com:=Com+1;{число сравнений}

StringGrid1.Cells[1,Key1]:=S;{Заносим запись в ТИ по значению указателя}

end

else {ячейка с данным заначением ХФ занята}
if Key1=Key then begin

ShowMessage('Ошибка! В ХТ нет свободного места');

Exit

end

else begin

key:=key1;

u:=u+1;

goto Shag3;
end

end;

end;

Word:=InttoStr(KolO);

Form1.Memo2.Lines.Add('ПРИ ДОБАВЛЕНИИ ВСЕХ ЭЛЕМЕНТОВ:');

Form1.Memo2.Lines.Add('Количество колизей '+Word);

word:=InttoSTR(Com);

Form1.Memo2.Lines.Add('Количество сравнений '+Word);

end;
procedure TForm1.Button7Click(Sender: TObject);

var j,i,t,k,a,b,m,n:integer;s1:string;

label 1,2,3,4,5;

begin

k:=0; t:=memo1.Lines.Count; s1:=Edit1.text;

for j:=1 to t do

if StringGrid2.Cells[1,j]<>'' then k:=k+1;

if s1='' then

begin

MessageDlg('Поле ввода пусто', mtInformation,[mbOk],0);

goto 3;

end;

a:=1; b:=k; i:=0;

1: if ((a+b) div 2)=0 then m:=(a+b) div 2 else m:=(a+b) div 2;

i:=i+1;

if s1=StringGrid2.Cells[1,m] then

begin

MessageDlg('Элемент найден', mtInformation,[mbOk],0);

n:=m; goto 2;

end

else

if s1<StringGrid2.Cells[1,m] then

begin

b:=m;

if a=b-1 then

begin

i:=i+1;

if s1=StringGrid2.Cells[1,a] then

begin

MessageDlg('Элемент найден', mtInformation,[mbOk],0);

n:=a; goto 2;

end

else

begin

MessageDlg('Элемент не найден', mtInformation,[mbOk],0); goto 3;

end;

end

else goto 1;

end

else

begin

a:=m;

if a=b then

begin
i:=i+1;

if s1=StringGrid2.Cells[1,b] then

begin

MessageDlg('Элемент найден', mtInformation,[mbOk],0);

n:=b; goto 3;

end

else

begin

MessageDlg('Элемент не найден', mtInformation,[mbOk],0); goto 3;

end;

end

else goto 1;

end;

2:

Memo3.Lines.Add('ПРИ ПОИСКЕ');

Memo3.Lines.Add('Количество сравнений '+IntToStr(i));

Memo3.Lines.Add('Номер ID = '+IntToStr(n)); goto 4;

3:

Memo3.Lines.Add('ПРИ ПОИСКЕ');

Memo3.Lines.Add('Количество сравнений '+IntToStr(i));

Memo3.Lines.Add('Идентификатор не найден!');;

4:

end;
procedure TForm1.Button5Click(Sender: TObject);

var i: integer;

begin

for i:=1 to 510 do StringGrid2.Cells[1,i]:='';

for i:=1 to 510 do StringGrid2.Cells[2,i]:='';

for i:=1 to 510 do StringGrid2.Cells[3,i]:='';

for i:=0 to Memo1.Lines.Count-1 do Memo1.Text:='';

for i:=0 to Memo1.Lines.Count-1 do Memo2.Text:='';

for i:=0 to Memo1.Lines.Count-1 do Memo3.Text:='';

Edit1.Text:='';

end;
procedure TForm1.Button2Click(Sender: TObject);

var F:TextFile;

S:String;

begin

if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(Opendialog1.Filename)

else

begin

ShowMessage('Вы отказались от выбора файла');

Exit

end;

AssignFile(F, OpenDialog1.FileName);

reset(f);{Открытие файла для чтения}

{Создание строкового списка из строк файла}

Words:=TStringList.Create;{Вызов конструктора класса}

Words.Sorted:=False;

Screen.Cursor:=crHourGlass;{Изменение типа курсора перед длительной работой}

{Извлечение строк из файла и занесение их в список}

while not EOF(F) do

begin

readln(F,S);

if S<>'' then Words.Add(S)

end;

Screen.Cursor:=crDefault;{Восстановление типа курсора по умолчанию}

CloseFile(F);

if Words.Count=0 then

begin

ShowMessage('Файл пуст');
Exit;{Выход, если список пуст}

end

end;



procedure TForm1.Button3Click(Sender: TObject);

var i,dlina,t,t1,q,j,j2,d,d1,p:integer;

stroka,j1:string;

label 1;

begin

p:=0;

dlina:=memo1.Lines.Count;d:=dlina;

if dlina<>0 then

begin

StringGrid2.RowCount:=dlina+1;

for i:=0 to dlina-1 do

begin

StringGrid2.Cells[0,i+1]:=IntToStr(i+1);

end;

for i:=0 to dlina-1 do

begin

stroka:=memo1.Lines[i];

d1:=StringGrid2.RowCount;

for j2:=1 to d1 do begin
if stroka=StringGrid2.Cells[1,j2] then begin

goto 1;end;

end;

StringGrid2.Cells[1,i+1]:=stroka;q:=q+1;

p:=p+1

end;

1: for t1:=0 to q-1 do begin

for t:=1 to q-1 do

if (StringGrid2.Cells[1,t+1])<=(StringGrid2.Cells[1,t]) then begin

j1:= StringGrid2.Cells[1,t];

StringGrid2.Cells[1,t]:= StringGrid2.Cells[1,t+1];

StringGrid2.Cells[1,t+1]:=j1;

p:=p+1;

end;end;

d:=dlina-q;

for t:=0 to d-1 do begin

StringGrid2.RowCount:=StringGrid2.RowCount-1;

end;

end;

Form1.Memo3.Lines.Add('ПРИ ДОБАВЛЕНИИ ВСЕХ ЭЛЕМЕНТОВ: ');

Form1.Memo3.Lines.Add('Количество сравнений '+IntToStr(p));

end;
procedure TForm1.Button6Click(Sender: TObject);

label Poisk;

var s,Word:string;

Kol,Com,Key,Key1,u:integer;

begin

Kol:=0; Com:=0; u:=0; S:=Edit1.Text; key:=HeshFunc(s);

Form1.Memo2.Lines.Add('ПРИ ПОИСКЕ ЭЛЕМЕНТА:');

if s='' then begin

Showmessage('Вы не ввели идентификатор для поиска');

Exit

end;

if StringGrid1.Cells[1,Key]='' then begin

Com:=Com+1;

ShowMessage('Идентификатор не найден');
Word:=InttoStr(Com);

Form1.Memo2.Lines.Add('Количество сравнений '+Word);

Word:=InttoStr(Kol);

Form1.Memo2.Lines.Add('Количество колизей '+Word);

Form1.Memo2.Lines.Add('Идентификатор не найден! ');

Exit

end

else

begin

if S=StringGrid1.Cells[1,Key] then

begin

Com:=Com+1;

Word:=InttoStr(Com); Form1.Memo2.Lines.Add('Количество сравнений '+Word);

Word:=InttoStr(Kol); Form1.Memo2.Lines.Add('Количество колизей '+Word);

Word:=InttoStr(Key+64); Form1.Memo2.Lines.Add('Номер ID = '+Word);

Exit

end

else

begin

Kol:=1;

Com:=Com+1;

poisk: Key1:=((Key + Sl[u]) mod 302)+64;

if StringGrid1.Cells[1,Key1]='' then begin

Com:=Com+1;

ShowMessage('Идентификатор не найден');

Word:=InttoStr(Com);
Form1.Memo2.Lines.Add('Количество сравнений '+Word);

Word:=InttoStr(Kol);

Form1.Memo2.Lines.Add('Количество колизей '+Word);

Form1.Memo2.Lines.Add('Идентификатор не найден! ');

Exit

end

else

begin

if S=StringGrid1.Cells[1,Key1] then begin

Com:=Com+1;
Word:=InttoStr(Com); Form1.Memo2.Lines.Add('Количество сравнений '+Word);

Word:=InttoStr(Kol); Form1.Memo2.Lines.Add('Количество колизей '+Word);

Word:=InttoStr(Key1); Form1.Memo2.Lines.Add('Номер ID = '+Word);

Exit

end

else begin

Key:=Key1;

Kol:=Kol+1;

goto Poisk

end

end;

end

end

end;


procedure TForm1.Button4Click(Sender: TObject);

var i,dlina,t,t1,q,j,d :integer;

stroka,j1:string;

label 1,2;

begin

dlina:=StringGrid2.RowCount;d:=dlina;

for j:=1 to dlina do begin
if StringGrid2.Cells[1,j]<>'' then q:=q+1;end;
stroka:=Edit1.Text;

if stroka='' then begin

MessageDlg('Поле ввода пусто',

mtInformation,[mbOk],0);goto 2;

end;

for j:=1 to q do begin

if stroka=StringGrid2.Cells[1,j] then begin

MessageDlg('Такой индификатор есть',

mtInformation,[mbOk],0);goto 2;

end;

end;

StringGrid2.RowCount:=StringGrid2.RowCount+1;

StringGrid2.Cells[0,q+1]:=IntToStr(q+1);

StringGrid2.Cells[1,q+1]:=stroka;
1: for t1:=0 to q do begin

for t:=1 to q do

if (StringGrid2.Cells[1,t+1])<=(StringGrid2.Cells[1,t]) then begin

j1:= StringGrid2.Cells[1,t];

StringGrid2.Cells[1,t]:= StringGrid2.Cells[1,t+1];

StringGrid2.Cells[1,t+1]:=j1;

end;

end;

2:

end;
procedure TForm1.Memo1Change(Sender: TObject);

begin

if Form1.Memo1.Text<>'' then Form1.Button1.Enabled:=true

else Form1.Button1.Enabled:=false;
if Form1.Memo1.Text<>'' then Form1.Button3.Enabled:=true

else Form1.Button3.Enabled:=false;

end;
procedure TForm1.Button8Click(Sender: TObject);

var a:integer;

begin

if OpenDialog1.Execute then

Memo4.Lines.LoadFromFile(OpenDialog1.FileName);

a:=Memo4.Lines.Count;

Label1.Caption:='Всего строк в файле : '+IntToStr(a);

end;
procedure TForm1.Button9Click(Sender: TObject);

var

ind, pos, d1, i, j, i1, f1, zn: integer;

st, str, stroka: string;

sost:TAutoState;

begin

for i:=0 to 2 do

for i1:=1 to 999 do

StringGrid3.Cells[i,i1]:='';

i1:=Memo4.Lines.Count;

ind:=1;

pos:=1;

for i:=1 to i1 do

begin

str:='';

stroka:=Memo4.Lines[i-1];

stroka:=stroka+' ';

d1:=Length(stroka);

sost:=Auto_H;

f1:=0;

zn:=0;

for j:=1 to d1 do

begin

st:=stroka[j];

case sost of

Auto_H:

case stroka[j] of // 1

';': begin sost:=Auto_L; str:=str+st; end;

'I','X','V': begin sost:=Auto_N; str:=str+st; end;

':': begin sost:=Auto_F1; str:=str+st; end;

'(': begin sost:=Auto_O2; str:=str+st; end;

')': begin sost:=Auto_O1; str:=str+st; end;

' ': begin sost:=Auto_H; str:=''; end;

'-','+','''','*','/':begin sost:=Auto_E; str:=str+st; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_L: // ;

case stroka[j] of

' ': begin sost:=Auto_H; f1:=1; zn:=1; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_N: // Римские буквы

case stroka[j] of

'X','I','V': begin sost:=Auto_N; str:=str+st; end;

' ':begin sost:=Auto_H; f1:=1; zn:=12; end;

'a'..'h','j'..'u','w','y','z': begin sost:=Auto_H; f1:=1; zn:=5; str:=str+st; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_O2: // (

case stroka[j] of

' ':begin sost:=Auto_H; f1:=1; zn:=2; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_O1: // )

case stroka[j] of

' ':begin sost:=Auto_H; f1:=1; zn:=3; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_F1: // :=

case stroka[j] of

'=':begin sost:=Auto_F2; str:=str+st; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_F2: // :=

case stroka[j] of

' ':begin sost:=Auto_H; f1:=1; zn:=4; end;

else begin sost:=Auto_E; str:=str+st; end;

end;

Auto_E:

begin

if stroka[j]<>' ' then

begin

sost:=Auto_E;

str:=str+st;

end

else

begin

sost:=Auto_H;

Memo5.Lines.Append(str);

str:='';

end;

end;

end;

if f1=1 then

begin

StringGrid3.Cells[0,ind]:=IntToStr(ind);

StringGrid3.Cells[1,ind]:=str;

case zn of

1: StringGrid3.Cells[2,ind]:='Разделяющий знак';

2: StringGrid3.Cells[2,ind]:='Круглые открывающиеся скобки';

3: StringGrid3.Cells[2,ind]:='Круглые закрывающиеся скобки';

4: StringGrid3.Cells[2,ind]:='Знак присваивания';

5: StringGrid3.Cells[2,ind]:='Идентификатор';

12: StringGrid3.Cells[2,ind]:='Римские цифры';

end;

str:='';

ind:=ind+1;

f1:=0;

end;

end;

end;

Label2.Caption:='Число лексем : '+IntToStr(ind-1);

end;

procedure TForm1.Button10Click(Sender: TObject);

var i, i1: integer;

begin

for i:=0 to 2 do

for i1:=1 to 999 do

StringGrid3.Cells[i,i1]:='';

Memo4.Clear;

Label2.Caption:='Число лексем:0';

Memo5.Clear;

Label1.Caption:='Всего строк в файле:0';

end;

// Дерево вывода

procedure TForm1.Button11Click(Sender: TObject);

begin

if OpenDialog1.Execute then Memo6.Lines.LoadFromFile(OpenDialog1.FileName) ;

end;
procedure TForm1.Button12Click(Sender: TObject);

Const n1=10;

n2=7;

n3=10;

n4=5;

Label M1,M2;

var

CepofV:array [1..100]of integer;

vx,stek,d:TStringList;

ind,dl,i,j,i1,i2,i4,j2,fl,fl2,zn,n,m,k,vetv,u:integer;

st,str,stroka,g1,g2,g3,g4,g5,g6,pr:string;

sost:TAutoState;

MyTreeNode:TTreeNode;

nodeTree: TTreeNode;

const

matrix: array [1..n3,1..n3] of char =(

(' ','>','=','>',' ','>','>',' ','>',' '),

(' ',' ',' ',' ',' ',' ',' ',' ',' ','>'),

('<','=',' ','<','<','<','<','<',' ',' '),

('<','>',' ','>','<','<','<','<','>',' '),

(' ',' ',' ',' ',' ',' ',' ','=',' ',' '),

('<','>',' ','>','<','>','>','<','>',' '),

('<','>',' ','>','<','>','>','<','>',' '),

('<',' ',' ','<','<','<','<','<','=',' '),

(' ','>',' ','>',' ','>','>',' ','>',' '),

('<',' ',' ',' ',' ',' ',' ',' ',' ',' '));

prav_1:array [1..n2,1..2] of string= (

('1','a:=E;'),

('2','E+E'),

('3','E*E'),

('4','E/E'),

('5','(E)'),

('6','-(E)'),

('7','a'));

term:array [1..n1,1..2] of string =(

('1','a'),

('2',';'),

('3',':='),

('4','+'),

('5','-'),

('6','*'),

('7','/'),

('8','('),

('9',')'),

('10','!'));

notterm:array [1..7] of char=

('E','E','E','E','E','E','E');

Canon:array [1..7,1..4] of string= (

('a',':=','E',';'),

('E','+','E',''),

('E','*','E',''),

('E','/','E',''),

('(','E',')',''),

('-','(','E',')'),

('a','','',''));

begin

u:=1;

vx:=TStringList.Create;

vx.Sorted:=False;

stek:=TStringList.Create;

stek.Sorted:=False;

d:=TStringList.Create;

d.Sorted:=False;

for i:=0 to 2 do

for i1:=1 to 999 do

StringGrid4.Cells[i,i1]:='';

i1:=Memo6.Lines.Count;

if i1=0 then begin ShowMessage('Ошибка!');

exit;

end;

ind:=1;

for i:=1 to i1 do

begin

str:='';

stroka:=Memo6.Lines[i-1];

stroka:=stroka+' ';

dl:=Length(stroka);

sost:=AUTO_H;

fl:=0;

zn:=0;

for j:=1 to dl do

begin

st:=stroka[j];

case sost of

AUTO_H:

case stroka[j] of

';': begin sost:=AUTO_R;str:=str+st; end;

'(': begin sost:=AUTO_Sk;str:=str+st; end;

')': begin sost:=AUTO_Sk1;str:=str+st; end;

':': begin sost:=AUTO_Q;str:=str+st; end;

'+': begin sost:=AUTO_A;str:=str+st; end;

'-': begin sost:=AUTO_N;str:=str+st; end;

'*': begin sost:=AUTO_O;str:=str+st; end;

'/': begin sost:=AUTO_X;str:=str+st; end;

'a'..'z': begin sost:=AUTO_I;str:=str+st; end;

'I','X','V': begin sost:=AUTO_C1;str:=str+st; end;

' ': begin sost:=AUTO_H;str:=''; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_R:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=1; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_Sk:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=2; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_Sk1:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=3; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_Q:

case stroka[j] of

'=': begin sost:=AUTO_Q1;str:=str+st; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_Q1:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=4; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_A:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=6; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_N:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=7; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_X:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=8; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_O:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=9; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;
AUTO_C1:

case stroka[j] of

' ': begin sost:=AUTO_H;fl:=1;zn:=10;end;

'X','I','V': begin sost:=Auto_N; str:=str+st; end;

'a'..'h','j'..'u','w','y','z': begin sost:=Auto_H; fl:=1; zn:=5; str:=str+st; end;

else begin sost:=AUTO_E; str:=str+st; end;

end;

AUTO_I:

case stroka[j] of

'a'..'z': begin sost:=AUTO_I;str:=str+st; end;

' ': begin sost:=AUTO_H;fl:=1;zn:=5; end;

else begin sost:=AUTO_E;str:=str+st; end;

end;

AUTO_E: begin

if stroka[j]<>' 'then

begin

sost:=AUTO_E;

str:=str+st;

end

else

begin

sost:=AUTO_H;

Memo7.Lines.Append(str);

str:='';

end;

end;

end;

if fl=1 then

begin

StringGrid4.Cells[0,ind]:=IntToStr(ind);

StringGrid4.Cells[1,ind]:=str;

case zn of

1: Begin StringGrid4.Cells[2,ind]:='Разделяющий знак'; vx.Add(';'); end;

2: Begin StringGrid4.Cells[2,ind]:='Круглые открывающиеся скобки'; vx.Add('('); end;

3: Begin StringGrid4.Cells[2,ind]:='Круглые закрывающиеся скобки'; vx.Add(')'); end;

4: Begin StringGrid4.Cells[2,ind]:='Знак присваевания'; vx.Add(':='); end;

5: Begin StringGrid4.Cells[2,ind]:='Идентификатор'; vx.Add('a'); end;

6: Begin StringGrid4.Cells[2,ind]:='Знак +'; vx.Add('+'); end;

7: Begin StringGrid4.Cells[2,ind]:='Знак -'; vx.Add('-'); end;

8: Begin StringGrid4.Cells[2,ind]:='Знак деления /'; vx.Add('/'); end;

9: Begin StringGrid4.Cells[2,ind]:='Знак умножения *'; vx.Add('*'); end;

10: Begin StringGrid4.Cells[2,ind]:='Римские числа'; vx.Add('a'); end;

end;

str:='';

ind:=ind+1;

fl:=0;

end;

end;

end;

fl:=vx.Count;

if fl=0 then begin ShowMessage('Ошибка!'); exit;end;

vx.Add('!');

stek.Add('!');

stek.Add(vx.Strings[0]);

vx.Delete(0);

ind:=vx.Count-1;

g1:=vx.Strings[0];

fl:=stek.Count-1;

g2:=stek.Strings[fl];

repeat

Begin

g1:=vx.Strings[0];

fl:=stek.Count-1;

repeat

if stek.Strings[fl]<>'E' then g2:=stek.Strings[fl]

else fl:=fl-1;

until(g2<>'E');

j:=1;i1:=0;

repeat

if term[j][2]=g1 then i1:=StrToInt(term[j][1])

else j:=j+1;

until(i1<>0);

j:=1;i2:=0;

repeat

if term[j][2]=g2 then i2:=StrToInt(term[j][1])

else j:=j+1;

until(i2<>0);

g3:=matrix[i2][i1];

if (g3='=')or(g3='<') then

begin stek.Add(g1);vx.Delete(0); end

else

if g3='>' then

begin

if fl=stek.Count-1 then

begin

dl:=1;

i:=1;

pr:=g2;

M1:

g4:=stek.Strings[fl-i];

if g4<>'E' then begin

j:=1;i4:=0;

repeat

if term[j][2]=g4 then i4:=StrToInt(term[j][1])

else j:=j+1;

until(i4<>0);

g5:=matrix[i4][i2];

if g5='='then

begin

dl:=dl+1;pr:=g4+pr;i:=i+1;i2:=i4;

goto M1;

end

else begin goto M2; end;

end

else

begin

if stek.Strings[fl-i-1]<>'E' then

begin

j:=1;i4:=0;

repeat

if term[j][2]=stek.Strings[fl-i-1] then i4:=StrToInt(term[j][1])

else j:=j+1;

until(i4<>0);

g5:=matrix[i4][i2];

if g5='='then

begin

dl:=dl+1;pr:=g4+pr; i:=i+1;goto M1;

end

else begin goto M2; end;

end;

end;

end

else

begin

dl:=1;

i:=1;

pr:=g2;

g4:=stek.Strings[fl-i];

g6:=stek.Strings[fl+i];

if (g4='E')and(g6='E') then begin pr:='E'+g2+'E';dl:=3;end

else begin ShowMessage('Ошибка ('+g2+')!');exit; end;

end;

M2:

for j:=1 to dl do stek.Delete(stek.Count-1);

j:=1;zn:=0;

repeat

if prav_1[j][2]=pr then zn:=StrToInt(prav_1[j][1])

else j:=j+1;

until(zn<>0);

stek.Add('E');

d.Add(IntToStr(zn));

CepofV[u]:=zn;

u:=u+1;

end

else begin ShowMessage('Ошибка!');exit; end;

fl:=stek.Count-1;

g1:=vx.Strings[0];

g2:=stek.Strings[fl-1];

end;

until (g1='!')and(g2='!');

vx.Clear;

str:='';

i4:=d.Count-1;

for i:=0 to i4 do str:=str+d.Strings[i]+' ';

memo9.Text:=str;

n:=d.Count;

with TreeView1 do

begin

Items.Clear;

Items.Add(Nil,'E');

vetv:=0;

j:=0;

for k:=n downto 1 do begin

m:=Items.Count;

if k<n then

for i:=m-1 downto 0 do if (Items[i].Text=notterm[CepofV[k]])and(Items[i].HasChildren=False) then begin vetv:=i;break; end;

for i:=1 to 4 do

if Canon[CepofV[k],i]<>'' then Items.AddChild(Items[vetv],Canon[CepofV[k],i]);

end;

FullExpand

end;

vx.Destroy;

stek.Destroy;

d.Destroy;

end;
end.


Приложение Б.

^ Граф конечного детерминированного автомата.



Скачать файл (300 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru