SetLength(ConstList,0);
SetLength(DataList, MConst);

SetLength(PZ,0); ends-function CreatePZ(S:string):boolean; // Формирование польской записи var

{Флаг завершения операций при конце формирования записи выражения:} lend: boolean; I: integers-Assign: boolean; // Допустимость операции = Adress: integer; // Адрес пересылки результата OldMode: TType; // Характер предыдущей лексемы OldS: char; // Первый символ предыдущей лексемы

procedure code;

// Запись в стек кода арифметической операции begin

SetLength(PZ,High(PZ)+2);

case TrStack[High(TrStack)] of

'+': PZ[High(PZ)] := -1;
'-': PZ[High(PZ)] := -2;
1 *': PZ[High (PZ)] := -3;
'/1: PZ[High(PZ)] := -4;
'л' : PZ[High (PZ)] := -5;
fMf : PZ[High (PZ) ] := -6;
end;
end;

procedure procl; begin

SetLength(TrStack,High(TrStack)+2);
TrStack[High(TrStack)] := SItem.Ident[1];
end;
procedure proc2;
begin code;

TrStack[High(TrStack)] := SItem.Idertt[1]; ends-procedure ргосЗ; begin

code;
SetLength(TrStack,High(TrStack));
lend:=false;
end;

procedure proc4; begin

SetLength(TrStack,High(TrStack));
end;
procedure proc5;

// Аналог procl для функций

begin

SetLength(TrStack,High(TrStack)+2);
TrStack[High(TrStack)] := Chr(127+Round(SItem.Number));
end;
procedure ргосб;

// Аналог ргосЗ для функций

begin

SetLength(PZ,High (PZ)+2);
PZ[High(PZ)] := -Ord(TrStack[High(TrStack)])+27;
SetLength(TrStack,High(TrStack));
end;
begin ClearPZ;
SetLength(TrStack,1);
TrStack[0] := '0';
OldMode := None;
OldS := ' ';
Assign := true;
Adress := 0;

// Чтение первой лексемы Syntltem(S,true); if (SItem.mode = All) then begin

ErrorList.Add(1 He введено никакого текста'); Result := false; exit; end; repeat

if ((OldMode = Func)and(SItem.Ident[1] '(')) then ErrorList.Add(

'Пропущена скобка после функции в позиции ' + IntToStr(Sltem.Posl)); case SItem.mode of Number: begin

if((OldMode Divider)and(OldMode None)and (OldMode Part)) then ErrorList.Add('В позиции ' +

IntToStr (Sltem.Posl) +

' должен быть разделитель');

if (SItem.Error) then ErrorList.Add(

'Ошибка в позициях 1+IntToStr(SItem.Posl) + ' - ' + IntToStr(SItem.Pos2)) else begin SetLength(ConstList,High(ConstList)+2); ConstList [High ('ConstList) ] := SI tem. Number ; SetLength(PZ,High(PZ)+2); PZ[High(PZ)] := High(ConstList); end; Assign:=false; end; Ident: begin

if((OldMode Divider)and(OldMode None)and (OldMode Part))

then ErrorList.Add(1 В позиции 1 +

IntToStr(Sltem.Posl) + 1 должен быть разделитель 1); for i:=0 to High(DataList) do

begin

if (Uppercase(SItem.Ident) = DataList[i].Name) then begin SetLength(PZ,High(PZ)+2);
PZ[High(PZ)] := NConst + i;
break;
end;

if(i = High(DataList)) then begin

SetLength(DataList,High(DataList)+2); DataList[High(DataList)].Name :=

Uppercase(SItem.Ident);
DataList[High(DataList)].Data:=0;
SetLength(PZ, High(PZ)+2);
PZ[High(PZ)] := NConst+High(DataList);
епф end;
end;
All,Part:begin repeat lend:=true;

case TrStack[High(TrStack)] of 101: begin

if (Adress 0) then begin

// Занесение в польскую запись операции = // и адреса засылки результата


⇐ Предыдущая страница| |Следующая страница ⇒

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Сентябрь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс