/* Pela definicao: e = t1 (+) t2 (+) t3 ... (+) tn sendo t algum Termo */ Erro Expressao() { /* Processa uma expressão da cadeia de entrada. */ char operador = in[indIn]; char unario = 0; VerificaCaractere(); /*Operador Unario*/ if(operador == '-'){ unario = '~'; avancaCaractere(); }else if(operador == '+'){ unario = '&'; avancaCaractere(); } Termo(); if(unario){ imprimeSaida(unario); } operador = in[indIn]; while((operador == '+') || (operador == '-')){ avancaCaractere(); Termo(); imprimeSaida(operador); operador = in[indIn]; } return resCorreto; } /* Expressao */
Erro Expressao() { /* Processa uma expressão da cadeia de entrada. */ Erro err = resCorreto; char op; /* Remover os espaços do início */ while (isspace(in[indIn])) indIn++; /* Fim da entrada */ if (in[indIn] == '\0' && in[indIn] == ')') return montaErro(OPERANDO_ESPERADO, indIn); /* Tratar mais e menos unário aqui, pois eles só podem aparecer * no primeiro elemento de uma expressão */ if (in[indIn] == '-') { indIn++; err = Termo(); if (err.codigoErro != EXPR_VALIDA) { /* O erro parentético tem precedência */ if (err.codigoErro == FECHA_PARENTESE_ESPERADO) return err; return montaErro(OPERANDO_ESPERADO, indIn); } pos[indPos++] = '~'; } else if (in[indIn] == '+') { indIn++; err = Termo(); if (err.codigoErro != EXPR_VALIDA) { /* O erro parentético tem precedência */ if (err.codigoErro == FECHA_PARENTESE_ESPERADO) return err; return montaErro(OPERANDO_ESPERADO, indIn); } pos[indPos++] = '&'; } else { err = Termo(); if (err.codigoErro != EXPR_VALIDA) { /* O erro parentético tem precedência */ if (err.codigoErro == FECHA_PARENTESE_ESPERADO) return err; return montaErro(OPERANDO_ESPERADO, indIn); } } do { /* Remover os espaços até o próximo caracter */ while (isspace(in[indIn])) indIn++; op = in[indIn]; if (op == '+' || op == '-') { /* Consumir o operador */ indIn++; err = Termo(); if (err.codigoErro != EXPR_VALIDA) { /* O erro parentético tem precedência */ if (err.codigoErro == FECHA_PARENTESE_ESPERADO) return err; return montaErro(OPERANDO_ESPERADO, indIn); } pos[indPos++] = op; } else break; } while (true); return resCorreto; } /* Expressao */