Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
02.05.2014
Размер:
223.23 Кб
Скачать

Приложение А

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

unit Uni;

interface

uses

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

StdCtrls, Grids, ComCtrls;

type

TAutoState = (AUTO_SD1,AUTO_SD2, AUTO_SD_L,AUTO_SD_PR,AUTO_G,AUTO_OR,AUTO_F,AUTO_F1,AUTO_NOT,

AUTO_D,AUTO_D1,AUTO_AND,AUTO_PL,AUTO_MIN,AUTO_I,AUTO_I1,AUTO_I2,AUTO_I3,AUTO_BEGIN,

AUTO_J,AUTO_J1,AUTO_END,AUTO_TO,

AUTO_K,AUTO_K1,AUTO_K2,AUTO_K3,AUTO_K4,AUTO_DOWNTO,

AUTO_L,AUTO_L1,AUTO_FOR,

AUTO_M,AUTO_DO,

AUTO_BIN, AUTO_ZAK,

AUTO_OTKR,AUTO_OTKR1,AUTO_ZAKR,AUTO_ZAKR1,

AUTO_PROG,AUTO_PROG1,AUTO_PROG2,AUTO_PROG3,

AUTO_H,AUTO_A,AUTO_IF,AUTO_B,AUTO_B1,AUTO_B2,AUTO_THEN,AUTO_C,AUTO_C1,

AUTO_C2,AUTO_ELSE,AUTO_RAZD,AUTO_OS,AUTO_RC,AUTO_p,AUTO_PRISV,AUTO_ID,AUTO_E,AUTO_S);

TForm1 = class(TForm)

OpenDialog1: TOpenDialog;

PageControl1: TPageControl;

TabSheet1: TTabSheet;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label13: TLabel;

Label6: TLabel;

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

StringGrid2: TStringGrid;

Memo2: TMemo;

Edit1: TEdit;

Button4: TButton;

Memo3: TMemo;

Button5: TButton;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

StringGrid1: TStringGrid;

Edit6: TEdit;

Edit7: TEdit;

Memo4: TMemo;

Edit8: TEdit;

Edit9: TEdit;

Edit10: TEdit;

Button6: TButton;

Button7: TButton;

Edit11: TEdit;

Edit13: TEdit;

StringGrid3: TStringGrid;

Edit5: TEdit;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

Label12: TLabel;

Label14: TLabel;

Button9: TButton;

Button8: TButton;

Memo5: TMemo;

Memo6: TMemo;

StringGrid4: TStringGrid;

Label15: TLabel;

Button10: TButton;

Button3: TButton;

StringGrid5: TStringGrid;

StringGrid6: TStringGrid;

Memo7: TMemo;

Label16: TLabel;

Memo8: TMemo;

TreeView1: TTreeView;

Button11: TButton;

Edit12: TEdit;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Button11Click(Sender: TObject);

private

{ Private declarations }

public

ukazatel,vssrav,knop,vssrav1,knop1:integer;

srsrav,srsrav1: real;

inputString:TStringList;

end;

const

PredMatrix:array [1..27,1..27] of char=

( {pr end. ; if then els beg end for to do dow := or and < > = not - + >> << a ( ) !}

{prog} (' ','=','<','<',' ',' ','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{end.} (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<'),

{;} (' ','>','>','<',' ',' ','<','>','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{if} (' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ','<','<','<','<','<','<','<','<',' ',' ','<','<',' ',' '),

{then} (' ','>','>','<',' ','=','<','>','<','>',' ','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{else} (' ','>','>','<',' ','>','<','>','<','>',' ','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{begin}(' ',' ','<','<',' ',' ','<','=','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{end} (' ','>','>',' ',' ','>',' ','>',' ','>',' ','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),

{for} (' ',' ',' ','<',' ',' ','<',' ','<','=',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{to} (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{do }(' ','>','>','<',' ','>','<','>','<','>',' ','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{dow} (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' '),

{:=} (' ','>','>',' ',' ','>',' ','>',' ','>',' ','>',' ',' ',' ',' ',' ',' ',' ','<','<',' ',' ','<','<','=',' '),

{or} (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','>','<','<','<','<','<','<','<',' ',' ','<','<','>',' '),

{and} (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','>','<','<','<','<','<','<','<',' ',' ','<','<','>',' '),

{< } (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','>','<',' ',' ',' ',' ','<','<',' ',' ','<','<','>',' '),

{>} (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','>','<',' ',' ',' ',' ','<','<',' ',' ','<','<','>',' '),

{=} (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','>','<',' ',' ',' ',' ','<','<',' ',' ','<','<','>',' '),

{not} (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ',' '),

{-} (' ','>','>',' ','>','>',' ','>',' ','>',' ','>',' ','>','>','>','>','>','>','>','>',' ',' ','<','<','>',' '),

{+} (' ','>','>',' ','>','>',' ','>',' ','>',' ','>',' ','>','>','>','>','>','>','>','>',' ',' ','<','<','>',' '),

{>>} (' ','>','>',' ','>','>',' ','>',' ','>',' ','>',' ','>','>','>','>','>','>','>','>',' ',' ','<','<','>',' '),

{<<} (' ','>','>',' ','>','>',' ','>',' ','>',' ','>',' ','>','>','>','>','>','>','>','>',' ',' ','<','<','>',' '),

{a} (' ','>','>',' ','>','>',' ','>',' ','>','>','>','=','>','>','>','>','>','>','>','>','=','=',' ',' ','>',' '),

{(} (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=','<','<','<','<','<','<','<','<',' ',' ','<','>','=',' '),

{)} (' ','>','>',' ',' ','>',' ','>',' ','>','>','>',' ','>','>','>','>','>','>','>','>',' ',' ',' ',' ','>',' '),

{!} ('<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '));

{Iienaiea i?aaee a?aiiaoeee}

grammar:array [1..26] of string=

('progEend.','E','E;E','E;','ifEthenEelseE','ifEthenE','beginEend','forEtoEdoE','forEdowntoEdoE','a:=E',

'EorE','E','EandE','E','E<E','E>E','E=E','not(E)','E','E-E','E+E','a>>E','a<<E','E','a','(E)');

term:array [1..27] of string=

('prog','end.',';','if','then','else','begin','end','for','to','do','downto',':=','or','and','<','>','=','not','-','+','>>','<<','a','(',')','!');

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

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

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

CanonO:array [1..26,1..6] of string=

(('prog','E','end.','','',''),

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

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

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

('if','E','then','E','else','E'),

('if','E','then','E','',''),

('begin','E','end','','',''),

('for','E','to','E','do',''),

('for','E','downto','E','do',''),

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

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

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

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

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

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

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

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

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

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

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

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

('a','>>','E','','',''),

('a','<<','E','','',''),

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

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

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

var

Form1: TForm1;

implementation

function IndMatrix(SymS:String):integer;

var iq:integer;

begin

indMatrix:=0;

if term[1]=SymS then IndMatrix:=1;

for iq:=1 to 27 do

if term[iq]=SymS then IndMatrix:=iq;

end;

function inArray(myS:String;A:Array of string;N:integer):boolean;

var i:integer;

begin

inArray:=False;

if myS='prog' then inArray:=true;

for i:=1 to N do

if myS=A[i] then begin inArray:=true end;

end;

function NomRul(myS:String):integer;

var i:integer;

begin

NomRul:=0;

if (myS=grammar[1])then NomRul:=1;

for i:=1 to 26 do

if grammar[i]=myS then NomRul:=i;

end;

function findnt(myS:String):string;

begin

findnt:='';

findnt:=notterm[nomRul(myS)]

end;

{===============================================================================}

{var

Form1: TForm1; }

{implementation}

{$R *.DFM}

const hash_max = ord('я')+ord('я');

{hash_min = ord('A')+ord('A');}

function Hesh(St:string):integer;

var dlina:integer;

begin

dlina:=length(St);

if dlina=0 then Result:=0 else

begin

if dlina>=3 then

begin

Result:=ord(St[(dlina+1)div 2])+ord(St[dlina]);

end

else begin

Result:=ord(St[1]);

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if OpenDialog1.execute then

Memo1.lines.loadFromFile(OpenDialog1.FileName)

end;

procedure TForm1.Button2Click(Sender: TObject);

var i,k,dlina,hash,j,kol:integer;

stroka:string;

label 1,2;

begin

j:=0;

k:=1;

kol:=0;

ukazatel:=0;

dlina:=memo1.Lines.Count;

if dlina<>0 then

begin

for i:=0 to dlina-1 do

begin

stroka:=memo1.Lines[i];

hash:=Hesh(stroka);

if (StringGrid2.cells[1,hash])='' then

begin

StringGrid2.cells[1,hash]:=IntToStr(hash);

StringGrid2.cells[2,hash]:=stroka;

end

else

begin

1: if (StringGrid2.cells[2,hash])=stroka then

begin

memo2.Lines[j]:='Удален повтор '+stroka;

j:=j+1;

ukazatel:=ukazatel+1;

goto 2;

end

else

begin

kol:=kol+1;

hash:=(Hesh(stroka)+k) mod 509;

if (StringGrid2.cells[1,hash])='' then

begin

StringGrid2.cells[1,hash]:=IntToStr(hash);

StringGrid2.cells[2,hash]:=stroka;

end

else

begin

k:=k+1;

goto 1;

end;

end;

end;

2: end;

end;

Edit2.Text:=IntToStr(kol);

end;

procedure TForm1.FormCreate(Sender: TObject);

var i:integer;

begin

srsrav:=0;

knop:=0;

vssrav:=0;

srsrav1:=0;

knop1:=0;

vssrav1:=0;

Edit1.Text:='';

Edit2.Text:='';

Edit3.Text:='';

Edit4.Text:='';

Edit5.Text:='';

Edit6.Text:='';

Edit7.Text:='';

Edit8.Text:='';

Edit9.Text:='';

Edit10.Text:='';

Edit11.Text:='';

Edit13.Text:='';

memo1.Text:='';

memo2.Text:='';

memo3.Text:='';

memo4.Text:='';

memo8.Text:='';

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

StringGrid2.Cells[1,0]:='ХФ';

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

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

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

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

StringGrid3.Cells[1,0]:='ХФ';

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

StringGrid3.Cells[3,0]:='Ссылки';

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

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

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

StringGrid6.Cells[1,0]:='ХФ';

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

StringGrid6.Cells[3,0]:='Ссылки';

for i:=1 to 510 do StringGrid2.Cells[0,i]:=IntToStr(i);

for i:=1 to 510 do StringGrid1.Cells[0,i]:=IntToStr(i);

for i:=1 to 510 do StringGrid5.Cells[0,i]:=IntToStr(i);

for i:=1 to 510 do StringGrid6.Cells[0,i]:=IntToStr(i);

Memo5.Text:='';

Memo6.Text:='';

StringGrid4.Cells[0,0]:='№';

StringGrid4.Cells[1,0]:='Значение';

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

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

close;

end;

procedure TForm1.Button4Click(Sender: TObject);

var k,hash,dlina,i,srav,j,si: integer;

stroka: string;

label met1,met2;

begin

knop:=knop+1;

memo3.Lines[0]:='';

k:=1;

srav:=0;

stroka:=Edit1.Text;

if stroka='' then

begin

memo3.Lines[0]:='Поле пусто!';

goto met1;

end;

dlina:=memo1.Lines.Count;

hash:=Hesh(stroka);

for i:=1 to 510 do

begin

srav:=srav+1;

if StringGrid2.Cells[1,hash]=IntToStr(hash) then

begin

if stroka=StringGrid2.Cells[2,hash] then

begin

memo3.Lines[0]:='Иден-р '+stroka+' найден! Его номер '+ IntToStr(hash);

goto met1;

end

else

begin

for j:=1 to 510 do

begin

srav:=srav+1;

hash:=(Hesh(stroka)+k) mod 509;

k:=k+1;

if StringGrid2.Cells[1,hash]=IntToStr(hash) then

begin

if stroka=StringGrid2.Cells[2,hash] then

begin

memo3.Lines[0]:='Иден-р '+stroka+' найден! Его номер '+ IntToStr(hash);

goto met1;

end;

end

else memo3.Lines[0]:='Иден-р '+stroka+' не найден!';

end;

end;

end

else begin

memo3.Lines[0]:='Иден-р '+stroka+' не найден!';

goto met1; end;

end;

met1: Edit3.Text:=inttostr(hash);

Edit4.Text:=inttostr(srav);

dlina:=memo1.Lines.Count;

for si:=0 to dlina-1 do

begin

k:=1;

srav:=0;

stroka:=memo1.Lines[si];

hash:=Hesh(stroka);

for i:=1 to 510 do

begin

srav:=srav+1;

if StringGrid2.Cells[1,hash]=IntToStr(hash) then

begin

if stroka=StringGrid2.Cells[2,hash] then

begin

goto met2;

end

else

begin

for j:=1 to 510 do

begin

srav:=srav+1;

hash:=(Hesh(stroka)+k) mod 509;

k:=k+1;

if StringGrid2.Cells[1,hash]=IntToStr(hash) then

begin

if stroka=StringGrid2.Cells[2,hash] then

begin

goto met2;

end;

end;

end;

end;

end

else begin

goto met2; end;

end;

met2: vssrav:=vssrav+srav;

end;

srsrav:=vssrav/dlina;

Edit11.Text:=inttostr(vssrav);

Edit9.Text:=floattostr(srsrav);

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 StringGrid1.Cells[1,i]:='';

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

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

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

memo1.Text:='';

memo2.Text:='';

memo3.Text:='';

memo4.Text:='';

Edit1.Text:='';

Edit2.Text:='';

Edit3.Text:='';

Edit4.Text:='';

Edit5.Text:='';

Edit6.Text:='';

Edit7.Text:='';

Edit8.Text:='';

Edit9.Text:='';

Edit10.Text:='';

Edit11.Text:='';

Edit13.Text:='';

end;

procedure TForm1.Button6Click(Sender: TObject);

var i,dlina,hash,useukazat,kol,j:integer;

stroka:string;

label 1,2;

begin

kol:=0;

ukazatel:=1;

j:=0;

dlina:=memo1.Lines.Count;

if dlina<>0 then

begin

StringGrid3.RowCount:=dlina+1;

for i:=1 to dlina do

begin

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

end;

for i:=0 to dlina-1 do

begin

stroka:=memo1.Lines[i];

hash:=Hesh(stroka);

if StringGrid1.cells[1,hash]='' then

begin

StringGrid1.cells[1,hash]:=IntToStr(ukazatel);

StringGrid3.cells[1,ukazatel]:=IntToStr(hash);

StringGrid3.cells[2,ukazatel]:=stroka;

ukazatel:=ukazatel+1;

goto 1;

end;

if StringGrid1.cells[1,hash]<>'' then

begin

useukazat:=StrToInt(StringGrid1.cells[1,hash]);

2: if stroka=StringGrid3.Cells[2,useukazat] then

begin

memo2.Lines[j]:='Удален повторяющийся идентификатор '+stroka;

j:=j+1;

end

else if StringGrid3.cells[3,useukazat]='' then

begin

StringGrid3.cells[3,useukazat]:=IntToStr(ukazatel);

StringGrid3.cells[1,ukazatel]:=IntToStr(hash);

StringGrid3.cells[2,ukazatel]:=stroka;

ukazatel:=ukazatel+1;

inc(kol);

goto 1;

end;

if StringGrid3.cells[3,useukazat]<>'' then

begin

useukazat:=StrToInt(StringGrid3.cells[3,useukazat]);

goto 2;

end;

end;

1: end;

end;

Edit5.Text:=IntToStr(kol);

StringGrid3.RowCount:=ukazatel+1;

end;

procedure TForm1.Button7Click(Sender: TObject);

var useukaz,hash,srav,dlina,si,kol,i,j: integer;

stroka: string;

label met1, met2, met3, met4;

begin

srav:=0;

kol:=0;

memo4.Lines[0]:='';

stroka:=Edit8.Text;

if stroka='' then

begin

memo4.Lines[0]:='Поле пусто!';

goto met1;

end;

hash:=Hesh(stroka);

if StringGrid1.Cells[1,hash]=''

then memo4.Lines[0]:='Идентификатор '+stroka+' не найден!' else

begin

useukaz:=StrToInt(StringGrid1.Cells[1,hash]);

met3: srav:=srav+1;

if StringGrid3.Cells[2,useukaz]=stroka then

begin

memo4.Lines[0]:='Идентификатор '+stroka+' найден! Его номер '+ IntToStr(useukaz);

goto met1;

end ;

if stroka<>StringGrid3.Cells[2,useukaz] then

begin

useukaz:=StrToInt(StringGrid3.Cells[3,useukaz]);

kol:=kol+1;

goto met3;

end;

end;

met1:

Edit6.Text:=inttostr(hash) ;

Edit7.Text:=inttostr(srav) ;

vssrav:=0;

dlina:=memo1.Lines.Count;

for si:=0 to dlina-1 do

begin

srav:=0;

stroka:=memo1.Lines[si];

hash:=Hesh(stroka);

useukaz:=StrToInt(StringGrid1.Cells[1,hash]);

met2: srav:=srav+1;

if StringGrid3.Cells[2,useukaz]=stroka then goto met4;

if stroka<>StringGrid3.Cells[2,useukaz] then

begin

useukaz:=StrToInt(StringGrid3.Cells[3,useukaz]);

goto met2;

end;

met4: vssrav:=vssrav+srav;

end;

srsrav:=vssrav/dlina;

Edit13.Text:=inttostr(vssrav);

Edit10.Text:=floattostr(srsrav);

vssrav:=0;

srsrav:=0;

end;

procedure TForm1.Button8Click(Sender: TObject);

begin

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

end;

procedure TForm1.Button9Click(Sender: TObject);

Const N1=26;

N2=21;

N3=26;

N4=5;

var ind,pos,dl,i,j,i1,fl,fll,zn:integer;

st,str,sInput:string;

iState:TAutoState;

dlina,hash,useukazat,kol,f:integer;

stroka:string;

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

p,stek,d:TStringList;

o1,o2,o3,o4,o5,o6,pr:string;

MyTreeNode:TTreeNode;

nodeTree: TTreeNode;

label 1,2;

begin

fll:=0;

inputString:=TStringList.Create;

inputString.Sorted:=False;

for i:=0 to 2 do

for j:=1 to 999 do

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

j:=Memo5.Lines.Count;

ind:=1;

pos:=1;

for i:=1 to j do

begin

str:='';

sInput:=Memo5.Lines[i-1];

sInput:=sInput+' ';

dl:=Length(sInput);

iState:=AUTO_H;

fl:=0;

zn:=0;

for j:=1 to dl do

begin

st:=sInput[j];

case iState of

AUTO_H:

case sInput[j] of

'b': begin iState:=AUTO_I;str:=str+st; end;

'(': begin iState:=AUTO_OTKR1;str:=str+st; end;

')': begin iState:=AUTO_ZAK;str:=str+st; end;

'p': begin iState:=AUTO_PROG1;str:=str+st;end;

'0': begin iState:=AUTO_BIN;str:=str+st;end;

'f': begin iState:=AUTO_L;str:=str+st; end;

'd': begin iState:=AUTO_K;str:=str+st; end;

'+': begin iState:=AUTO_PL;str:=str+st; end;

'-': begin iState:=AUTO_MIN;str:=str+st; end;

'>': begin iState:=AUTO_SD1;str:=str+st; end;

'<': begin iState:=AUTO_SD2;str:=str+st; end;

'a': begin iState:=AUTO_D;str:=str+st; end;

'o': begin iState:=AUTO_G;str:=str+st; end;

'n': begin iState:=AUTO_F;str:=str+st; end;

'i': begin iState:=AUTO_A;str:=str+st; end;

't': begin iState:=AUTO_B;str:=str+st; end;

'e': begin iState:=AUTO_C;str:=str+st; end;

'=': begin iState:=AUTO_OS;str:=str+st; end;

';': begin iState:=AUTO_RAZD;str:=str+st; end;

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

':': begin iState:=AUTO_P;str:=str+st; end;

'c','g'..'h','j'..'m','q','s','u'..'z','1'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_ZAK:

case sInput[j] of

' ':begin iState:=AUTO_H; fl:=1;zn:=61; end;

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

end;

AUTO_OTKR1:

case sInput[j] of

' ':begin iState:=AUTO_H; fl:=1;zn:=60; end;

'*':begin iState:=AUTO_OTKR; end;

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

end;

AUTO_OTKR:

case sInput[j] of

'*':begin iState:=AUTO_ZAKR1;end;

else begin iState:= AUTO_OTKR; end;

end;

AUTO_ZAKR1:

case sInput[j] of

')':begin iState:=AUTO_H; fll:=0; end;

else begin iState:= AUTO_OTKR; end;

end;

AUTO_ZAKR:

case sInput[j] of

' ':begin iState:=AUTO_H;fl:=1;zn:=41; end;

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

end;

AUTO_PROG1:

case sInput[j] of

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

'r':begin iState:=AUTO_PROG2; str:=str+st; end;

'a'..'q','s'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_PROG2:

case sInput[j] of

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

'o':begin iState:=AUTO_PROG3; str:=str+st; end;

'a'..'n','p'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_PROG3:

case sInput[j] of

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

'g':begin iState:=AUTO_PROG; str:=str+st; end;

'a'..'f','h'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_PROG:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_BIN:

case sInput[j] of

' ':begin iState:=AUTO_H; fl:=1;zn:=30;end;

'1','0':begin iState:=AUTO_BIN;str:=str+st;end;

'a'..'z','2'..'9':begin iState:=AUTO_ID;str:=str+st;end;

end;

AUTO_L:

case sInput[j] of

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

'o':begin iState:=AUTO_L1; str:=str+st; end;

'a'..'n','p'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_L1:

case sInput[j] of

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

'r':begin iState:=AUTO_FOR; str:=str+st; end;

'a'..'q','s'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_FOR:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_K:

case sInput[j] of

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

'o':begin iState:=AUTO_K1; str:=str+st; end;

'a'..'n','p'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_K1:

case sInput[j] of

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

'w':begin iState:=AUTO_K2; str:=str+st; end;

'a'..'v','x'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_K2:

case sInput[j] of

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

'n':begin iState:=AUTO_K3; str:=str+st; end;

'a'..'m','o'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_K3:

case sInput[j] of

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

't':begin iState:=AUTO_K4; str:=str+st; end;

'a'..'s','u'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_K4:

case sInput[j] of

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

'o':begin iState:=AUTO_DOWNTO; str:=str+st; end;

'a'..'n','p'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_DOWNTO:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_PL:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=22;end;

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

end;

AUTO_MIN:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=23;end;

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

end;

AUTO_SD1:

case sInput[j] of

'>':begin iState:=AUTO_SD_PR; str:=str+st; end;

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

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

end;

AUTO_SD2:

case sInput[j] of

'<':begin iState:=AUTO_SD_L; str:=str+st; end;

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

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

end;

AUTO_SD_PR:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=20;end;

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

end;

AUTO_SD_L:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=21;end;

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

end;

AUTO_D:

case sInput[j] of

'n':begin iState:=AUTO_D1; str:=str+st; end;

'>','<','=',';',':':begin iState:= AUTO_E;str:=str+st; end;

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

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_D1:

case sInput[j] of

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

'd':begin iState:=AUTO_AND; str:=str+st; end;

'a'..'c','e'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_AND:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_G:

case sInput[j] of

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

'r':begin iState:=AUTO_OR; str:=str+st; end;

'a'..'q','s'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_OR:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_F:

case sInput[j] of

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

'o':begin iState:=AUTO_F1; str:=str+st; end;

'a'..'n','p'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_F1:

case sInput[j] of

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

't':begin iState:=AUTO_NOT; str:=str+st; end;

'a'..'s','u'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_NOT:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_ID:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_P:

case sInput[j] of

'=': begin iState:=AUTO_PRISV;str:=str+st; end;

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

end;

AUTO_PRISV:

case sInput[j] of

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

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

end;

AUTO_A:

case sInput[j] of

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

'f': begin iState:=AUTO_IF;str:=str+st; end;

'>','<','=',';',':': begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_IF:

case sInput[j] of

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

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

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

end;

AUTO_B:

case sInput[j] of

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

'h': begin iState:=AUTO_B1;str:=str+st; end;

'o': begin iState:=AUTO_TO;str:=str+st; end;

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_B1:

case sInput[j] of

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

'e':begin iState:=AUTO_B2;str:=str+st; end;

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_B2:

case sInput[j] of

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

'n':begin iState:=AUTO_THEN;str:=str+st; end;

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_THEN:

case sInput[j] of

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

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_C:

case sInput[j] of

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

'l':begin iState:=AUTO_C1;str:=str+st; end;

'n':begin iState:=AUTO_J;str:=str+st;end;

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_C1:

case sInput[j] of

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

's':begin iState:=AUTO_C2;str:=str+st; end;

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_C2:

case sInput[j] of

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

'e':begin iState:=AUTO_ELSE;str:=str+st; end;

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_ELSE:

case sInput[j] of

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

'>','<','=',';',':':begin iState:=AUTO_E;str:=str+st; end;

else begin iState:=AUTO_ID;str:=str+st; end;

end;

AUTO_OS:

case sInput[j] of

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

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

end;

AUTO_RAZD:

case sInput[j] of

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

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

end;

AUTO_I:

case sInput[j] of

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

'e':begin iState:=AUTO_I1;str:=str+st; end;

'a'..'d','f'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_I1:

case sInput[j] of

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

'g':begin iState:=AUTO_I2;str:=str+st; end;

'a'..'f','h'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_I2:

case sInput[j] of

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

'i':begin iState:=AUTO_I3;str:=str+st; end;

'a'..'h','j'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_I3:

case sInput[j] of

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

'n':begin iState:=AUTO_BEGIN;str:=str+st; end;

'a'..'m','o'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_BEGIN:

case sInput[j] of

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

'a'..'f','h'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_J1:

case sInput[j] of

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

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

end;

AUTO_J:

case sInput[j] of

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

'd':begin iState:=AUTO_END;str:=str+st;end;

'a'..'c','e'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_END:

case sInput[j] of

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

'.':begin iState:=AUTO_J1; str:=str+st;end;

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_TO:

case sInput[j] of

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

'a'..'z','0'..'9':begin iState:=AUTO_ID;str:=str+st; end;

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

end;

AUTO_E: begin

if sInput[j]<>' 'then

begin

iState:=AUTO_E;

str:=str+st;

end

else

begin

iState:=AUTO_H;

Memo6.Lines.Append(str);

str:='';

end;

end;

end;

if fll=0 then 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]:='Римская цифра'; inputString.Add(str); end;

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

3:begin StringGrid4.Cells[2,ind]:='Оператор присваивания';inputString.Add(':='); end;

4:begin StringGrid4.Cells[2,ind]:='Ключевое слово';inputString.Add(str); end;

7:begin StringGrid4.Cells[2,ind]:='Оператор сравнения';inputString.Add(str); end;

8:begin StringGrid4.Cells[2,ind]:='Разделитель'; inputString.Add(';'); end;

20:begin StringGrid4.Cells[2,ind]:='Сдвиг вправо';inputString.Add('>>'); end;

21:begin StringGrid4.Cells[2,ind]:='Сдвиг влево';inputString.Add('<<');end;

23:begin StringGrid4.Cells[2,ind]:='Вычетание'; inputString.Add('-');end;

22:begin StringGrid4.Cells[2,ind]:='Сложение';inputString.Add('+'); end;

30:begin StringGrid4.Cells[2,ind]:='Бинарная константа';inputString.Add(str); end;

40:begin StringGrid4.Cells[2,ind]:='Начало комментария';inputString.Add(str); end;

41:begin StringGrid4.Cells[2,ind]:='Конец комментария';inputString.Add(str);end;

60:begin StringGrid4.Cells[2,ind]:='Откр. скобка';inputString.Add('(');end;

61:begin StringGrid4.Cells[2,ind]:='Закр. скобка';inputString.Add(')');end;

end;

str:='';

ind:=ind+1;

fl:=0;

end;

end;

end;

Begin // добавление в ХТ

for i:=1 to 510 do

begin

if stringgrid4.Cells[2,i]='Идентификатор' then

memo8.Lines.Append(stringgrid4.Cells[1,i]);

end;

kol:=0;

ukazatel:=1;

j:=0;

dlina:=memo8.Lines.Count;

if dlina<>0 then

begin

for i:=1 to dlina do

begin

StringGrid6.Cells[0,i]:=IntToStr(i);

end;

for i:=0 to dlina-1 do

begin

stroka:=memo8.Lines[i];

hash:=Hesh(stroka);

if StringGrid5.cells[1,hash]='' then

begin

StringGrid5.cells[1,hash]:=IntToStr(ukazatel);

StringGrid6.cells[1,ukazatel]:=IntToStr(hash);

StringGrid6.cells[2,ukazatel]:=stroka;

ukazatel:=ukazatel+1;

goto 1;

end;

if StringGrid5.cells[1,hash]<>'' then

begin

useukazat:=StrToInt(StringGrid5.cells[1,hash]);

2: if stroka=StringGrid6.Cells[2,useukazat] then

begin

memo7.Lines[j]:='Удален повторяющийся идентификатор '+stroka;

j:=j+1;

end

else if StringGrid6.cells[3,useukazat]='' then

begin

StringGrid6.cells[3,useukazat]:=IntToStr(ukazatel);

StringGrid6.cells[1,ukazatel]:=IntToStr(hash);

StringGrid6.cells[2,ukazatel]:=stroka;

ukazatel:=ukazatel+1;

inc(kol);

goto 1;

end;

if StringGrid6.cells[3,useukazat]<>'' then

begin

useukazat:=StrToInt(StringGrid6.cells[3,useukazat]);

goto 2;

end;

end;

1: end;

end;

Edit5.Text:=IntToStr(kol);

end;//Добавление в ХТ

end;

procedure TForm1.Button10Click(Sender: TObject);

var i:integer;

begin

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

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

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

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

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

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

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

memo5.Text:='';

memo6.Text:='';

memo7.Text:='';

memo8.Text:='';

end;

procedure TForm1.Button11Click(Sender: TObject);

label Myend,zap,tree;

var SymbStack:TStringList;{входная строка и стэк соответственно}

i,j,verh,k,vetv,n,m:integer;

gamma,MyinS,syms,tek,cep:String;

mycase:char;

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

begin

for i:=0 to inputString.Count-1 do MyinS:=MyinS+InputString[i];

{Edit2.Text:=MyinS;}

if inputString.Count=0 then

begin

ShowMessage('Таблица лексем или исходный файл не загружены');

exit

end;

inputString.Add('!');

{Объявляем стэк}

SymbStack:=TStringList.Create;

SymbStack.Sorted:=False;

SymbStack.Add('!');

{SymbStack.Add(inputString[0]);

Соседние файлы в папке ПЗ Берта