00001 #include <sstream>
00002
00003 inline
00004 Calculo::Formula::Contexto::Contexto(MapaDeConstantes const& constantes,
00005 MapaDeFuncoes const& funcoes)
00006 : constantes(constantes), funcoes(funcoes)
00007 {
00008 }
00009
00010 inline Calculo::Formula::Formula(std::string const& formula)
00011 {
00012 std::istringstream entrada(formula);
00013
00014 do {
00015 simbolos.push_back(Simbolo(entrada));
00016 } while(simbolos.back() != Simbolo::fim);
00017
00018 assert(cumpreInvariante());
00019 }
00020
00021 inline double Calculo::Formula::valorDeFormula(Contexto& contexto) const
00022 {
00023 Iterador i = simbolos.begin();
00024
00025 double valor = valorDeExpressao(contexto, i);
00026
00027 if(i != simbolos.end() and *i != Simbolo::fim)
00028 throw ErroDeAnalise(std::string("fórmula contém símbolo expúrio ") +
00029 i->descricao());
00030
00031 return valor;
00032 }
00033
00034 inline double
00035 Calculo::Formula::valorDeExpressao(Contexto& contexto, Iterador& i) const
00036 {
00037 double valor = valorDeExpressaoCondicional(contexto, i);
00038
00039 return valor;
00040 }
00041
00042 inline bool Calculo::Formula::cumpreInvariante() const
00043 {
00044 return true;
00045 }