SetLength(PZ,High (PZ)+3);
PZ[High (PZ)-1] := -7;
PZ[High(PZ)] := Adress;
Adress := 0;
end;
break;
end;
'(': ErrorList.Add(1 Лишняя открытая скобка1);
else ргосЗ;
end;
until lend;

if (ErrorList.Count = 0) then Result:=true else Result:=false; if (SItem.mode = All) then exit else begin Assign := true; SItem.mode := None; end end; Divider:begin

if((OldMode = Divider)and ((SItem.Ident[1]'=')and (SItem.Ident[1]1(1)and (SItem.Ident[1] ')'))and ((OldS ' ( ')and (OldS ')')and (OldS '='))) then begin

ErrorList.Add(1 Позиция '+IntToStr(SItem.Posl) + ': два подряд символа операции');
break;
end;
repeat lend:=true;

case SItem.Ident[1] of '=': if Assign and (OldMode = Ident) then begin // Запоминание адреса пересылки и // удаление его из польской записи Adress := PZ[High(PZ)]; SetLength(PZ,High(PZ)); SItem.mode := None; end

else ErrorList.Add(1 Позиция 1 +

IntToStr(SItem.Posl) + ': символ "=" здесь недопустим'); '(': if(OldMode = Ident) or (OldMode = Number)

then ErrorList.Add(1 Ошибочная скобка в позиции 1 + IntToStr(SItem.Posl))

else procl; ' +' ,1M1: begin

if((OldMode = None) or (OldS = '(') // Унарная операция then if (SItem.Ident[1] = ' + ') // Игнорируется then break // Унарный '-' - условный символ 'M' else SItem.Ident[1] := 'M'; case TrStack[High(TrStack)] of ' 0' , • ( ' : procl; '+','-','M': proc2; '*','/', ,/ч': ргосЗ; end; end; 1 * 1 , 1 / 1 :

if OldS = '('

then ErrorList.Add(

'Ошибочная операция в позиции 1 + IntToStr(SItem.Posl))

else

case TrStack[High(TrStack)] of

'0',1(',,'-','M': procl;
' *','/' : proc2;
1Л1: ргосЗ;
end;

if OldS = 1('

then ErrorList.Add(

'Ошибочная операция в позиции ' +

IntToStr(SItem.Posl))

else

case TrStack[High(TrStack)] of

,0,,'(','+','-','*',,/,,,M': procl;
'A': proc2;
end;

') ' :

case TrStack[High(TrStack)] of '0': ErrorList.Add('Лишняя закрытая скобка'); ' ( ' : begin

proc4;
if (Ord(TrStack[High(TrStack)]) >
127) then ргосб;
end;
' + \ , , 'M' : ргосЗ;
end;

end; until lend; Assign:=false; end; Func: begin repeat

lend:=true;
proc5 until lend;
Assign:=false;
end;

None: ErrorList.Add(1 Непонятный символ в позиции ' +

IntToStr(SItem.Posl));
end;
OldMode := SItem.mode;
OldS := SItem.Ident[1];
Syntltem(S);
until false;
if(ErrorList.Count = 0) then Result := true else Result := false;
end;

Листинг снабжен подробными комментариями. Помимо функции CreatePZ в нем приведена процедура ClearPZ. Это вспомогательная процедура (утилита), очищающая польскую запись от занесенных в нее данных при предыдущем вызове CreatePZ. Одновременно очищается список сообщений об ошибках ErrorList, список числовых констант Const List, список переменных и предопределенных именованных констант DataList. В последнем списке остаются только именованные константы, не зависящие от заданного выражения.

В функции CreatePZ определен ряд переменных и процедур. Отметим для начала процедуру code, назначение которой - формирование условного числа, соответствующего той или иной операции. Как видно из текста, условные коды операций следующие:


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

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



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

  • Март
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс