program Vyraz;
{
 Program vyhodnoti zadany jednoduchy aritmeticky vyraz pomoci rozdel a
 panuj (rekurzi).
 
 Predpokladame, ze vyraz neni delsi nez 255 znaku a vejde se tudiz do typu
 string. Vyraz se sklada z:
 	* celocislnych konstant
	* binarnich operatoru +,-,*,/
	* kulatych zavorek
	
 Znak / predstavuje celociselne deleni.

 Dodrzuje klasicke priority vyhodnocovani, operatory se stejnou prioritou
 vyhodnocuje zleva doprava.
}


function Symbol(var S: string): integer;
  {Ve vyrazu S urci index vyskytu symbolu naposledy
  provadeneho operatoru, pritom z S odstrani vnejsi
  nadbytecne zavorky. Neni-li v S uz zadny symbol,
  vraci nulu}

var 
  Plus, Krat: integer;     {poloha posledniho operatoru}
  Zavorky: integer;        {bilance zavorek}
  i : integer;

begin
  Plus := 0;
  Krat := 0;
  Zavorky := 0;
  for i:=1 to length(S) do
    case S[i] of
      '(': Zavorky := Zavorky + 1;
      ')': Zavorky := Zavorky - 1;
      '+', '-': if Zavorky = 0 then Plus := i;
      '*', '/': if Zavorky = 0 then Krat := i;
    end;
  if Plus > 0 then
    Symbol := Plus
  else if Krat > 0 then
    Symbol := Krat
  else if S[1] <> '(' then
    Symbol := 0
  else
    begin
      S := Copy(S, 2, length(S)-2); {odstranit vnejsi zavorky}
      Symbol := Symbol(S)
    end
end;

function Hodnota(var S: string): integer;
  {Urci hodnotu vyrazu ulozeneho v S}

var 
  Z: integer;          {poloha znamenka}
  S1, S2: string;      {levy a pravy usek od znamenka}
  H: integer;          {vysledna hodnota}
  C: integer;          {pomocne pro proceduru Val}

begin
  Z := Symbol(S);
  if Z = 0 then
    Val(S, H, C)
  else
    begin
      S1 := Copy(S, 1, Z-1);
      S2 := Copy(S, Z+1, length(S)-Z);
      case S[Z] of
        '+': H := Hodnota(S1) + Hodnota(S2);
        '-': H := Hodnota(S1) - Hodnota(S2);
        '*': H := Hodnota(S1) * Hodnota(S2);
        '/': H := Hodnota(S1) div Hodnota(S2);
      end;
    end;
  Hodnota := H
end;

var S: string;
begin
  write('Zadejte vyraz pro vyhodnoceni: ');
  readln(S);
  writeln('Hodnota vyrazu: ', Hodnota(S));
end.



