00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef CPPEXPRESSION_H
00020 #define CPPEXPRESSION_H
00021
00022 #include <dtoolbase.h>
00023
00024 #include "cppDeclaration.h"
00025
00026 class CPPIdentifier;
00027 class CPPType;
00028 class CPPPreprocessor;
00029 class CPPFunctionGroup;
00030
00031
00032
00033
00034
00035 class CPPExpression : public CPPDeclaration {
00036 public:
00037 CPPExpression(int value);
00038 CPPExpression(const string &value);
00039 CPPExpression(double value);
00040 CPPExpression(CPPIdentifier *ident, CPPScope *current_scope,
00041 CPPScope *global_scope, CPPPreprocessor *error_sink = NULL);
00042 CPPExpression(int unary_operator, CPPExpression *op1);
00043 CPPExpression(int binary_operator, CPPExpression *op1, CPPExpression *op2);
00044 CPPExpression(int trinary_operator, CPPExpression *op1, CPPExpression *op2, CPPExpression *op3);
00045
00046 static CPPExpression typecast_op(CPPType *type, CPPExpression *op1);
00047 static CPPExpression construct_op(CPPType *type, CPPExpression *op1);
00048 static CPPExpression new_op(CPPType *type, CPPExpression *op1 = NULL);
00049 static CPPExpression sizeof_func(CPPType *type);
00050
00051 ~CPPExpression();
00052
00053 enum ResultType {
00054 RT_integer,
00055 RT_real,
00056 RT_pointer,
00057 RT_error
00058 };
00059
00060 class Result {
00061 public:
00062 Result();
00063 Result(int value);
00064 Result(double value);
00065 Result(void *value);
00066
00067 int as_integer() const;
00068 double as_real() const;
00069 void *as_pointer() const;
00070 void output(ostream &out) const;
00071
00072 ResultType _type;
00073 union {
00074 int _integer;
00075 double _real;
00076 void *_pointer;
00077 } _u;
00078 };
00079
00080
00081 Result evaluate() const;
00082 CPPType *determine_type() const;
00083 bool is_tbd() const;
00084
00085 virtual CPPDeclaration *substitute_decl(SubstDecl &subst,
00086 CPPScope *current_scope,
00087 CPPScope *global_scope);
00088
00089 virtual void output(ostream &out, int indent_level, CPPScope *scope,
00090 bool complete) const;
00091 virtual SubType get_subtype() const;
00092
00093 virtual CPPExpression *as_expression();
00094
00095
00096 enum Type {
00097 T_integer,
00098 T_real,
00099 T_string,
00100 T_variable,
00101 T_function,
00102 T_unknown_ident,
00103 T_typecast,
00104 T_construct,
00105 T_default_construct,
00106 T_new,
00107 T_default_new,
00108 T_sizeof,
00109 T_unary_operation,
00110 T_binary_operation,
00111 T_trinary_operation,
00112 };
00113
00114 Type _type;
00115 string _str;
00116 union {
00117 int _integer;
00118 double _real;
00119 CPPInstance *_variable;
00120 CPPFunctionGroup *_fgroup;
00121 CPPIdentifier *_ident;
00122 class {
00123 public:
00124 CPPType *_to;
00125 CPPExpression *_op1;
00126 } _typecast;
00127 class {
00128 public:
00129
00130
00131 int _operator;
00132 CPPExpression *_op1;
00133 CPPExpression *_op2;
00134 CPPExpression *_op3;
00135 } _op;
00136 } _u;
00137
00138 protected:
00139 static CPPType *elevate_type(CPPType *t1, CPPType *t2);
00140 virtual bool is_equal(const CPPDeclaration *other) const;
00141 virtual bool is_less(const CPPDeclaration *other) const;
00142 };
00143
00144 inline ostream &
00145 operator << (ostream &out, const CPPExpression::Result &result) {
00146 result.output(out);
00147 return out;
00148 }
00149
00150 #endif
00151
00152