int Anasin::Expresion(){ Lexema nextLexema = this->_symTab->lookAheadLexema(); Lexema nextnextLexema = this->_symTab->lookAheadLexema(1); if(nextLexema._tipo == "Id"){ if(nextnextLexema._tipo == "Agrupation" && nextnextLexema._valor == "["){ // 20) Expresion -> Aarr Operador if(!Aarr()) return 0; if(!Operador()) return 0; }else{ // 18) Expresion -> id Operador if(!ParseToken(Lexema("Id",""),false)) return 0; if(!Operador()) return 0; } }else if(nextLexema._tipo == "Number"){ // 19) Expresion -> number Operador if(!ParseToken(Lexema("Number",""),false)) return 0; if(!Operador()) return 0; }else{ std::cout << "Error sintáctico, se esperaba : Id, number y se obtuvo: " << nextLexema._tipo << " ("<< nextLexema._valor <<")["<< this->_symTab->getOffset() <<"]" << std::endl; return 0; } return 1; }
/* Retorna o polinômio referente à expressão dada; este polinômio devolvido é * sempre uma nova cópia, mesmo que a expressão seja uma variável simples. */ Polinomio CalcExpr(char* expr) { Pilha polPilha; ElemPilha *r; Polinomio p; int i; CriaPilha(&polPilha); i = 0; while (expr[i] != '\0') { if (Operando(expr + i)) { EmpilhaOperando(&polPilha, RecuperaPolinomio(expr[i]), false); } else if (Operador(expr + i)) { ExecutaOperacao(&polPilha, expr[i]); } else { IMPRIME_ERRO(MSG_ERRO_CARACTERE_INVALIDO); } i++; } r = VerificaDesempilha(&polPilha); if (!PilhaVazia(&polPilha)) { IMPRIME_ERRO(MSG_ERRO_FALTA_OPERADOR); } if (r->temp) { p = r->poli; } else { p = CopiaPolinomio(r->poli); } FREE(r); return p; }