00001 #ifndef CALCULO_FORMULA_H
00002 #define CALCULO_FORMULA_H
00003
00004 #include <string>
00005 #include <vector>
00006 #include <map>
00007
00008 #include "simbolo.H"
00009
00010
00011 namespace Calculo {
00012
00013 class Funcao;
00014
00094 class Formula {
00095 public:
00098 typedef std::map<std::string, double> MapaDeConstantes;
00099
00104 typedef std::map<std::string, Funcao> MapaDeFuncoes;
00105
00109 Formula(std::string const& formula);
00110
00118 double valor(MapaDeConstantes const& constantes,
00119 MapaDeFuncoes const& funcoes) const;
00120
00121 private:
00123 typedef std::vector<Simbolo> Simbolos;
00124 typedef Simbolos::const_iterator Iterador;
00125
00131 Simbolos simbolos;
00132
00136 struct Contexto {
00137 Contexto(MapaDeConstantes const& constantes,
00138 MapaDeFuncoes const& funcoes);
00139
00140 MapaDeConstantes const& constantes;
00141 MapaDeFuncoes const& funcoes;
00142 };
00143
00145 double valorDeFormula(Contexto& contexto) const;
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00180 double valorDeExpressao(Contexto& contexto, Iterador& i) const;
00181
00186 double valorDeExpressaoCondicional(Contexto& contexto,Iterador& i) const;
00187
00192 double valorDeExpressaoOu(Contexto& contexto, Iterador& i) const;
00193
00198 double valorDeExpressaoE(Contexto& contexto, Iterador& i) const;
00199
00204 double valorDeExpressaoIgualdade(Contexto& contexto, Iterador& i) const;
00205
00210 double valorDeExpressaoRelacional(Contexto& contexto, Iterador& i) const;
00211
00216 double valorDeExpressaoAditiva(Contexto& contexto, Iterador& i) const;
00217
00222 double valorDeExpressaoMultiplicativa(Contexto& contexto,
00223 Iterador& i) const;
00224
00229 double valorDeExpressaoPotencial(Contexto& contexto, Iterador& i) const;
00230
00235 double valorDeExpressaoUnaria(Contexto& contexto, Iterador& i) const;
00236
00241 double valorDeExpressaoFuncional(Contexto& contexto,
00242 Iterador& i) const;
00243
00249 std::vector<double> valoresDeListaDeExpressoes(Contexto& contexto,
00250 Iterador& i) const;
00251
00256 double valorDeExpressaoPrimaria(Contexto& contexto,
00257 Iterador& i) const;
00258
00261 double valorDeFuncao(Contexto& contexto, std::string const& nome,
00262 std::vector<double> const& argumentos) const;
00263
00265 bool cumpreInvariante() const;
00266 };
00267
00268 }
00269
00270 #include "formula_impl.H"
00271
00272 #endif // CALCULO_ANALISE_FORMULA_H