Erro Primario() { /* Processa um fator primário da cadeia de entrada. */ Erro err = resCorreto; char letra; /* Remover os espaços do início */ while (isspace(in[indIn])) indIn++; /* Se for parêntese, iniciar expressão aninhada */ if (in[indIn] == '(') { indIn++; err = Expressao(); if (err.codigoErro != EXPR_VALIDA) return err; if (in[indIn] == ')') indIn++; else return montaErro(FECHA_PARENTESE_ESPERADO, indIn); } else { letra = in[indIn]; /* Verificar se é um operando válido */ if (isalpha(letra)) pos[indPos++] = letra; else return montaErro(CARACTERE_INVALIDO, indIn); indIn++; } return resCorreto; } /* Primario */
Erro InPos(char *infixa, char *posfixa) { /* Transforma uma expressão da notação infixa para a pós-fixa. Em caso de erro, devolve o código e a posição na cadeia de entrada onde o erro foi encontrado. */ Erro err = resCorreto; char c; in = infixa; indIn = 0; pos = posfixa; indPos = 0; /* Remover os espaços do início */ while (isspace(in[indIn])) indIn++; /* Se não há nada na entrada, marcar erro */ if (in[indIn] == '\0') err = montaErro(CADEIA_DE_BRANCOS, 0); /* Senão, computar a expressão */ else err = Expressao(); /* Se a entrada não acabou, marcar erro */ if (in[indIn] != '\0' && err.codigoErro == EXPR_VALIDA) err = montaErro(OPERADOR_ESPERADO, indIn); /* Verificar se o caracter que causou o erro é inválido */ if (err.codigoErro != EXPR_VALIDA) { c = in[indIn]; if (!isalpha(c) && !isspace(c) && c != '+' && c != '-' && c != '*' && c != '/' && c != '(' && c != ')' && c != '^' && c != '\0') err = montaErro(CARACTERE_INVALIDO, indIn); } posfixa[indPos] = '\0'; return err; }
Erro InPos(char *infixa, char *posfixa) { /* Transforma uma expressão da notação infixa para a pós-fixa. Em caso de erro, devolve o código e a posição na cadeia de entrada onde o erro foi encontrado. */ in = &infixa[0]; pos = &posfixa[0]; indPos = indIn = 0; /* Zera a variavel global de erro */ geral.posicao = -1; /* Caso a programa comece com um espaco, pula ate o caractere valido mais proximo */ while(in[indIn] == ' '){ indIn++; } /* Caso pule todos os espacos e termine, a entrada eh branca */ if (in[indIn] == '\0'){ return montaErro(CADEIA_DE_BRANCOS, 0); } Expressao(); /* Termina de montar a string da posfixa */ pos[indPos] = '\0'; /* Se terminou de ler o programa e ainda possui algum caractere na entrada */ if(in[indIn] != '\0'){ geral = montaErro(OPERADOR_ESPERADO, indIn); } /* Caso o programa tenha apresentado algum erro */ if (geral.posicao != -1) { return geral; } return resCorreto; }
/*A funcao primaria possui duas possibilidades : p = x ou p = (e), ou seja, uma expressao entre parenteses ou uma variável */ Erro Primario() { /* Processa um fator primário da cadeia de entrada. */ char corrente = in[indIn]; switch(corrente){ /* Caso seja um parenteses, tera uma expressao dentro dele */ case '(': avancaCaractere(); Expressao(); /* Verifica o fechamento do parenteses */ if(in[indIn] == ')'){ avancaCaractere(); }else{ geral = montaErro(FECHA_PARENTESE_ESPERADO, indIn); } break; /* Caso seja um operador nao esperado */ case ')': case '/': case '*': case '+': case '-': case '\0': geral = montaErro(OPERANDO_ESPERADO, indIn); break; /* Caso seja uma variavel(a, b, c, ... ,z) */ default: imprimeSaida(in[indIn]); avancaCaractere(); break; } return resCorreto; } /* Primario */