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; }