void comando_repetitivo(void) { //Verifica se o proximo token й um WHILE if((tk.cat == PR) && (tk.p_reservada == WHILE)){ tk = analex(); //Verifica se o proximo token й '(' if((tk.cat == SN) && (tk.cod == OPP)){ tk = analex(); expressao(); //Verifica se o proximo token й um ')' if((tk.cat == SN) && (tk.cod == CLP)){ tk = analex(); //Verifica se o proximo token й '{' if((tk.cat == SN) && (tk.cod == OPB)){ tk = analex(); comando(); //Verifica se o proximo token й '}' if((tk.cat == SN) && (tk.cod == CLB)){ tk = analex(); comando(); } else erro(lin, 5);//Chama erro caso nгo venha '}' } else erro(lin, 4); //chama erro caso nгo venha '{' } else erro(lin, 3); //Chama erro caso nгo venha ')' } else erro(lin, 2);//Chama erro caso nгo venha '(' } }
Expressao* Interpretador::trataExpressao() { palavraAtual= arquivo->proximaPalavra(); if (pilha != NULL) delete pilha; pilha = new stack<Expressao*>(); expressao(); Expressao * raizArvoreExpressao = pilha->top(); pilha->pop(); return raizArvoreExpressao; }
void relacao(void) { if(tk.cat == SN){ if(tk.cod == GT){ tk = analex(); expressao(); } else if(tk.cod == GE){ tk = analex(); expressao(); } else if(tk.cod == LT){ tk = analex(); expressao(); } else if(tk.cod == LE){ tk = analex(); expressao(); } else if(tk.cod == EQ){ tk = analex(); expressao(); } else if(tk.cod == NE){ tk = analex(); expressao(); } } }
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(); } }
void comando_condicional(void) { //Verifica se o proximo token й um IF if((tk.cat == PR) && (tk.p_reservada == IF)){ tk = analex(); //Verifica se o proximo token й um '(' if((tk.cat == SN) && (tk.cod == OPP)){ tk = analex(); expressao(); //verifica se o proximo token й um ')' if((tk.cat == SN) && (tk.cod == CLP)){ tk = analex(); //Verifica se o proximo token й um '{' if((tk.cat == SN) && (tk.cod == OPB)){ tk = analex(); comando(); //Verifica se o proximo token й um '}' if((tk.cat == SN) && (tk.cod == CLB)){ tk = analex(); comando(); } else erro( lin, 5); //chama erro caso nгo venha '}' } else erro(lin, 4); // chama err caso nгo venha '{' } else erro(lin, 3); // chama erro caso nгo venha ')' } else erro(lin, 2); // chama o erro caso nгo venha um '(' } //Verifica se o proximo token й um ELSE else if((tk.cat == PR) && (tk.p_reservada == ELSE)){ tk = analex(); //Verifica se o proximo token й um '{' if((tk.cat == SN) && (tk.cod == OPB)){ tk = analex(); comando(); //Verifica se o proximo token й um '}' if((tk.cat == SN) && (tk.cod == CLB)){ tk = analex(); comando(); } else erro(lin, 5); //chama erro caso nгo venha '}' } else erro(lin, 4); //chama erro caso nгo venha '{' } }
void atribuicao(void) { int tipo1, tipo2; char id[50]; tipo1 = tipo2 = 0; if(tk.cat == ID){ strcpy(id, tk.lexema); strcpy(aux.id, tk.lexema); tk = analex(); //Verifica se o proximo token й um '=' if((tk.cat == SN) && (tk.cod == ATB)){ tipo1 = verifica_tabela(id); tk = analex(); tipo2 = expressao(); if(tipo1 != tipo2){ erro(lin, 12); } //Verifica se o proximo token й um ';' if((tk.cat == SN) && (tk.cod == SMC)){ tk = analex(); comando(); } else erro(lin, 8); //Chama mensagem de erro caso nгo venha um ';' } else{ aux.sit = PEN; } } }
void lista_de_expressoes(void) { expressao(); }