/* Essa classe verifica se uma seqüência de (, ), [, ], { e }, terminada 
   por '.' está bem formada.      */

import java.io.*;


class BemFormada
{
  public static void main( String [] entrada ) throws IOException 
  {
    Pilha P = new Pilha();
    boolean bemformada = true;
    
    System.out.println("Digite a seqüência terminada por ponto");
    char c = Leitura.leChar();
    
    while( c != '.'){            // lê a seqüência até encontrar o '.' final
      
      switch(c){
        case '(' : case '[' : case '{' :  // "abres" são empilhados sem pensar
         try 
	  {
	    P.Empilha(c);
	  }
	 catch( PilhaOverflow e )
	  {
	    System.out.println("Pilha estourou");
	  }
	 break;
	
        case ')' :               // ')' deve "casar" com '(', senão erro
         try 
	  {
	    if( P.TopoPilha() != '(' ){
              bemformada = false;
	    }
	    else P.Desempilha();
	  }
	 catch( PilhaUnderflow e ) // se a pilha está vazia, a seqüência não
	                           // é bem formada
	  {
            bemformada = false;
	  }
	 break;
	case ']' :                 // idem idem 
         try 
	  {
	    if( P.TopoPilha() != '[' ){
              bemformada = false;
	    }
	    else P.Desempilha();
	  }
	 catch( PilhaUnderflow e )
	  {
            bemformada = false;
	  }
	 break;
	case '}' :                   // idem idem idem
         try 
	  {
	    if( P.TopoPilha() != '{'){
              bemformada = false;
	    }
	    else P.Desempilha();
	  }
	 catch( PilhaUnderflow e )
	  {
            bemformada = false;
	  }
	 break;
      }
 
      c = Leitura.leChar();           // lê próximo caractere da seqüência   
    }
    if (P.PilhaVazia() && bemformada) // para ser bem formada, além de tudo 
                                      // estar ok, a Pilha deve estar vazia!
      System.out.println("Sequencia bem formada");   
    else 
      System.out.println("Sequencia nao e' bem formada");    
  }
}
