00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef CFRONT_BASIC_TYPE_HPP
00035 #define CFRONT_BASIC_TYPE_HPP
00036
00037 #include "Type.hpp"
00038 #include <cstdlib>
00039
00040 namespace cfront {
00041
00046 class BasicType : public Type {
00047 public:
00048
00049 enum PrimitiveTag {
00050 NONE,
00051 BOOL,
00052 CHAR,
00053 SCHAR,
00054 UCHAR,
00055 SSHORT,
00056 USHORT,
00057 SINT,
00058 UINT,
00059 SLONG,
00060 ULONG,
00061 SLLONG,
00062 ULLONG,
00063 FLOAT,
00064 DOUBLE,
00065 LDOUBLE,
00066 VOID,
00067 VA_LIST
00068 };
00069
00070 static bool isArithmeticTypeTag(PrimitiveTag t)
00071 {
00072 return BOOL <= t && t <= LDOUBLE;
00073 }
00074
00075 static bool isIntegerTypeTag(PrimitiveTag t)
00076 {
00077 return BOOL <= t && t <= ULLONG;
00078 }
00079
00080 BasicType(PrimitiveTag primitiveTag, QualFlags qualFlags = 0)
00081 : primitiveTag_(primitiveTag), qualFlags_(qualFlags) {}
00082 BasicType(const BasicType& other)
00083 : Type(other), primitiveTag_(other.primitiveTag_),
00084 qualFlags_(other.qualFlags_) {}
00085
00086 virtual ~BasicType() {}
00087
00088 virtual BasicType* clone() const
00089 {
00090 return new BasicType(*this);
00091 }
00092
00093 virtual bool isCompatibleType(const Type* other) const
00094 {
00095 const BasicType* bo = dynamic_cast<const BasicType*>(other);
00096 if (bo == NULL) return false;
00097 return this->primitiveTag_ == bo->primitiveTag_;
00098 }
00099
00100 virtual bool isScalarType() const
00101 {
00102 return isArithmeticType();
00103 }
00104
00105 virtual bool isArithmeticType() const
00106 {
00107 return isArithmeticTypeTag(primitiveTag_);
00108 }
00109
00110 virtual bool isIntegerType() const
00111 {
00112 return isIntegerTypeTag(primitiveTag_);
00113 }
00114
00115 virtual bool isVoidType() const
00116 {
00117 return primitiveTag_ == VOID;
00118 }
00119
00120 virtual size_t getSize(const TargetInfo& targetInfo) const
00121 {
00122 TargetInfo::Type tt = getTargetType(primitiveTag_);
00123 return targetInfo.getSize(tt);
00124 }
00125
00126 virtual size_t getAlign(const TargetInfo& targetInfo) const
00127 {
00128 TargetInfo::Type tt = getTargetType(primitiveTag_);
00129 return targetInfo.getAlign(tt);
00130 }
00131
00132 PrimitiveTag getPrimitiveTag() const
00133 {
00134 return primitiveTag_;
00135 }
00136
00137 QualFlags getQualFlags() const
00138 {
00139 return qualFlags_;
00140 }
00141
00142 void setQualFlags(QualFlags qf)
00143 {
00144 qualFlags_ = qf;
00145 }
00146
00147 #ifdef PARSER_DEBUG
00148 virtual std::string toString() const
00149 {
00150 std::stringstream ss;
00151 ss << "BaiscType[ " << primitiveTag_ << " (" <<
00152 toStringQualFlags(qualFlags_) << ")]";
00153 return ss.str();
00154 }
00155 #endif
00156
00157 protected:
00158 PrimitiveTag primitiveTag_;
00159 QualFlags qualFlags_;
00160
00161 TargetInfo::Type getTargetType(PrimitiveTag pt) const
00162 {
00163 static TargetInfo::Type TargetTypeTbl[] = {
00164 TargetInfo::LASTTYPE, TargetInfo::BOOL, TargetInfo::CHAR,
00165 TargetInfo::CHAR, TargetInfo::CHAR, TargetInfo::SHORT,
00166 TargetInfo::SHORT, TargetInfo::INT, TargetInfo::INT,
00167 TargetInfo::LONG, TargetInfo::LONG, TargetInfo::LLONG,
00168 TargetInfo::LLONG, TargetInfo::FLOAT, TargetInfo::DOUBLE,
00169 TargetInfo::LDOUBLE };
00170 unsigned int i = (unsigned int) pt;
00171 if (i >= sizeof(TargetTypeTbl) / sizeof(TargetInfo::Type)) {
00172
00173 std::abort();
00174 }
00175 TargetInfo::Type tt = TargetTypeTbl[i];
00176 if (tt == TargetInfo::LASTTYPE) {
00177
00178 std::abort();
00179 }
00180 return tt;
00181 }
00182 };
00183
00184 }
00185
00186 #endif
00187
00188
00189
00190
00191
00192
00193
00194
00195