void Interpretador::leArquivo(){
   string leitura;
   arquivo = new ArquivoFonte(this->url);
   Comando * comando;
   while(!arquivo->eof()){
	  if (mantem){
		  leitura = palavraAtual;
		  mantem = false;
	  }else{
		  leitura = arquivo->proximaPalavra();
	  }
      if (leitura == "read"){
         comando = comandoread();
         this->vect->push_back (comando);
	  }else if (leitura == "write"){
	     comando = comandowrite();
	     this->vect->push_back (comando);
	  }else if (leitura == "writeln"){
		  comando = new ComandoWriteln();
		  this->vect->push_back (comando);
	  }else if (leitura == "endp"){
		  comando = new ComandoEndp();
		  this->vect->push_back (comando);
	  }else if (leitura == "while"){
		  comando = comandowhile();
		  this->vect->push_back (comando);
      }else if(variavel(leitura)){
		  comando = comandoatrib(leitura);
		  this->vect->push_back (comando);
      }
   }
}
Comando* Interpretador::comandowrite(){
   Comando * comando;
   string leitura;
   arquivo->saltaPalavra();
   leitura = arquivo->proximaPalavra();
   if(leitura == "'"){
      leitura = "";
      string aux = arquivo->proximaPalavra();
      while(aux != "'"){
         leitura = leitura + aux;
         aux = arquivo->proximaPalavra();
      }
      comando = new ComandoWrite(leitura);
      arquivo->saltaPalavra();
   }else{
      if(arquivo->proximaPalavra()=="["){
		 string indice = arquivo->proximaPalavra();
         if (variavel(indice)){
			 comando = new ComandoWriteIndexVar(escopo, leitura, indice);
		 }else{
			int index = atoi(indice.c_str());
	        comando = new ComandoWriteIndex(escopo, leitura, index);
		 }
         arquivo->saltaPalavra();
         arquivo->saltaPalavra();
      }else{
         comando = new ComandoWriteVar(escopo, leitura);
      }	   
   }
   return comando;
}
void Interpretador::fator() {
  int teste = atoi (palavraAtual.c_str());
  if (variavel(palavraAtual)) {
     pilha->push(new ExpVariavel(escopo, palavraAtual));
     palavraAtual = arquivo->proximaPalavra();
  }   
  else if (teste != 0 || (teste == 0 && palavraAtual == "0")) {
     pilha->push(new ExpLiteral(teste));
     palavraAtual = arquivo->proximaPalavra();
  }   
  else if (palavraAtual == "("){
     palavraAtual = arquivo->proximaPalavra();
     expressao();
     if (palavraAtual == ")")
        palavraAtual = arquivo->proximaPalavra();
  }   
}
Comando* Interpretador::comandowhile(){
   ComandoWhile * comandow;
   Comando * comando;
   string leitura;
   arquivo->saltaPalavra();
   string var1 = arquivo->proximaPalavra();
   string op = arquivo-> proximaPalavra();
   string var2 = arquivo->proximaPalavra();
   if (var2 == "="){
      op = op + var2;
      var2 = arquivo -> proximaPalavra();
   }
   comandow = new ComandoWhile(escopo, var1, var2, op);
   arquivo->saltaPalavra();
   leitura = arquivo->proximaPalavra();
   while (leitura != "endw" && !arquivo->eof()){
      if (leitura == "read"){
         comando = comandoread();
         comandow->adicionaComando(comando);
	  }else if (leitura == "write"){
	     comando = comandowrite();
	     comandow->adicionaComando(comando);
	  }else if (leitura == "writeln"){
		 comando = new ComandoWriteln();
		 comandow->adicionaComando(comando);
	  }else if (leitura == "endp"){
		 comando = new ComandoEndp();
		 comandow->adicionaComando(comando);
	  }else if (leitura == "while"){
		 comando = comandowhile();
		 comandow->adicionaComando(comando);
      }else if(variavel(leitura)){
	     comando = comandoatrib(leitura);
	     comandow->adicionaComando(comando);
      }
      if (mantem){
		 leitura = palavraAtual;
		 mantem = false;
	  }else {
         leitura = arquivo->proximaPalavra();
      }
   }
   return comandow;
}
int fator(void)
{
  int tipo1 = 0;
  int tipo2 = 0;
  	
  if(tk.cat == CTI){
    tk = analex();
    return INT;
  }
  	   
  else if(tk.cat == CTR){
    tk = analex();
    return FLOAT;
  }
  else if(tk.cat == ID){
     tipo1 = variavel();
             
     tipo2 = chamada_de_funcao2();
     if(tipo1 != tipo2){
        return tipo1;         
     }else return tipo2;  
       
  } 
  else if((tk.cat == SN) && (tk.cod == OPP)){
       tk = analex();
       
       tipo1 = expressao_simples();
      
       if((tk.cat == SN) && (tk.cod == CLP)){                 
           tk = analex();
           return tipo1;            
       } else erro(lin, 3);
                           
  }  

}
void Interpretador::conferePalavraAtual(){
	if ((palavraAtual == "read") || (palavraAtual == "write") || (palavraAtual == "writeln") ||
	(palavraAtual == "while") || (palavraAtual == "endw") || (palavraAtual == "endw") || variavel(palavraAtual)) mantem = true;
}