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