unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label3: TLabel;
    Label5: TLabel;
    Edit3: TEdit;
    Edit1: TEdit;
    ListBox1: TListBox;
    StringGrid1: TStringGrid;
    Edit2: TEdit;
    Label8: TLabel;
    Label4: TLabel;
    Label6: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    Label7: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label9: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Init(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
 Form1: TForm1;
 R: Array [1..20,0..20,1..20] of String;
 Stack, VN, VT, VZ: String;

implementation

{$R *.dfm}

procedure TForm1.Init(Sender: TObject); //начальная инициализация программы
var I: Integer;
begin
 with StringGrid1 do begin
  for I:=0 to RowCount-1 do Rows[I].Clear;
  Cells[0,0]:='S'; Cells[1,0]:='0'; Cells[2,0]:=Edit2.Text;  Cells[3,0]:='S'; Cells[4,0]:='0'+Edit2.Text;
  Cells[0,1]:='S'; Cells[1,1]:='1'; Cells[2,1]:='0'; Cells[3,1]:='A'; Cells[4,1]:='^';
  Cells[0,2]:='S'; Cells[1,2]:='#'; Cells[2,2]:=Edit2.Text;  Cells[3,2]:='S'; Cells[4,2]:='^';
  Cells[0,3]:='S'; Cells[1,3]:='0'; Cells[2,3]:='0'; Cells[3,3]:='S'; Cells[4,3]:='00';
  Cells[0,4]:='A'; Cells[1,4]:='1'; Cells[2,4]:='0'; Cells[3,4]:='A'; Cells[4,4]:='^';
  Cells[0,5]:='A'; Cells[1,5]:='#'; Cells[2,5]:=Edit2.Text;  Cells[3,5]:='S'; Cells[4,5]:='^';
 end;
end;

procedure TForm1.Button1Click(Sender: TObject); //Нажата кнопка "Проверить цепочку"
var I, J, K, L, M, N: Integer; S: String;
begin
 for I:=1 to 20 do
  for J:=0 to 20 do
   for K:=1 to 20 do R[I,J,K]:='';
 VN:=Edit4.Text;
 if VN='' then begin
  MessageDlg('Не заданы состояния автомата',mtError,[mbok],0);
  exit;
 end;
 VT:=Edit6.Text;
 if VT='' then begin
  MessageDlg('Не задан алфавит автомата',mtError,[mbok],0);
  exit;
 end;
 VZ:=Edit5.Text;
 if VZ='' then begin
  MessageDlg('Не задан алфавит магазина',mtError,[mbok],0);
  exit;
 end;
 for N:=0 to StringGrid1.RowCount-1 do with StringGrid1 do
  if ((Cells[0,N]<>'') And (Cells[1,N]<>'') And (Cells[2,N]<>'') And
   (Cells[3,N]<>'') And (Cells[4,N]<>'')) then begin
   I:=Pos(Cells[0,N],VN);
   if I=0 then begin
    MessageDlg('Состояние автомата не задано <'+Cells[0,N]+'>',mtError,[mbok],0);
    exit;
   end;
   if (Cells[1,N]='#') then J:=0
   else begin
    J:=Pos(Cells[1,N],VT);
    if J=0 then begin
     MessageDlg('Символ алфавита автомата не задан <'+Cells[1,N]+'>',mtError,[mbok],0);
     exit;
    end;
   end;
   K:=Pos(Cells[2,N],VZ);
   if K=0 then begin
    MessageDlg('Символ магазина не задан <'+Cells[2,N]+'>',mtError,[mbok],0);
    exit;
   end;
   M:=Pos(Cells[3,N],VN);
   if M=0 then begin
    MessageDlg('Состояние автомата не задано <'+Cells[3,N]+'>',mtError,[mbok],0);
    exit;
   end;
   for L:=1 to Length(Cells[4,N]) do
    if ((Pos(Cells[4,N][L],VZ)=0) And (Cells[4,N][L]<>'^')) then begin
     MessageDlg('Символ магазина МПА не задан <'+Cells[4,N][L]+'>',mtError,[mbok],0);
     exit;
    end;
   R[I,J,K]:=VN[M]+Cells[4,N];
  end;
 if ((Length(Edit1.Text)<>1) Or (Pos(Edit1.Text,VN)=0)) then begin
  MessageDlg('Ошибка в задании начального состояния автомата',mtError,[mbok],0);
  exit;
 end;
 if ((Length(Edit2.Text)<>1) Or (Pos(Edit2.Text,VZ)=0)) then begin
  MessageDlg('Ошибка в задании начального состояния магазина',mtError,[mbok],0);
  exit;
 end;
 ListBox1.Items.Clear;
 S:=InputBox('Ввод данных','Введите читаемую цепочку символов','');
 I:=Pos(Edit1.Text,VN);
 Stack:=Edit2.Text;
 while (Stack<>'') do begin
  if S='' then begin
   J:=0;
   ListBox1.Items.Add('('+VN[I]+',#,'+Stack+')');
  end
  else begin
   ListBox1.Items.Add('('+VN[I]+','+S+','+Stack+')');
   J:=Pos(S[1],VT);
   if J=0 then begin
    MessageDlg('В цепочке присутствует посторонний символ',mtError,[mbok],0);
    exit;
   end;
  end;
  K:=Pos(Stack[1],VZ);
  if (R[I,J,K]='') then begin
   if S='' then S:='#';
   MessageDlg('Нет перехода из состояния <'+VN[I]+'> для символа <'+S[1]+'> и символа магазина <'+Stack[1]+'>',mtError,[mbok],0);
   exit;
  end;
  Delete(Stack,1,1);
  if (R[I,J,K][2]<>'^') then Stack:=Copy(R[I,J,K],2,Length(R[I,J,K])-1)+Stack;
  I:=Pos(R[I,J,K][1],VN);
  if S<>'' then Delete(S,1,1);
 end;
 if S='' then ListBox1.Items.Add('('+VN[I]+',#,'+Stack+')')
         else ListBox1.Items.Add('('+VN[I]+','+S+','+Stack+')');
 if S<>'' then
  MessageDlg('Входная цепочка не прочитана полностью',mtError,[mbok],0)
 else
  if Pos(VN[I],Edit3.Text)=0 then
   MessageDlg('После прочтения цепочки автомат не пришёл в конечное состояние',mtError,[mbok],0)
  else
   MessageDlg('Цепочка успешно прочитана автоматом',mtInformation,[mbok],0)
end;

end.
