00001 #include <iostream>
00002 #include <cassert>
00003
00004 inline
00005 Calculo::Simbolo::operator Calculo::Simbolo::Tipo() const
00006 {
00007 assert(cumpreInvariante());
00008
00009 return tipo_;
00010 }
00011
00012 inline std::string const& Calculo::Simbolo::valorTextual() const
00013 {
00014 assert(cumpreInvariante());
00015 assert(*this == identificador or *this == constante);
00016
00017 return valor_textual;
00018 }
00019
00020 inline double Calculo::Simbolo::valorNumerico() const
00021 {
00022 assert(cumpreInvariante());
00023 assert(*this == numero);
00024
00025 return valor_numerico;
00026 }
00027
00028 inline std::string const& Calculo::Simbolo::nomeCurto() const
00029 {
00030 assert(cumpreInvariante());
00031
00032 return nomes_curtos_dos_tipos[tipo_];
00033 }
00034
00035 inline std::string const& Calculo::Simbolo::nomeLongo() const
00036 {
00037 assert(cumpreInvariante());
00038
00039 return nomes_longos_dos_tipos[tipo_];
00040 }
00041
00042 inline std::string Calculo::Simbolo::nomeCompleto() const
00043 {
00044 assert(cumpreInvariante());
00045
00046 return std::string("'") + nomeCurto() + "' (" + nomeLongo() + ')';
00047 }
00048
00049 inline void Calculo::Simbolo::leValorNumerico(std::istream& entrada)
00050 {
00051 if(not (entrada >> valor_numerico))
00052 throw ErroDeAnalise("formato de número errado");
00053 tipo_ = numero;
00054 }
00055
00056 inline bool Calculo::Simbolo::cumpreInvariante() const
00057 {
00058 return primeiro <= tipo_ and tipo_ <= ultimo;
00059 }
00060