parentesis.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  Control de par\'entesis en una expresi\'on algebraica
  usando TAD-PILA de caracteres por punteros. Por
  ``parentizaci\'on'' en una expresi\'on algebraica
  consideramos los simbolos: par\'entisis, corchetes y
  llaves.

  La cadena leida (caracter a caracter) puede contener otros
  simbolos. Pero, para el control, prestamos atenci\'on 
  s\'olo a los caracteres de parentizaci\'on, de los cuales:
 
  a) si el simbolo leido es ``abierto'', entonces se lo 
     almacena a la espera de encontrar un ``cerrado'';

  b) si el simbolo leido es ``cerrado'', entonces se 
     determina si el ULTIMO simbolo ``abierto'' almacenado 
     es del mismo tipo. Si lo son, entonces ambos parentizan 
     correctamente, no hace falta considerarlos ulteriormente, 
     y se prosigue evaluando el resto de la cadena. Si no lo 
     son, entonces, la cadena estar\'a mal parentizada.

  En consecuencia, el TAD a usar sera tal que ``el \'ultimo en 
  entrar, es el primero en salir'', o sea, una PILA.
  keywords: pila

  FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ Nota: Este ejercicio, alternativamente, se podria hacer
  sin el uso de una pila, pero es un preliminar al programa
  de evaluacion de expresiones algebraicas. }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: parentisis.pas 2002/04/09 10:30 jdelia Exp jdelia   $}

program parentesis ;

uses
  u_pilapc ;

type
  pila = pilapc ;

const
  sale = '#' ;
  pizq = '(' ; pder = ')' ;
  cizq = '[' ; cder = ']' ;
  lizq = '{' ; lder = '}' ;

var
  p            : pila ;
  ch1, ch2     : tipo_elemento ;
  abre, cierra : set of char ; 
  balancea     : boolean ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CONTROL (ch1, ch2: tipo_elemento): boolean ;
var
  bal_par, bal_cor, bal_lla, bal_gen : boolean ;
begin
  bal_par := ( ch2 = pizq ) and ( ch1 = pder ) ; {parentesis}
  bal_cor := ( ch2 = cizq ) and ( ch1 = cder ) ; {corchetes}
  bal_lla := ( ch2 = lizq ) and ( ch1 = lder ) ; {llaves}
  CONTROL := bal_par or bal_cor or bal_lla ;
  writeln (' caracter_2 caracter_1 = ', ch2, ch1);
  writeln (' balance actual        = ', CONTROL); 
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
begin {parentesis}
  abre     := [ pizq, cizq, lizq ] ;
  cierra   := [ pder, cder, lder ] ; 
  writeln ;
  write   (' ingrese de un caracter por registro');
  writeln (' (# para salir):');  
  read  (ch1);

  P.ANULA ;
  balancea := true ;   
  while ( ch1 <> sale ) and (balancea) do begin
    if      (ch1 in abre   ) then
      P.METE (ch1)
    else if (ch1 in cierra ) then begin
      if (P.VACIA) then
	balancea := false
      else begin
        ch2 := P.TOPE;
	balancea := CONTROL (ch1, ch2) ;
	P.SACA ;
      end ; {if}
    end ; {if}
    read  (ch1);
  end ; {while} 
  writeln ;
  if not (P.VACIA) or not (balancea) then
    writeln (' la expresion esta mal parentizada ')
  else begin
    writeln (' la expresion esta bien parentizada ')
  end ; {if}
  writeln ;
end . {parentesis}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.