Скачиваний:
27
Добавлен:
02.05.2014
Размер:
42 Кб
Скачать
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ExtCtrls, ComCtrls;

type
TAutoState=(AUTO_H,AUTO_PP,AUTO_PP1,AUTO_PP2,AUTO_PP3,AUTO_BB,AUTO_BB1,AUTO_I,
AUTO_BB2,AUTO_BB3,AUTO_BB4,AUTO_EE,AUTO_EE1,AUTO_EE2,AUTO_G,AUTO_UM,AUTO_RZ,
AUTO_SL,AUTO_VI,AUTO_M,AUTO_B,AUTO_P,AUTO_OO,AUTO_ZZ,AUTO_A,AUTO_A1,AUTO_A2,
AUTO_O,AUTO_O1,AUTO_N,AUTO_N1,AUTO_N2,AUTO_II,AUTO_I1,AUTO_T,AUTO_T1,AUTO_T2,
AUTO_T3,AUTO_E1,AUTO_E2,AUTO_E3,AUTO_FF,AUTO_FF1,AUTO_FF2,AUTO_T10,AUTO_D,
AUTO_D1,AUTO_D2,AUTO_D3,AUTO_D4,AUTO_D5,AUTO_Q,AUTO_Q1,AUTO_TK,AUTO_TZ,AUTO_K,
AUTO_E,AUTO_G1,AUTO_EE3,AUTO_EE4);

  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet2: TTabSheet;
    Label11: TLabel;
    Label14: TLabel;
    Label8: TLabel;
    Label26: TLabel;
    Button4: TButton;
    Memo1: TMemo;
    Button5: TButton;
    Panel1: TPanel;
    Label27: TLabel;
    Button6: TButton;
    Edit1: TEdit;
    GroupBox4: TGroupBox;
    Label28: TLabel;
    Label29: TLabel;
    Label30: TLabel;
    Label19: TLabel;
    Label21: TLabel;
    Label23: TLabel;
    GroupBox6: TGroupBox;
    Label34: TLabel;
    Label35: TLabel;
    Label36: TLabel;
    Label20: TLabel;
    Label22: TLabel;
    Label24: TLabel;
    GroupBox7: TGroupBox;
    Label40: TLabel;
    Label41: TLabel;
    StringGrid1: TStringGrid;
    GroupBox8: TGroupBox;
    Label42: TLabel;
    Label43: TLabel;
    Label44: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    TabSheet1: TTabSheet;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    Label5: TLabel;
    Label2: TLabel;
    Memo2: TMemo;
    StringGrid4: TStringGrid;
    Memo3: TMemo;
    Button9: TButton;
    Button3: TButton;
    TabSheet3: TTabSheet;
    StringGrid6: TStringGrid;
    Label7: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label3: TLabel;
    Memo4: TMemo;
    StringGrid5: TStringGrid;
    TabSheet4: TTabSheet;
    Button7: TButton;
    Button8: TButton;
    Label4: TLabel;
    Memo5: TMemo;
    Label6: TLabel;
    Memo6: TMemo;
    TreeView1: TTreeView;
    Memo7: TMemo;
    Label9: TLabel;
    Label12: TLabel;
    Label16: TLabel;
    Label13: TLabel;
    Label15: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
{Описание матрицы предшествования}
     PredMatrix:array [1..29,1..29] of char= (
       {prog end. ;  if then else ef beg end for to down do   a   c  :=  or  and not  <   >   =   (   )   -   +   *   /   !}
{prog}  (' ','=','<','<',' ',' ',' ','<',' ','<',' ',' ',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{end.}  (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','>'),
{;}     (' ','>','>','<',' ',' ',' ','<','>','<',' ',' ',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{if}    (' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ','<','<','<','<','<','<','<',' ','<','<','<','<',' '),
{then}  (' ',' ',' ','<',' ','=','=','<',' ','<',' ',' ',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{else}  (' ',' ',' ','<',' ',' ','=','<',' ','<',' ',' ',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{endif} (' ','>','>',' ',' ','>','>',' ','>','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{begin} (' ',' ','<','<',' ',' ',' ','<','=','<',' ',' ',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{end}   (' ','>','>',' ',' ','>','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{for}   (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=','=',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{to}    (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=','<','<',' ',' ',' ',' ',' ',' ',' ','<',' ','<','<','<','<',' '),
{downto}(' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=','<','<',' ',' ',' ',' ',' ',' ',' ','<',' ','<','<','<','<',' '),
{do}    (' ','>','>','<',' ','>','>','<','>','<',' ',' ',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{a}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' ',' ','=','>','>','>','>','>','>',' ','>','>','>','>','>',' '),
{c}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' ',' ',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{:=}    (' ','>','>',' ',' ','>','>',' ','>',' ','>','>',' ','<','<',' ',' ',' ',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{or}    (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','<',' ',' ','>','<','<','<','<','<','<','>','<','<','<','<',' '),
{and}   (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','<',' ',' ','>','<','<','<','<','<','<','>','<','<','<','<',' '),
{not}   (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','<',' ',' ','>','<','<','<','<','<','<','>','<','<','<','<',' '),
{<}     (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ','>','<',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{>}     (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ','>','<',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{=}     (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ','>','<',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{(}     (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<',' ','<','<','<','<','<','<','<','=','<','<','<','<',' '),
{)}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' ',' ',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{-}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>','<','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{+}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>','<','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{*}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>','<','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{/}     (' ','>','>',' ','>','>','>',' ','>','>','>','>','>','<','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{!}     ('<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '));

 {Описание правил грамматики}
          grammar:array [1..29] of string=
          ('progEend.','E','E;E','E;','ifBthenEelseEendif','ifBthenEendif','beginEend','forEtoEdoE','forEdowntoEdoE','E','a:=E',
          'BorB','B','BandB','B','notB','B','E<E','E>E','E=E','(B)','E-E','E+E','E*E','E/E','E','(E)','a','c');
          term:array [1..29] of string=
          ('prog','end.',';','if','then','else','endif','begin','end','for','to','downto','do','a','c',':=','or','and','not','<','>','=','(',')','-','+','*','/','!');
          notterm:array [1..29] of char=
          ('E','E','E','E','E','E','E','E','E','E','E','B','B','B','B','B','B','B','B','B','B','E','E','E','E','E','E','E','E');
          CanonO:array [1..29,1..7] of string=
          (('prog','E','end.','','','',''),
          ('E','','','','','',''),
          ('E',';','E','','','',''),
          ('E',';','','','','',''),
          ('if','E','then','E','else','E','endif'),
          ('if','E','then','E','endif','',''),
          ('begin','E','end','','','',''),
          ('for','E','to','E','do','E',''),
          ('for','E','downto','E','do','E',''),
          ('E','','','','','',''),
          ('a',':=','E','','','',''),
          ('E','or','E','','','',''),
          ('E','','','','','',''),
          ('E','and','E','','','',''),
          ('D','','','','','',''),
          ('not','E','','','','',''),
          ('E','','','','','',''),
          ('E','<','E','','','',''),
          ('E','>','E','','','',''),
          ('E','=','E','','','',''),
          ('(','E',')','','','',''),
          ('E','-','E','','','',''),
          ('E','+','E','','','',''),
          ('E','*','E','','','',''),
          ('E','/','E','','','',''),
          ('E','','','','','',''),
          ('(','E',')','','','',''),
          ('a','','','','','',''),
          ('c','','','','','',''));
var
  Form1: TForm1;
  
implementation

function IndMatrix(SymS:String):integer;
var i:integer;
begin
indMatrix:=0;
if term[1]=SymS then IndMatrix:=1;
for i:=1 to 29 do
if term[i]=SymS then IndMatrix:=i;
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 29 do
if grammar[i]=myS then NomRul:=i;
end;

function findnt(myS:String):string;
begin
findnt:='';
findnt:=notterm[nomRul(myS)]
end;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Text:='';
Memo2.Text:='';
Memo3.Text:='';
Memo4.Text:='';
Memo5.Text:='';
Memo6.Text:='';
Form1.StringGrid1.Cells[0,0]:='ХФ';
Form1.StringGrid1.Cells[1,0]:='Идентификатор';
Form1.StringGrid2.Cells[0,0]:='ХФ';
Form1.StringGrid2.Cells[1,0]:='Номер';
Form1.StringGrid3.Cells[0,0]:='Номер';
Form1.StringGrid3.Cells[1,0]:='Идентификатор';
Form1.StringGrid3.Cells[2,0]:='Ссылка';
Form1.StringGrid6.Cells[0,0]:='Номер';
Form1.StringGrid6.Cells[1,0]:='Идентификатор';
Form1.StringGrid6.Cells[2,0]:='Ссылка';
Form1.Label19.Caption:='';
Form1.Label20.Caption:='';
Form1.Label21.Caption:='';
Form1.Label22.Caption:='';
Form1.Label23.Caption:='';
Form1.Label24.Caption:='';
Form1.Label8.Caption:='';
StringGrid4.Cells[0,0]:='№';
StringGrid4.Cells[1,0]:='Лексема';
StringGrid4.Cells[2,0]:='Тип лексемы';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Form1.OpenDialog1.Execute
then Form1.Memo1.Lines.LoadFromFile(Form1.OpenDialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
label L1,L2,L3;
var i,i1,i2,i3,i4,j1,j2,HF,f,p,ukaz,j,adr,adrr:integer;
    str:string;
begin
for i:=1 to 513 do
   begin
   Form1.StringGrid1.Cells[0,i]:='';
   Form1.StringGrid1.Cells[1,i]:='';
   end;
i1:=Form1.Memo1.Lines.Count;
//******************************************* рехэширование
for j1:=1 to 513 do Form1.StringGrid1.Cells[0,j1]:=IntToStr(j1);
i2:=1; i3:=0;
if Form1.Memo1.Lines[0]<>'' then
   for i:=0 to i1-1 do
       begin
       f:=0;
       str:=Form1.Memo1.Lines[i];
       i4:=Length(str);
       if i4=1 then HF:=Ord(str[1])+Ord(str[1])
               else HF:=Ord(str[1])+Ord(str[2]);
       j1:=HF;
L1:    if Form1.StringGrid1.Cells[1,HF]='' then Form1.StringGrid1.Cells[1,HF]:=str
       else begin
            if Form1.StringGrid1.Cells[1,HF]=str then
               begin
               ShowMessage('Повторение идентификатора '+str);
               goto L2;
               end
            else begin
                 if f=0 then i3:=i3+1; //число коллизий
                 f:=1;
                 i2:=i2+1;
                 HF:=(j1+i2) mod 512;
                 goto L1;
                 end;
            end;
       i2:=1;
L2:    end;
Form1.Label8.Caption:=inttostr(i3);
//******************************************* метод цепочек
p:=0;
for j1:=1 to 513 do Form1.StringGrid2.Cells[0,j1]:=IntToStr(j1);
ukaz:=1;
Form1.StringGrid3.RowCount:=ukaz+1;
if Form1.Memo1.Lines[0]<>'' then
   for i:=0 to i1-1 do
       begin
       str:=Form1.Memo1.Lines[i];
       i4:=Length(str);
       if i4=1 then HF:=Ord(str[1])+Ord(str[1])
               else HF:=Ord(str[1])+Ord(str[2]);
       j1:=HF;
       if Form1.StringGrid2.Cells[1,HF]=''
       then begin
            Form1.StringGrid2.Cells[1,HF]:=inttostr(ukaz);
            Form1.StringGrid3.Cells[0,ukaz]:=inttostr(ukaz);
            Form1.StringGrid3.Cells[1,ukaz]:=str;
            Form1.StringGrid3.RowCount:=ukaz+1;
            ukaz:=ukaz+1;
            end
       else begin
            p:=p+1;
            j:=1;
            adr:=strtoint(Form1.StringGrid2.Cells[1,HF]);
L3:         if Form1.StringGrid3.Cells[1,adr]<>str then
            if Form1.StringGrid3.Cells[2,adr]='' then
               begin
               Form1.StringGrid3.Cells[0,ukaz]:=inttostr(ukaz);
               Form1.StringGrid3.Cells[1,ukaz]:=str;
               Form1.StringGrid3.Cells[2,adr]:=inttostr(ukaz);
               Form1.StringGrid3.RowCount:=ukaz+1;
               ukaz:=ukaz+1;
               end
            else begin
                 j:=j+1;
                 adrr:=strtoint(Form1.StringGrid3.Cells[2,adr]);
                 adr:=adrr;
                 goto L3;
                 end;
            end;
        end;
Form1.Label15.Caption:=inttostr(p);
end;

procedure TForm1.Button8Click(Sender: TObject);
label L1,L2;
var str:string;
    adr,adrr,j,i1,a1,b1,b2,f,HF,HFF:integer;
begin
i1:=Memo1.Lines.Count;
//******************************************* рехэширование
begin
f:=0; b2:=0; b1:=1;
if Edit1.Text<>'' then
   begin
   str:=Edit1.Text;
   if Length(str)=1 then HF:=Ord(str[1])+Ord(str[1])
                    else HF:=Ord(str[1])+Ord(str[2]);
   HFF:=HF;
L1:
   if StringGrid1.Cells[1,HF]<>'' then
      begin
      if StringGrid1.Cells[1,HF]=str then
         begin
         b2:=b2+1; //число сравнений
         f:=1;
         end
      else begin
           b2:=b2+1;
           b1:=b1+1;
           HF:=(HFF+b1) mod 512;
           goto L1;
           end;
      end
   end
else begin
     ShowMessage('Введите идентификатор для поиска.');
     f:=2;
     end;
if f=1 then begin
            Label19.Caption:='ЭЛЕМЕНТ НАЙДЕН';
            StringGrid1.Cells[0,HF]:='Найден!';
            end
       else if f<>2 then Label19.Caption:='ЭЛЕМЕНТ НЕ НАЙДЕН';
Label21.Caption:=IntToStr(b2);
Label23.Caption:=FloatToStr(b2/i1);
end;
//******************************************* метод цепочек
begin
a1:=0;
if Edit1.Text<>'' then
   begin
   str:=Edit1.Text;
   if Length(str)=1 then HF:=Ord(str[1])+Ord(str[1])
                    else HF:=Ord(str[1])+Ord(str[2]);
   if StringGrid2.Cells[1,HF]<>'' then
      begin
      j:=1;
      adr:=strtoint(StringGrid2.Cells[1,HF]);
L2:   if StringGrid3.Cells[1,adr]<>str then
         begin
         a1:=a1+1;   //число сравнений
         if StringGrid3.Cells[2,adr]=''
            then Label20.Caption:='ЭЛЕМЕНТ НЕ НАЙДЕН'
            else begin
                 j:=j+1;
                 adrr:=strtoint(StringGrid3.Cells[2,adr]);
                 adr:=adrr;
                 goto L2;
                 end;
         end
      else begin
           a1:=a1+1;
           Label20.Caption:='ЭЛЕМЕНТ НАЙДЕН';
           StringGrid3.Cells[0,adr]:='Найден!';
           end;
      end
   else Label20.Caption:='ЭЛЕМЕНТ НЕ НАЙДЕН';
   end;
Label22.Caption:=IntToStr(a1);
Label24.Caption:=FloatToStr(a1/i1);
end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var q,w,i:integer;
begin
q:=StringGrid1.RowCount;
w:=StringGrid3.RowCount;
for i:=1 to q do StringGrid1.Cells[0,i]:=inttostr(i);
for i:=1 to w do StringGrid3.Cells[0,i]:=inttostr(i);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
if Form1.OpenDialog1.Execute
then begin
     Form1.Memo2.Lines.LoadFromFile(Form1.OpenDialog1.FileName);
     Form1.Memo4.Lines.LoadFromFile(Form1.OpenDialog1.FileName);
     Form1.Memo5.Lines.LoadFromFile(Form1.OpenDialog1.FileName);
     end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var ind,i,j,i1,i2,fl,zn,h,w,ukaz,i4,HF,j1,adr,ddd:integer;
    adrr,nom,dl,yy,m,j2,fl2,n,k,vetv,u,f:integer;
    st,str,stroka:string;
    o1,o2,o3,o4,o5,o6,pr:string;
    sost:TAutoState;

    inputString,SymbStack:TStringList;{входная строка и стэк соответственно}
    NRow,verh:integer;
    gamma,MyinS,syms,tek,cep:String;
    Mycase:char;
    CepofV:array [1..100]of integer;
    p,stek,d:TStringList;
    MyTreeNode:TTreeNode;
    nodeTree: TTreeNode;
label L3,M1,M2, Myend,zap,tree;
    
begin
Memo3.Text:='';
//Memo4.Text:='';
Form1.StringGrid4.RowCount:=1001;
for j:=1 to 1000 do Form1.StringGrid4.Cells[0,j]:='';
for j:=1 to 1000 do Form1.StringGrid4.Cells[1,j]:='';
for j:=1 to 1000 do Form1.StringGrid4.Cells[2,j]:='';
for i:=1 to 513 do
   begin
   Form1.StringGrid6.Cells[0,i]:='';
   Form1.StringGrid6.Cells[1,i]:='';
   Form1.StringGrid6.Cells[2,i]:='';
   Form1.StringGrid5.Cells[0,i]:='';
   Form1.StringGrid5.Cells[1,i]:='';
   end;
u:=1;
p:=TStringList.Create;
p.Sorted:=False;
stek:=TStringList.Create;
stek.Sorted:=False;
d:=TStringList.Create;
d.Sorted:=False;
i1:=Memo2.Lines.Count;
ind:=1;w:=0;i:=0;
while(i<>i1)do
  begin
  str:='';
  sost:=AUTO_H;
  stroka:=Memo2.Lines[i];
  stroka:=stroka+' #';
  fl:=0; zn:=0; j:=1;
  while(stroka[j]<>'#')do
  begin
  st:=stroka[j];
  case sost of
  AUTO_H:
  case stroka[j] of
  'P','p':begin sost:=AUTO_PP;str:=str+st; end;
  'B','b':begin sost:=AUTO_BB;str:=str+st; end;
  'E','e':begin sost:=AUTO_EE;str:=str+st; end;
  'F','f':begin sost:=AUTO_FF;str:=str+st; end;
  'A','a':begin sost:=AUTO_A;str:=str+st; end;
  'O','o':begin sost:=AUTO_O;str:=str+st; end;
  'N','n':begin sost:=AUTO_N;str:=str+st; end;
  'D','d':begin sost:=AUTO_D;str:=str+st; end;
  'I','i':begin sost:=AUTO_II;str:=str+st; end;
  'T','t':begin sost:=AUTO_T;str:=str+st; end;
  '0','1':begin sost:=AUTO_G;str:=str+st; end;
  ';': begin sost:=AUTO_TZ;str:=str+st; end;
  '.': begin sost:=AUTO_TK;str:=str+st; end;
  '{': begin sost:=AUTO_K;str:=str+st; end;
  '+': begin sost:=AUTO_SL;str:=str+st; end;
  '-': begin sost:=AUTO_VI;str:=str+st; end;
  ':': begin sost:=AUTO_Q;str:=str+st; end;
  '=': begin sost:=AUTO_P;str:=str+st; end;
  '<': begin sost:=AUTO_B;str:=str+st; end;
  '>': begin sost:=AUTO_M;str:=str+st; end;
  '(': begin sost:=AUTO_OO;str:=str+st; end;
  ')': begin sost:=AUTO_ZZ;str:=str+st; end;
  '*': begin sost:=AUTO_UM;str:=str+st; end;
  '/': begin sost:=AUTO_RZ;str:=str+st; end;
  ' ': begin sost:=AUTO_H;str:=''; end;
  'C','c','G','g','H','h','J'..'M','j'..'m','Q'..'S',
  'q'..'s','U'..'Z','u'..'z': begin sost:=AUTO_I;str:=str+st; end;
  else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_PP:
    case stroka[j] of
    'R','r':begin sost:=AUTO_PP1;str:=str+st; end;
    'A'..'Q','S'..'Z','a'..'q','s'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/':begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_PP1:
    case stroka[j] of
    'O','o':begin sost:=AUTO_PP2;str:=str+st; end;
    'A'..'N','P'..'Z','a'..'n','p'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/':begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_PP2:
    case stroka[j] of
    'G','g':begin sost:=AUTO_PP3;str:=str+st; end;
    'A'..'F','H'..'Z','a'..'f','h'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_PP3:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ': begin sost:=AUTO_H;fl:=1;zn:=1;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_BB:
    case stroka[j] of
    'E','e':begin sost:=AUTO_BB1;str:=str+st; end;
    'A'..'D','a'..'d','F'..'Z','f'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_BB1:
    case stroka[j] of
    'G','g':begin sost:=AUTO_BB2;str:=str+st; end;
    'A'..'F','H'..'Z','a'..'f','h'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_BB2:
    case stroka[j] of
    'I','i':begin sost:=AUTO_BB3;str:=str+st; end;
    'A'..'H','J'..'Z','a'..'h','j'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_BB3:
    case stroka[j] of
    'N','n':begin sost:=AUTO_BB4;str:=str+st; end;
    'A'..'M','O'..'Z','a'..'m','o'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_BB4:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ': begin sost:=AUTO_H;fl:=1;zn:=2;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_EE:
    case stroka[j] of
    'N','n':begin sost:=AUTO_EE1;str:=str+st; end;
    'L','l':begin sost:=AUTO_E1;str:=str+st; end;
    'A'..'K','O'..'Z','a'..'k','o'..'z','M','m','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_EE1:
    case stroka[j] of
    'D','d':begin sost:=AUTO_EE2;str:=str+st; end;
    'A'..'C','E'..'Z','a'..'c','e'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_EE2:
    case stroka[j] of
    'I','i':begin sost:=AUTO_EE3;str:=str+st; end;
    'A'..'H','J'..'Z','a'..'h','j'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ',';': begin sost:=AUTO_H;fl:=1;zn:=3;j:=j-1; end;
    '.': begin sost:=AUTO_H;fl:=1;zn:=16;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_EE3:
    case stroka[j] of
    'F','f':begin sost:=AUTO_EE4;str:=str+st; end;
    'A'..'E','G'..'Z','a'..'e','g'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_EE4:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ',';': begin sost:=AUTO_H;fl:=1;zn:=13;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_D:
    case stroka[j] of
    'O','o':begin sost:=AUTO_D1;str:=str+st;end;
    'A'..'N','a'..'n','P'..'Z','p'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_D1:
    case stroka[j] of
    'W','w':begin sost:=AUTO_D2;str:=str+st;end;
    'A'..'V','a'..'v','X'..'Z','x'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ': begin sost:=AUTO_H;fl:=1;zn:=9;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_D2:
    case stroka[j] of
    'N','n':begin sost:=AUTO_D3;str:=str+st;end;
    'A'..'M','a'..'m','O'..'Z','o'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_D3:
    case stroka[j] of
    'T','t':begin sost:=AUTO_D4;str:=str+st;end;
    'A'..'S','a'..'s','U'..'Z','u'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_D4:
    case stroka[j] of
    'A'..'N','P'..'Z','a'..'n','p'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    'O','o':begin sost:=AUTO_D5;str:=str+st;end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_D5:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=9;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_G:
    case stroka[j] of
    '0','1':begin
            w:=w+1;
            if(w<9)then begin sost:=AUTO_G;str:=str+st;end
            else begin sost:=AUTO_E;str:=str+st; end;
            end;
    'B','b':begin sost:=AUTO_G1;str:=str+st;w:=0; end;
    else begin sost:=AUTO_E;str:=str+st;w:=0; end;
  end;
  AUTO_G1:
    case stroka[j] of
    ' ','+','-',';',')','>','<','=','*','/':begin sost:=AUTO_H;fl:=1;zn:=15;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_A:
    case stroka[j] of
    'N','n':begin sost:=AUTO_A1;str:=str+st; end;
    'A'..'M','O'..'Z','a'..'m','o'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_A1:
    case stroka[j] of
    'D','d':begin sost:=AUTO_A2;str:=str+st; end;
    'A'..'C','E'..'Z','a'..'c','e'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_A2:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=14;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_O:
    case stroka[j] of
    'R','r':begin sost:=AUTO_O1;str:=str+st; end;
    'A'..'Q','S'..'Z','a'..'q','s'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_O1:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=14;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_N:
    case stroka[j] of
    'O','o':begin sost:=AUTO_N1;str:=str+st; end;
    'A'..'N','P'..'Z','a'..'n','p'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_N1:
    case stroka[j] of
    'T','t':begin sost:=AUTO_N2;str:=str+st; end;
    'A'..'S','U'..'Z','a'..'s','u'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_N2:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=14;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_II:
    case stroka[j] of
    'F','f':begin sost:=AUTO_I1;str:=str+st; end;
    'A'..'E','G'..'Z','a'..'e','g'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_I1:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=13;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_T:
    case stroka[j] of
    'H','h':begin sost:=AUTO_T1;str:=str+st; end;
    'O','o':begin sost:=AUTO_T10;str:=str+st; end;
    'A'..'G','I'..'N','P'..'Z','a'..'g','i'..'n','p'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_T10:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=9;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_T1:
    case stroka[j] of
    'E','e':begin sost:=AUTO_T2;str:=str+st; end;
    'A'..'D','F'..'Z','a'..'d','f'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_T2:
    case stroka[j] of
    'N','n':begin sost:=AUTO_T3;str:=str+st; end;
    'A'..'M','O'..'Z','a'..'m','o'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_T3:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ': begin sost:=AUTO_H;fl:=1;zn:=13;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_E1:
    case stroka[j] of
    'S','s':begin sost:=AUTO_E2;str:=str+st; end;
    'A'..'R','T'..'Z','a'..'r','t'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_E2:
    case stroka[j] of
    'E','e':begin sost:=AUTO_E3;str:=str+st; end;
    'A'..'D','F'..'Z','a'..'d','f'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',':',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_E3:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ', '(': begin sost:=AUTO_H;fl:=1;zn:=13;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_FF:
    case stroka[j] of
    'O','o':begin sost:=AUTO_FF1;str:=str+st; end;
    'A'..'N','P'..'Z','a'..'n','p'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',')',':','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_FF1:
    case stroka[j] of
    'R','r':begin sost:=AUTO_FF2;str:=str+st; end;
    'A'..'Q','S'..'Z','a'..'q','s'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','+','-',';',')',':','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_FF2:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9':begin sost:=AUTO_I;str:=str+st; end;
    ' ','(': begin sost:=AUTO_H;fl:=1;zn:=9;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_TZ:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1': begin sost:=AUTO_H;fl:=1;zn:=4;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_TK:
    case stroka[j] of
    ' ': begin sost:=AUTO_H;fl:=1;zn:=6;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_K:
    case stroka[j] of
    '}': begin sost:=AUTO_H;j:=j-1;end;
    else begin
         sost:=AUTO_K;
         str:=str+st;
         end;
  end;
  AUTO_SL:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=8;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_VI:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=8;j:=j-1; 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
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=7;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_P:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=12;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_B:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=12;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_M:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=12;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_OO:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=10;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_ZZ:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1',')',';','<','>','=','+','-','*','/': begin sost:=AUTO_H;fl:=1;zn:=11;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_UM:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=8;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_RZ:
    case stroka[j] of
    ' ','A'..'Z','a'..'z','0','1','(': begin sost:=AUTO_H;fl:=1;zn:=8;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_I:
    case stroka[j] of
    'A'..'Z','a'..'z','0'..'9': begin sost:=AUTO_I;str:=str+st; end;
    ' ',':','+','-',';',')','>','<','=','*','/': begin sost:=AUTO_H;fl:=1;zn:=5;j:=j-1; end;
    else begin sost:=AUTO_E;str:=str+st; end;
  end;
  AUTO_E: begin
          if(stroka[j-1]='}')then begin sost:=AUTO_H;str:='';j:=j-1;end
          else if(stroka[j]=' ')or(stroka[j]='+')or(stroka[j]='-')or(stroka[j]='*')
                 or(stroka[j]='/')or(stroka[j]='>')or(stroka[j]='<')or(stroka[j]='=')
                 or(stroka[j]=':')or(stroka[j]=';')or(stroka[j]='(')or(stroka[j]=')')
          then
                 begin
                 sost:=AUTO_H;
                 Memo3.Lines.Append(str);
                 str:='';
                 j:=j-1;
                 end
               else begin
                    sost:=AUTO_E;
                    str:=str+st;
                    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]:='Ключевое слово (начало программы)';end;
      2: begin StringGrid4.Cells[2,ind]:='Ключевое слово (начало составного оператора)';end;
      3: begin StringGrid4.Cells[2,ind]:='Ключевое слово (конец составного оператора)';end;
      4: begin StringGrid4.Cells[2,ind]:='Разделитель';end;
      5: begin StringGrid4.Cells[2,ind]:='Идентификатор';end;
      6: begin StringGrid4.Cells[2,ind]:='';
               StringGrid4.Cells[1,ind]:='';
               StringGrid4.Cells[0,ind]:='';
         end;
      7: begin StringGrid4.Cells[2,ind]:='Оператор присваивания';end;
      8: begin StringGrid4.Cells[2,ind]:='Арифметическая операция';end;
      9: begin StringGrid4.Cells[2,ind]:='Ключевое слово (оператор цикла)';end;
      10: begin StringGrid4.Cells[2,ind]:='Круглая скобка открывающаяся';end;
      11: begin StringGrid4.Cells[2,ind]:='Круглая скобка закрывающаяся';end;
      12: begin StringGrid4.Cells[2,ind]:='Оператор сравнения';end;
      13: begin StringGrid4.Cells[2,ind]:='Ключевое слово (условный оператор)';end;
      14: begin StringGrid4.Cells[2,ind]:='Ключевое слово (логический оператор)';end;
      15: begin StringGrid4.Cells[2,ind]:='Число в двоичной форме';end;
      16: begin StringGrid4.Cells[2,ind]:='Ключевое слово (конец программы)';
                StringGrid4.Cells[1,ind]:='end.';
          end;
   end;
str:='';
ind:=ind+1;
fl:=0;
end;
j:=j+1;
end;
i:=i+1;
end;
j:=0;
for i:=999 downto 1 do
    begin
    if StringGrid4.Cells[1,i]=''
    then begin
         StringGrid4.RowCount:=StringGrid4.RowCount-1;
         j:=j+1;
         end;
    end;
//*************************************************Заполнение ТИ
i1:= StringGrid4.RowCount;
for j1:=1 to 513 do Form1.StringGrid5.Cells[0,j1]:=IntToStr(j1);
ukaz:=1;
Form1.StringGrid6.RowCount:=ukaz+1;
   for i:=0 to i1-1 do
       begin
       if StringGrid4.Cells[2,i]='Идентификатор' then
       begin
       str:=StringGrid4.Cells[1,i];
       i4:=Length(str);
       if i4=1 then HF:=Ord(str[1])+Ord(str[1])
               else HF:=Ord(str[1])+Ord(str[2]);
       j1:=HF;
       if Form1.StringGrid5.Cells[1,HF]=''
       then begin
            Form1.StringGrid5.Cells[1,HF]:=inttostr(ukaz);
            Form1.StringGrid6.Cells[0,ukaz]:=inttostr(ukaz);
            Form1.StringGrid6.Cells[1,ukaz]:=str;
            Form1.StringGrid6.RowCount:=ukaz+1;
            ukaz:=ukaz+1;
            end
       else begin
            j:=1;
            adr:=strtoint(Form1.StringGrid5.Cells[1,HF]);
L3:         if Form1.StringGrid6.Cells[1,adr]<>str then
            if Form1.StringGrid6.Cells[2,adr]='' then
               begin
               Form1.StringGrid6.Cells[0,ukaz]:=inttostr(ukaz);
               Form1.StringGrid6.Cells[1,ukaz]:=str;
               Form1.StringGrid6.Cells[2,adr]:=inttostr(ukaz);
               Form1.StringGrid6.RowCount:=ukaz+1;
               ukaz:=ukaz+1;
               end
            else begin
                 j:=j+1;
                 adrr:=strtoint(Form1.StringGrid6.Cells[2,adr]);
                 adr:=adrr;
                 goto L3;
                 end;
            end;
        end;
        end;
//******************************************************************** дерево
{формируем входную строку}
inputString:=TStringList.Create;
inputString.Sorted:=False;
Nrow:=1;
with StringGrid4 do
begin
while cells[0,NRow]<>'' do
      begin
      if (cells[2,NRow]='Число в двоичной форме')then inputString.Add('c')
      else if(cells[2,NRow]='Идентификатор') then inputString.Add('a')
      else inputString.Add(cells[1,Nrow]);
      NRow:=Nrow+1
      end;
end;
for i:=0 to inputString.Count-1 do MyinS:=MyinS+' '+InputString[i];
memo7.text:=MyinS;
if inputString.Count=0 then
                       begin
                       ShowMessage('Файл не загружен.');
                       exit
                       end;
inputString.Add('!');
{Объявляем стэк}
SymbStack:=TStringList.Create;
SymbStack.Sorted:=False;
SymbStack.Add('!');
i:=0;
k:=0;
cep:='';
while i<=inputString.Count-1 do
   begin
   verh:=SymbStack.Count-1;
   syms:=SymbStack[verh];
   while (not(inArray(SymbStack[verh],term,29))) do verh:=verh-1;
   if (SymbStack[verh]='!') and (inputString[i]='!') then goto MyEnd;
   Mycase:=PredMatrix[IndMatrix(SymbStack[verh]),IndMatrix(inputString[i])];
//ShowMessage(SymbStack[verh]+'  '+InputString[i]+'  '+InttoStr(IndMatrix(SymbStack[verh]))+'   '+InttoStr(IndMatrix(inputString[i]))+'  '+MyCase);
   if ((mycase='<')or(mycase='='))then
      begin {сдвиг}
      SymbStack.Add(inputString[i]);
      i:=i+1;
      end
   else if (mycase='>')
        then begin {свертка}
             gamma:='';
             tek:='';
             for j:=SymbStack.Count-1 downto 0 do
             if not(inArray(SymbStack[j],term,29)) then
               begin
               gamma:=SymbStack[j]+gamma;
               SymbStack.Delete(j)
               end
             else if (inArray(SymbStack[j],term,29))and(tek='') then
                    begin
                    tek:=SymbStack[j];
                    gamma:=SymbStack[j]+gamma;
                    SymbStack.Delete(j)
                    end
                  else if predMatrix[Indmatrix(SymbStack[j]),IndMatrix(tek)]='=' then
                         begin
                         tek:=SymbStack[j];
                         gamma:=SymbStack[j]+gamma;
                         SymbStack.Delete(j)
                         end
                       else break;
             if findnt(gamma)<>'' then
               begin
               SymbStack.Add(findnt(gamma));
               k:=k+1;
               CepofV[k]:=NomRul(gamma);
//         ShowMessage('Цепочка '+gamma+' заменяется на '+findnt(gamma)+' по правилу '+inttostr(Nomrul(gamma)));
               cep:=inttostr(CepofV[k])+' '+cep;
               end
             else begin {ошибка}
                  ShowMessage('Недопустимая цепочка: '+gamma);
                  goto tree
                  end;
             end;
if mycase=' ' then
begin {ошибка}
         ShowMessage('Символы '+Symbstack[verh]+' и '+InputString[i]+' не могут следовать друг за другом.');
        goto tree;
end;
end;
Myend:memo6.Text:=cep;
{вывод дерева}
tree:n:=k;
with TreeView1 do
begin
Items.Add(Nil,'E');
vetv:=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]] then
                 if Items[i].HasChildren=False then
                 begin
                 vetv:=i;
                 goto zap
                 end;
zap:             for i:=1 to 7 do
                 if CanonO[CepofV[k],i]<>'' then
                 Items.AddChild(Items[vetv],CanonO[CepofV[k],i])
                  end;
FullExpand
end;
end;

end.
Соседние файлы в папке Курсовая СПО