Перевод с паскаля на с# - C# (212238)

Узнай цену своей работы

Формулировка задачи:

Очень нужна помощь, помогите перевести следующий кусок кода. Не понимаю, я как написать это шарпе. Пожалуйста!!Очень прошу.
PTree = ^TTree;
TTree = record
           Str    : string;
           Len    : integer;
           Rul    : string;
           number : byte;
           next   : array of PTree;
        end;
 
PTRule = ^TRule;
TRule = record
           rule   : String;
           next   : PTRule;
           number : byte;
        end;
 
PRule = record
           Ch  : char;
           Len : integer;
           P   : PTRule;
        end;
 
TAutomat = record
              Cons  : char;
              ind   : integer;
              chain : string;
              stack : array[0..1000] of integer;
              el    : integer;
           end;

Решение задачи: «Перевод с паскаля на с#»

textual
Листинг программы
PTree = ^TTree;
TTree = record
           Str    : string;
           Len    : integer;
           Rul    : string;
           number : byte;
           next   : array of PTree;
        end;
 
PTRule = ^TRule;
TRule = record
           rule   : String;
           next   : PTRule;
           number : byte;
        end;
 
PRule = record
           Ch  : char;
           Len : integer;
           P   : PTRule;
        end;
 
TAutomat = record
              Cons  : char;
              ind   : integer;
              chain : string;
              stack : array[0..1000] of integer;
              el    : integer;
           end;
 
var
  Form1    : TForm1;
  index    : array of PRule;
  head     : PTree;
  Tree     : string;
  find     : boolean;
  GetIn    : integer;
  Chain    : string;
  count    : integer;
  raspoz   : TAutomat;
  RulChain : string;
  Consists : string;
  st1      : string;
 
implementation
 
uses Unit2, Unit3, Unit4;
 
{$R *.dfm}
 
 
//определяет является ли ch терминальным символом
function term(ch : char): boolean;
var
  i : integer;
 
begin
   term:= true;
   for i:= 0 to Length(index)-1 do
     if ch = index[i].Ch then
     begin
        term:= false;
        GetIn:= i;
        break;
     end;
end;
// опрделяет кол-во терминальных символов в строке
function Len(st : string): integer;
var
  i : integer;
  t : integer;
 
begin
   t:= 0;
   for i:= 1 to Length(st) do
      if term(st[i]) then inc(t);
   len:= t;
end;
 
//построение цепочек при Генерации
function Rec(st : string; pp : PTree; CouL : integer; rul : string): PTree;
var
  i    : integer;
  j    : integer;
  S1   : string;
  S2   : string;
  find : boolean;
  p    : PTRule;
 
begin
   rec:= nil;
   i:= Len(st);
   if  i > StrToInt(Form1.Edit4.Text) then Exit;
   if Length(st) - i > StrToInt(Form1.Edit4.Text) then Exit;
   if CouL > round(StrToInt(Form1.Edit4.Text)) then Exit;
   find:= false;
   for i:= 1 to Length(st) do
   begin
      if pp = nil then
      begin
         new(pp);
         pp.Str:= St;
         pp.Rul:= rul;
 
         pp.Len:= 0;
         rec:= pp;
      end;
      if not(term(st[i])) then
      begin
         find:= true;
         S1:= Copy(st, 1, i-1);
         S2:=Copy(st, i+1, Length(st));
         p:= index[GetIn].P;
         pp.Len:= index[GetIn].Len;
         SetLength(pp.next, pp.Len);
         for j:= 0 to index[GetIn].Len-1 do
         begin
            if p.rule = '' then inc(Coul);
            pp.next[j]:= rec(S1+p.rule+S2, pp.next[j], CouL, St[i]+'->'+p.rule);
            p:= p.next;
         end;
         break;
      end;
   end;
   if (not(find)) and (Length(st) >= StrToInt(Form1.Edit3.Text)) then Form1.ListBox1.Items.Add(st);
end;
 
//считывание и объединение правил в единую структуру (список)
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  j : integer;
  p : PTRule;
  q : PTRule;
 
begin
//-------------------------------------------------------------------------
   head:= nil;
   count:= 1;
   p:= nil;
   Form1.ListBox1.Items.Clear;
   if Edit1.Text = '' then
   begin
      ShowMessage('Не указан алфавит терминальных символов!!!');
      Exit;
   end;
   if Edit2.Text = '' then
   begin
      ShowMessage('Не указан алфавит нетерминальных символов!!!');
      Exit;
   end;
   if Edit3.Text = '' then
   begin
      ShowMessage('НЕ указана минимальная длинна ципочки!!!');
      Exit;
   end;
   if Edit4.Text = '' then
   begin
      ShowMessage('НЕ указана максимальная длинна ципочки!!!');
      Exit;
   end;
   if (Memo1.Lines.Count = 0) or (Memo2.Lines.Count = 0) then
   begin
      ShowMessage('Отсутствуют правила вывода!');
      Exit;
   end;
   if Memo1.Lines.Count <> Memo2.Lines.Count then
   begin
      ShowMessage('Ошибка в правилах вывода!');
      Exit;
   end;
   if Edit1.Text = '' then
   begin
      ShowMessage('Отсутствует алфавит терминальных символов!');
      Exit;
   end;
   if Edit2.Text = '' then
   begin
      ShowMessage('Отсутствует алфавит нетерминальных символов!');
      Exit;
   end;
   for i:= 0 to Memo1.Lines.Count-1 do
     if Length(Memo1.Lines.Strings[i]) > 1 then
     begin
        ShowMessage('Ошибка в правилах вывода! В левой части выражения указан неизвестный символ!');
        Exit;
     end;
   for i:= 0 to Memo2.Lines.Count-1 do
     if (Memo2.Lines.Strings[i][1] = '') or (Memo2.Lines.Strings[i][1] = '|') or (Memo2.Lines.Strings[i][1] = #13) then
     begin
        ShowMessage('Ошибка в правилах вывода! Правая часть выражения задана неверно!');
        Exit;
     end;
   SetLength(Index, Length(Edit2.Text));
   for i:= 0 to Length(index)-1 do index[i].P:= nil;
//-------------------------------------------------------------------------
   for i:= 0 to Memo1.Lines.Count-1 do
   begin
      if Memo1.Lines.Strings[i][1] = edtCel.Text then
      begin
          Memo1.Lines.Insert(0, Memo1.Lines.Strings[i][1]);
          Memo1.Lines.Delete(i+1);
          Memo2.Lines.Insert(0, Memo2.Lines.Strings[i]);
          Memo2.Lines.Delete(i+1);
          Break;
      end;
   end;
   btnRulesFill.Enabled := True;
   SetLength(index, Memo1.Lines.Count);
   for i:= 0 to Memo1.Lines.Count-1 do
   begin
      index[i].Ch:= Memo1.Lines.Strings[i][1];
      index[i].Len:= 0;
      new(q);
      q.rule:= '';
      for j:= 1 to Length(Memo2.Lines.Strings[i]) do
      begin
         if Memo2.Lines.Strings[i][j] = '|' then
         begin
            inc(index[i].Len);
            if Index[i].P = nil then
            begin
               q.number:= count;
               inc(count);
               Index[i].P:= q;
               if q.rule = '' then
               begin
                  ShowMessage('Грамматика не должна содержать пустых правил!!!');
                  Exit;
               end;
               if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
               begin
                  ShowMessage('Грамматика не должна содержать цепных правил!!!');
                  Exit;
               end;
               p:= q;
            end else
            begin
               q.number:= count;
               inc(count);
               p.next:= q;
               if q.rule = '' then
               begin
                  ShowMessage('Грамматика не должна содержать пустых правил!!!');
                  Exit;
               end;
               if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
               begin
                  ShowMessage('Грамматика не должна содержать цепных правил!!!');
                  Exit;
               end;
               p:= p.next;
            end;
            new(q);
            q.rule:= '';
            Continue;
         end;
         q.rule:= q.rule + Memo2.Lines.Strings[i][j];
      end;
      inc(index[i].Len);
      if Index[i].P = nil then
      begin
         q.number:= count;
         inc(count);
         Index[i].P:= q;
         if q.rule = '' then
         begin
            ShowMessage('Грамматика не должна содержать пустых правил!!!');
            Exit;
         end;
         if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
         begin
            ShowMessage('Грамматика не должна содержать цепных правил!!!');
            Exit;
         end;
         p:= q;
      end else
      begin
         q.number:= count;
         inc(count);
         p.next:= q;
         if q.rule = '' then
         begin
            ShowMessage('Грамматика не должна содержать пустых правил!!!');
            Exit;
         end;
         if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
         begin
            ShowMessage('Грамматика не должна содержать цепных правил!!!');
            Exit;
         end;
         p:= p.next;
      end;
      p.next:= nil;
   end;
   head:= rec(index[0].Ch, head, 0, index[0].Ch);
   if ListBox1.Items.Count = 0 then ShowMessage('Такие цепочки в такой грамматике сгенерированы быть не могут!!!');
end;
 
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
var
  i : integer;
 
begin
   if (ord(key) >= 65) and (ord(key) <= 90) then
   begin
      if Length(Edit2.Text) > 0 then
      for i:= 0 to Length(Edit2.Text) do
        if key = Edit2.Text[i] then key:= chr(0);
   end
   else
   key:= chr(0);
end;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  i : integer;
 
begin
   if ((ord(key) < 65) or (ord(key) >= 90)) and (key <> '|') then
   begin
      if Length(Edit1.Text) > 0 then
      for i:= 0 to Length(Edit1.Text) do
        if key = Edit1.Text[i] then key:= chr(0);
   end
   else
   key:= chr(0);
end;
 
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
var
  i : integer;
  j : integer;
 
begin
   for i:= 0 to Length(Edit2.Text) do
   begin
      if key = Edit2.Text[i] then
      begin
         for j:= 0 to Memo1.Lines.Count-1 do
           if key = Memo1.Lines.Strings[j][1] then key:= chr(0);
         Exit;
      end;
   end;
   if (key <> #8) and (key <> #13) then key:= chr(0);
end;
 
procedure TForm1.Memo2KeyPress(Sender: TObject; var Key: Char);
var
  i : integer;
 
begin
   for i:= 0 to Length(Edit1.Text) do
     if key = Edit1.Text[i] then exit;
   for i:= 0 to Memo1.Lines.count-1 do
     if key = Memo1.Lines.Strings[i][1] then exit;
   if (key <> #8) and (key <> #13) and (key <> '|') then key:= chr(0);
end;
 
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
   case key of
      '0'..'9': ;
      #8: ;
   else
      key:= chr(0);
   end;
   if key <> #8 then if (StrToInt(Edit3.Text+key) > StrToInt(Edit4.Text)) or
   (StrToInt(Edit3.Text+key) > 1001) then key:= chr(0);
end;
 
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
   case key of
      '0'..'9': ;
      #8: ;
   else
      key:= chr(0);
   end;
   if key <> #8 then if (StrToInt(Edit4.Text+key) < StrToInt(Edit3.Text)) or (StrToInt(Edit4.Text+key) > 1001) then key:= chr(0);
end;
//формирование дерева вывода
procedure rec1(p : PTree; st : string; l : integer);
var
  i : integer;
 
begin
   if st = head.Rul+' ' then st:= '';
   if StrComp(PChar(p.Str), PChar(Chain)) = 0 then
   begin
      Tree:= st+p.Rul;
      find:= true;
      Exit;
   end;
   if Len(p.Str) > Length(Chain) then Exit;
   for i:= 0 to l-1 do
     if not(find) then
       if p.next[i] <> nil then
          rec1(p.next[i], st+p.Rul+' ', p.next[i].Len);
end;
 
function Change(st1 : string; st2 : string; j : integer) : string;
var
  i  : integer;
  st : string;
 
begin
   st:= '';
   for i:= 1 to j do
     st:= st + st1[i];
   Change:= st + st2;
end;
//выводит последовательность использованных правил
function Print(R : TAutomat) : string;
var
   i  : integer;
   st : string;
 
begin
   st:= '';
   for i:= R.el-1 downto 0 do st:= st+ IntToStr(R.stack[i])+',';
   Print:= '['+st+']';
end;
//откат  q->b or b->q
procedure Back(var R : TAutomat);
var
  i : integer;
  p : PTRule;
 
begin
   R.Cons:= 'b';
   dec(R.el);
   if R.el < 0 then Exit;
   if R.stack[R.el] = 0 then
   begin
      R.stack[R.el]:= -1;
      R.stack[R.el+1]:= -1;
      dec(R.ind);
      R.chain:= Change(R.chain, '', Length(R.chain)-1);
      Consists:= Consists+'('+R.Cons+','+IntToStr(R.ind)+','+R.chain+','+Print(R)+')  |-  ';
   end else
   begin
      for i:= 0 to Length(Index) - 1 do
      begin
         p:= Index[i].P;
         while p <> nil do
         begin
            if p.number = R.stack[R.el] then
            begin
               R.chain:= Change(R.chain, p.rule, Length(R.chain)-1);
               Consists:= Consists+'('+R.Cons+','+IntToStr(R.ind)+','+R.chain+','+Print(R)+')  |-  ';
               R.Cons:= 'q';
               Exit;
            end;
            p:= p.next;
         end;
      end;
   end;
end;
// шаг свёртка
procedure Svertka(var R : TAutomat);
var
  i  : integer;
  j  : integer;
  st : string;
  p  : PTRule;
 
begin
   if R.Cons <> 'b' then
   for j:= Length(R.chain) downto 1 do
   begin
      st:= '';
      for i:= j to Length(R.chain) do
         st:= st + R.chain[i];
      for i:= 0 to Length(Index) - 1 do
      begin
         p:= Index[i].P;
         while p <> nil do
         begin
            if p.number > R.stack[R.el] then
             if StrComp(PChar(st), PChar(p.rule)) = 0 then
             begin
                R.chain:= Change(R.chain, Index[i].Ch, j-1);
                R.stack[R.el]:= p.number;
                R.Cons:= 'q';
                inc(R.el);
                Consists:= Consists+'('+R.Cons+','+IntToStr(R.ind)+','+R.chain+','+Print(R)+')  |-  ';
                Exit;
             end;
            p:= p.next;
         end;
      end;
   end;
   R.stack[R.el]:= -1;
   if (R.ind+1 <= Length(Chain)+1) and (R.Cons <> 'b') then
   begin
      inc(R.ind);
      R.chain:= R.chain+Chain[R.ind - 1];
      R.stack[R.el]:= 0;
      inc(R.el);
      Consists:= Consists+'('+R.Cons+','+IntToStr(R.ind)+','+R.chain+','+Print(R)+')  |-  ';
   end else Back(R);
end;
//шаг "сдвиг"
procedure Sdvig(var R : TAutomat);
var
  i : integer;
 
begin
   if R.chain = '' then
   begin
      inc(R.ind);
      R.chain:= R.chain+Chain[R.ind - 1];
      R.stack[R.el]:= 0;
      inc(R.el);
      Consists:= Consists+'('+R.Cons+','+IntToStr(R.ind)+','+ R.chain+','+Print(R)+')  |-  ';
   end;
   repeat
      Svertka(R);
      if (R.Cons = 'q') and (R.ind = Length(Chain)+1) and (R.chain = Index[0].Ch) then
      begin
         for i:= R.el-1 downto 0 do RulChain:= RulChain + IntToStr(R.stack[i]);
         Exit;
      end;
      if R.el = -1 then Exit;
   until false;
end;
//получили цепочку в результате разбора или не получили
function SS : boolean;
var
  i : integer;
 
begin
   RulChain:= '';
   Consists:= '';
   for i:= 0 to 1000 do raspoz.stack[i]:= -1;
   raspoz.Cons:= 'q';
   raspoz.ind:= 1;
   raspoz.chain:= '';
   raspoz.el:= 0;
   SS:= false;
   Sdvig(raspoz);
   Form4.Show;
   ShowMessage(RulChain);
   if RulChain <> '' then SS:= true;
end;
 
procedure TForm1.ListBox1Click(Sender: TObject);
var
  i : integer;
  st : string;
 
begin
   Chain:= ListBox1.Items.Strings[ListBox1.ItemIndex];
   if SS then
   begin
      find:= false;
      Tree:= '';
      rec1(head, '', head.Len);
      if Form1.CheckBox1.Checked then Form2.Show;
      st:= '';
      for i:= 1 to Length(tree) do
        if tree[i] = ' ' then st:= st+#13 else st:= st+ tree[i];
      btnSaveResult.Enabled := True;
      ShowMessage(st);
   end else ShowMessage('Цепочка не принята!');
end;
 
 
//проверка цепочки по "Проверить"
procedure TForm1.Button2Click(Sender: TObject);
var
  i  : integer;
  st : string;
  j  : integer;
  p  : PTRule;
  q  : PTRule;
 
begin
   if Edit5.Text = '' then
   begin
      ShowMessage('Отсутствует цепочка на входе!!!');
      Exit;
   end;
   head:= nil;
   count:= 1;
   p:= nil;
   Form1.ListBox1.Items.Clear;
   if Edit1.Text = '' then
   begin
      ShowMessage('Не указан алфавит терминальных символов!!!');
      Exit;
   end;
   if Edit2.Text = '' then
   begin
      ShowMessage('Не указан алфавит нетерминальных символов!');
      Exit;
   end;
   if Edit3.Text = '' then
   begin
      ShowMessage('НЕ указана минимальная длинна ципочки!');
      Exit;
   end;
   if Edit4.Text = '' then
   begin
      ShowMessage('НЕ указана максимальная длинна ципочки!');
      Exit;
   end;
   if (Memo1.Lines.Count = 0) or (Memo2.Lines.Count = 0) then
   begin
      ShowMessage('Отсутствуют правила вывода!');
      Exit;
   end;
   if Memo1.Lines.Count <> Memo2.Lines.Count then
   begin
      ShowMessage('Ошибка в правилах вывода!');
      Exit;
   end;
   if Edit1.Text = '' then
   begin
      ShowMessage('Отсутствует алфавит терминальных символов!');
      Exit;
   end;
   if Edit2.Text = '' then
   begin
      ShowMessage('Отсутствует алфавит нетерминальных символов!');
      Exit;
   end;
   for i:= 0 to Memo1.Lines.Count-1 do
     if Length(Memo1.Lines.Strings[i]) > 1 then
     begin
        ShowMessage('Ошибка в правилах вывода! В левой части выражения указан неизвестный символ!');
        Exit;
     end;
   for i:= 0 to Memo2.Lines.Count-1 do
     if (Memo2.Lines.Strings[i][1] = '') or (Memo2.Lines.Strings[i][1] = '|') or (Memo2.Lines.Strings[i][1] = #13) then
     begin
        ShowMessage('Ошибка в правилах вывода! Правая часть выражения задана неверно!');
        Exit;
     end;
   SetLength(Index, Length(Edit2.Text));
   for i:= 0 to Length(index)-1 do index[i].P:= nil;
//-------------------------------------------------------------------------
   btnSaveResult.Enabled := True;
   SetLength(index, Memo1.Lines.Count);
   for i:= 0 to Memo1.Lines.Count-1 do
   begin
      index[i].Ch:= Memo1.Lines.Strings[i][1];
      index[i].Len:= 0;
      new(q);
      q.rule:= '';
      for j:= 1 to Length(Memo2.Lines.Strings[i]) do
      begin
         if Memo2.Lines.Strings[i][j] = '|' then
         begin
            inc(index[i].Len);
            if Index[i].P = nil then
            begin
               q.number:= count;
               inc(count);
               Index[i].P:= q;
               if q.rule = '' then
               begin
                  ShowMessage('Грамматика не должна содержать пустых правил!');
                  Exit;
               end;
               if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
               begin
                  ShowMessage('Грамматика не должна содержать цепных правил!');
                  Exit;
               end;
               p:= q;
            end else
            begin
               q.number:= count;
               inc(count);
               p.next:= q;
               if q.rule = '' then
               begin
                  ShowMessage('Грамматика не должна содержать пустых правил!');
                  Exit;
               end;
               if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
               begin
                  ShowMessage('Грамматика не должна содержать цепных правил!');
                  Exit;
               end;
               p:= p.next;
            end;
            new(q);
            q.rule:= '';
            Continue;
         end;
         q.rule:= q.rule + Memo2.Lines.Strings[i][j];
      end;
      inc(index[i].Len);
      if Index[i].P = nil then
      begin
         q.number:= count;
         inc(count);
         Index[i].P:= q;
         if q.rule = '' then
         begin
            ShowMessage('Грамматика не должна содержать пустых правил!');
            Exit;
         end;
         if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
         begin
            ShowMessage('Грамматика не должна содержать цепных правил!');
            Exit;
         end;
         p:= q;
      end else
      begin
         q.number:= count;
         inc(count);
         p.next:= q;
         if q.rule = '' then
         begin
            ShowMessage('Грамматика не должна содержать пустых правил!');
            Exit;
         end;
         if (Length(q.rule) = 1) and (not(term(q.rule[1]))) then
         begin
            ShowMessage('Грамматика не должна содержать цепных правил!');
            Exit;
         end;
         p:= p.next;
      end;
      p.next:= nil;
   end;
       head:= rec(index[0].Ch, head, 0, index[0].Ch);
   Chain:= Edit5.Text;
   if SS then
   begin
      find:= false;
      Tree:= '';
      rec1(head, '', head.Len);
      if Form1.CheckBox1.Checked then Form2.Show;
      st:= '';
      for i:= 1 to Length(tree) do
        if tree[i] = ' ' then st:= st+#13 else st:= st+ tree[i];
      st1 := st;
      ShowMessage(st);
   end else ShowMessage('Цепочка не принята!');
end;
 
procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
   if key <> #8 then if not(term(key)) then key:= chr(0);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
   Form3.Show;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
   Edit1.Text:= '';
   Edit2.Text:= '';
   Memo1.Clear;
   Memo2.Clear;
end;
 
procedure TForm1.btnOpenClick(Sender: TObject);
var
  f: TextFile;
  fName: String[80];
  buf: string[80];
begin
   if OpenDialog1.Execute then
        fName := OpenDialog1.FileName;
   AssignFile(f, fName);
   Reset(f);
   readln(f, buf);
   Edit1.Text := buf;
   readln(f, buf);
   Edit2.Text := buf;
   readln(f, buf);
   edtCel.Text := buf;
   Memo1.Clear;
   Memo2.Clear;
   readln(f, buf);
   while buf <> '[rules2]' do begin
     Memo1.Lines.Add(buf);
     readln(f, buf);
   end;
 
   while not EOF(f) do begin
     readln(f, buf);
     Memo2.Lines.Add(buf);
   end;
   CloseFile(f);
end;
 
procedure TForm1.btnSaveClick(Sender: TObject);
var
  f: TextFile;
  fName: String[80];
  i: Integer;
begin
   if SaveDialog1.Execute then
       fName := SaveDialog1.FileName;
   AssignFile(f, fName);
   Rewrite(f);
   writeln(f, Edit1.Text);
   writeln(f, Edit2.Text);
   writeln(f, edtCel.Text);
   for i:= 0 to Memo1.Lines.Count do
   begin
     if Memo1.Lines[i] <> '' then
      writeln(f, Memo1.Lines[i]);
   end;
   writeln(f, '[rules2]');
   for i:= 0 to Memo2.Lines.Count do
   begin
     if Memo1.Lines[i] <> '' then
      writeln(f, Memo2.Lines[i]);
   end;
   CloseFile(f);
end;
 
procedure TForm1.EditCelKeyPress(Sender: TObject; var Key: Char);
var
  i : integer;
  buf : Char;
begin
   if (ord(key) >= 65) and (ord(key) <= 90) then
   begin
      buf := Key;
      if Length(Edit2.Text) > 0 then
      for i:= 0 to Length(Edit2.Text) do
      begin
        if buf = Edit2.Text[i] then
        begin
          Key:= buf;
          break;
        end
        else
          Key := chr(0);
      end
   end
   else
   key:= chr(0);
end;
 
procedure TForm1.btnSaveResultClick(Sender: TObject);
var
  i: Integer;
  f: TextFile;
  fName: String[80];
begin
  if dlgSaveRes.Execute then
       fName := dlgSaveRes.FileName;
  AssignFile(f, fName);
  Rewrite(f);
  Writeln(f, 'Терминальные символы:');
  Writeln(f, Edit1.Text);
  Writeln(f, 'Нетерминальные символы:');
  Writeln(f, Edit2.Text);
  Writeln(f, 'Проверяемая цепочка:');
  Writeln(f, Edit5.Text);
  Writeln(f, 'Правила:');
  for i:=0 to MemoRules.Lines.count do
  begin
    writeln(f, MemoRules.Lines[i]);
  end;
  Writeln(f, 'Результат:');
  write(f, Consists);
  writeln(f, st1);
  CloseFile(f);
end;
 
procedure TForm1.btnRulesFillClick(Sender: TObject);
var
  i  : integer;
  st : string;
  j  : integer;
  count : Integer;
  p  : PTRule;
  q  : PTRule;
begin
count := 1;
st := IntToStr(count) + ': ';
st := st + Memo1.Lines[0][1] + '->';
for i:= 0 to Memo2.Lines.Count-1 do
   begin
       for j:=1 to Length(Memo2.Lines[i]) do
       begin
         if  Memo2.Lines[i][j] = '|' then
         begin
           count := count + 1;
           MemoRules.Lines.Add(st);
           st := IntToStr(count) + ': ';
           st := st + Memo1.Lines[i][1] + '->';
         end
         else
         begin
           st := st + Memo2.Lines[i][j];
         end;
 
       end;
       count := count + 1;
       MemoRules.Lines.Add(st);
       st := IntToStr(count) + ': ';
       st := st + Memo1.Lines[i][1] + '->';
   end;
end;
 
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5