00001 #ifndef CALCULO_SIMBOLO_H
00002 #define CALCULO_SIMBOLO_H
00003
00004 #include <iosfwd>
00005 #include <string>
00006
00007 #include "erros.H"
00008
00009 namespace Calculo {
00010
00015 class Simbolo {
00016 public:
00018 enum Tipo {
00019 teste_de_condicao,
00020 primeiro = teste_de_condicao,
00021 separador_de_condicao,
00022 ou,
00023 e,
00024 negacao,
00025 igual,
00026 diferente,
00027 menor,
00028 menor_ou_igual,
00029 maior,
00030 maior_ou_igual,
00031 adicao,
00032 subtraccao,
00033 produto,
00034 divisao,
00035 potencia,
00036 parenteses_esquerdo,
00037 parenteses_direito,
00038 virgula,
00039 identificador,
00040 numero,
00041 constante,
00042 fim,
00043 ultimo = fim
00044 };
00045
00048 explicit Simbolo(std::istream& entrada);
00049
00059 operator Tipo() const;
00060
00066 std::string const& valorTextual() const;
00067
00072 double valorNumerico() const;
00073
00076 std::string const& nomeCurto() const;
00077
00080 std::string const& nomeLongo() const;
00081
00084 std::string nomeCompleto() const;
00085
00089 std::string descricao() const ;
00090
00091 private:
00092 Tipo tipo_;
00093 std::string valor_textual;
00094 double valor_numerico;
00095
00096 static std::string const nomes_curtos_dos_tipos[fim + 1];
00097 static std::string const nomes_longos_dos_tipos[fim + 1];
00098
00100 void leValorTextual(std::istream& entrada);
00101
00103 void leValorNumerico(std::istream& entrada);
00104
00106 bool cumpreInvariante() const;
00107 };
00108
00109 }
00110
00111 #include "simbolo_impl.H"
00112
00113 #endif // CALCULO_ANALISE_SIMBOLO_H