Пример #1
0
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;
}
Пример #2
0
/* 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;
}