Задача 8 урок 21 Вычисление арифметического выражение со скобками

Задача 8 урок 21

Напишите функцию, которая получает на вход произвольную строку вида: 5*(3+4)-7*9+3*(2+(2-7))(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения) и в качестве ответа возвращает результат этого выражения. Рекомендация: сначала убедитесь, что число открывающих скобок, равно числу закрывающих.

program recursion_string;
var i:integer; s:string;

//  функция  подсчета результата
function plus_minus(sign:string;numb,r:integer):integer;
begin
    if(sign='+') then
        r+=numb
    else
        r-=numb;
    plus_minus:= r;
end;

// основная функция для обхода и проверки строкового выражения
function string_expression():integer;
var acc_multi,res,Code,number:integer;
    acc,sign,sign_multi:string;
begin
  acc:='';
  acc_multi:=0;
  sign:='+';
  res:=0;
  sign_multi:='';
  number:=0;

  while i <= (length(s)) do
  begin
      if(s[i] >= '0') and (s[i] <= '9') then
          acc+=s[i];
      if(s[i]='(') then
      begin
          i+=1;
         // подсчет результата в скобках
          number:=string_expression();
      end;
//если проверяемая строка заканчивается на закрывающую скобку ")" необходима
// дополнительная проверка чтобы избежать выхода индекса за границы массива
      if(length(s) >= i) and (s[i]=')') then
      begin
          // если number не результат возврата результата в скобках
          if(number=0)  then
             val(acc,number,Code);
          // если уже был знак умножения
          if(sign_multi='*') then
          begin
              number*=acc_multi;
          end;
          i+=1;
          // возврат результата в скобках
          string_expression:= plus_minus(sign,number,res);
          exit;
      end
      else
      begin
// чтобы не выйти на границы индекса массива если строка завершается
// закрывающейся скобкой ")" и провести заключительный подсчет результата в скобках
//  необходимо уменьшить индекс итерации
        if(length(s) < i) then
            i-=1;
          if(i=length(s)) or (s[i]='*') or (s[i]='-') or (s[i]='+') then
          begin
              // если number не результат возврата результата в скобках
              if(number=0)  then
                 val(acc,number,Code);
              //  если уже был знак умножения
              if(sign_multi='*') then
              begin
                  number*=acc_multi;
                  sign_multi:='';
              end;
               // если сейчас знак умножения
              if(s[i]='*') then
              begin
                  sign_multi:='*';
                  acc_multi:=number;
              end
              else
              begin
                 // считаем результат
                  res:=plus_minus(sign,number,res);
                  //writeln(res);
                  sign:=s[i]; // знак для следующего вычисления
              end;
          acc:='';
          number:=0;
          end;
        end;
    i+=1;
    end;
  // возвращаем результат строкового выражения
  string_expression:= res;
end;

// основная программа
begin
s:='-(-2+(2-7)-(-90*2-80))';
i:=1;
writeln(string_expression());
end.