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 static bool eIdentificador(std::string const& nome);
00092 private:
00093 Tipo tipo_;
00094 std::string valor_textual;
00095 double valor_numerico;
00096
00097 static std::string const nomes_curtos_dos_tipos[fim + 1];
00098 static std::string const nomes_longos_dos_tipos[fim + 1];
00099
00101 void leValorTextual(std::istream& entrada);
00102
00104 void leValorNumerico(std::istream& entrada);
00105
00107 bool cumpreInvariante() const;
00108 };
00109
00110 }
00111
00112 #include "simbolo_impl.H"
00113
00114 #endif // CALCULO_ANALISE_SIMBOLO_H