00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef INCL_UCEXPR
00026 #define INCL_UCEXPR 1
00027
00028 #include <vector>
00029 #include <string>
00030 #include "ucloc.h"
00031
00032 using std::vector;
00033
00034 class Uc_symbol;
00035 class Uc_var_symbol;
00036 class Uc_function;
00037
00038
00039
00040
00041 class Uc_expression : public Uc_location
00042 {
00043 public:
00044
00045 Uc_expression() : Uc_location()
00046 { }
00047 virtual ~Uc_expression() { }
00048
00049 virtual void gen_value(vector<char>& out) = 0;
00050
00051 virtual int gen_values(vector<char>& out);
00052
00053 virtual int gen_jmp_if_false(vector<char>& out, int offset);
00054
00055 virtual void gen_assign(vector<char>& out);
00056 virtual int get_string_offset()
00057 { return -1; }
00058
00059 virtual Uc_var_symbol *need_var(vector<char>& out, Uc_function *fun);
00060
00061 virtual bool eval_const(int& val);
00062 };
00063
00064
00065
00066
00067 class Uc_var_expression : public Uc_expression
00068 {
00069 Uc_var_symbol *var;
00070 public:
00071
00072 Uc_var_expression(Uc_var_symbol *v) : var(v)
00073 { }
00074
00075 virtual void gen_value(vector<char>& out);
00076
00077 virtual void gen_assign(vector<char>& out);
00078 virtual int get_string_offset();
00079 virtual Uc_var_symbol *need_var(vector<char>& , Uc_function *)
00080 { return var; }
00081 };
00082
00083
00084
00085
00086 class Uc_arrayelem_expression : public Uc_expression
00087 {
00088 Uc_var_symbol *array;
00089 Uc_expression *index;
00090 public:
00091 Uc_arrayelem_expression(Uc_var_symbol *a, Uc_expression *i)
00092 : array(a), index(i)
00093 { }
00094 ~Uc_arrayelem_expression()
00095 { delete index; }
00096
00097 virtual void gen_value(vector<char>& out);
00098
00099 virtual void gen_assign(vector<char>& out);
00100 };
00101
00102
00103
00104
00105 class Uc_flag_expression : public Uc_expression
00106 {
00107 int index;
00108 public:
00109 Uc_flag_expression(int i)
00110 : index(i)
00111 { }
00112
00113 virtual void gen_value(vector<char>& out);
00114
00115 virtual void gen_assign(vector<char>& out);
00116 };
00117
00118
00119
00120
00121 class Uc_binary_expression : public Uc_expression
00122 {
00123 int opcode;
00124 Uc_expression *left, *right;
00125 public:
00126 Uc_binary_expression(int o, Uc_expression *l, Uc_expression *r)
00127 : opcode(o), left(l), right(r)
00128 { }
00129
00130 virtual void gen_value(vector<char>& out);
00131
00132 virtual bool eval_const(int& val);
00133 };
00134
00135
00136
00137
00138 class Uc_unary_expression : public Uc_expression
00139 {
00140 int opcode;
00141 Uc_expression *operand;
00142 public:
00143 Uc_unary_expression(int o, Uc_expression *r)
00144 : opcode(o), operand(r)
00145 { }
00146
00147 virtual void gen_value(vector<char>& out);
00148 };
00149
00150
00151
00152
00153
00154 class Uc_response_expression : public Uc_expression
00155 {
00156 Uc_expression *operand;
00157 public:
00158 Uc_response_expression(Uc_expression *r)
00159 : operand(r)
00160 { }
00161
00162 virtual void gen_value(vector<char>& out);
00163
00164 virtual int gen_jmp_if_false(vector<char>& out, int offset);
00165 };
00166
00167
00168
00169
00170 class Uc_int_expression : public Uc_expression
00171 {
00172 int value;
00173 public:
00174 Uc_int_expression(int v) : value(v)
00175 { }
00176
00177 virtual void gen_value(vector<char>& out);
00178
00179 virtual bool eval_const(int& val);
00180 };
00181
00182
00183
00184
00185 class Uc_bool_expression : public Uc_expression
00186 {
00187 bool tf;
00188 public:
00189 Uc_bool_expression(bool t) : tf(t)
00190 { }
00191
00192 virtual void gen_value(vector<char>& out);
00193 };
00194
00195
00196
00197
00198 class Uc_event_expression : public Uc_expression
00199 {
00200 public:
00201 Uc_event_expression() { }
00202
00203 virtual void gen_value(vector<char>& out);
00204
00205 virtual void gen_assign(vector<char>& out);
00206 };
00207
00208
00209
00210
00211 class Uc_item_expression : public Uc_expression
00212 {
00213 public:
00214 Uc_item_expression() { }
00215
00216 virtual void gen_value(vector<char>& out);
00217 };
00218
00219
00220
00221
00222 class Uc_string_expression : public Uc_expression
00223 {
00224 int offset;
00225 public:
00226 Uc_string_expression(int o) : offset(o)
00227 { }
00228
00229 virtual void gen_value(vector<char>& out);
00230 virtual int get_string_offset()
00231 { return offset; }
00232 };
00233
00234
00235
00236
00237 class Uc_string_prefix_expression : public Uc_expression
00238 {
00239 Uc_function *fun;
00240 std::string prefix;
00241 int offset;
00242
00243 public:
00244 Uc_string_prefix_expression(Uc_function *f, char *pre)
00245 : fun(f), prefix(pre), offset(-1)
00246 { }
00247
00248 virtual void gen_value(vector<char>& out);
00249 virtual int get_string_offset();
00250 };
00251
00252
00253
00254
00255 class Uc_array_expression : public Uc_expression
00256 {
00257 std::vector<Uc_expression*> exprs;
00258 public:
00259 Uc_array_expression() { }
00260 Uc_array_expression(Uc_expression *e0)
00261 { add(e0); }
00262 Uc_array_expression(Uc_expression *e0, Uc_expression *e1)
00263 { add(e0); add(e1); }
00264 ~Uc_array_expression();
00265 void add(Uc_expression *e)
00266 { exprs.push_back(e); }
00267 void clear()
00268 { exprs.clear(); }
00269 void concat(Uc_expression *e);
00270 const std::vector<Uc_expression*>& get_exprs()
00271 { return exprs; }
00272
00273 virtual void gen_value(vector<char>& out);
00274
00275 virtual int gen_values(vector<char>& out);
00276 };
00277
00278
00279
00280
00281 class Uc_call_expression : public Uc_expression
00282 {
00283 Uc_symbol *sym;
00284 bool original;
00285
00286 Uc_expression *itemref;
00287 Uc_array_expression *parms;
00288 Uc_function *function;
00289 bool return_value;
00290
00291 public:
00292 Uc_call_expression(Uc_symbol *s, Uc_array_expression *prms,
00293 Uc_function *fun, bool orig = false)
00294 : sym(s), itemref(0), parms(prms),
00295 function(fun), original(orig), return_value(true)
00296 { }
00297 ~Uc_call_expression()
00298 { delete parms; delete itemref; }
00299 void set_itemref(Uc_expression *iexpr)
00300 { itemref = iexpr; }
00301 void set_no_return()
00302 { return_value = false; }
00303
00304 virtual void gen_value(vector<char>& out);
00305 };
00306
00307
00308
00309
00310
00311 inline void Write2(vector<char>& out, unsigned short val)
00312 {
00313 out.push_back((char) (val&0xff));
00314 out.push_back((char) ((val>>8)&0xff));
00315 }
00316 inline void Write2(vector<char>& out, int pos, unsigned short val)
00317 {
00318 out[pos] = (char) (val&0xff);
00319 out[pos + 1] = (char) ((val>>8)&0xff);
00320 }
00321
00322 #endif