exp.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #ifndef EXP_H
  2. #define EXP_H
  3. #include "block.h"
  4. struct Exp{
  5. virtual ~Exp();
  6. Val *evalRef( Block *block );
  7. Val *eval( Scope *scope );
  8. Val *eval( Scope *scope,Type *type );
  9. Val *evalInit( Scope *scope,Type *type );
  10. protected:
  11. virtual Val *_eval( Scope *scope );
  12. };
  13. struct ExpSeq : public vector<Exp*>{
  14. ExpSeq();
  15. virtual ~ExpSeq();
  16. };
  17. struct ValExp : public Exp{
  18. Val *val;
  19. ValExp( Val *v ):val(v){}
  20. Val *_eval( Scope *scope );
  21. };
  22. struct CastExp : public Exp{
  23. Type *type;
  24. Exp *exp;
  25. CastExp( Type *t,Exp *e ):type(t),exp(e){}
  26. Val *_eval( Scope *scope );
  27. };
  28. struct NullExp : public Exp{
  29. Val *_eval( Scope *scope );
  30. };
  31. struct LocalDeclExp : public Exp{
  32. string ident;
  33. Type *type;
  34. Block *block;
  35. LocalDeclExp( string id,Type *ty,Block *b ):ident(id),type(ty),block(b){}
  36. Val *_eval( Scope *scope );
  37. };
  38. struct GlobalExp : public Exp{
  39. string ident;
  40. GlobalExp( string id ):ident(id){}
  41. Val *_eval( Scope *scope );
  42. };
  43. struct IdentExp : public Exp{
  44. string ident;
  45. Type *type;
  46. IdentExp( string id,Type *ty ):ident(id),type(ty){}
  47. Val *_eval( Scope *scope );
  48. };
  49. struct MemberExp : public Exp{
  50. Exp *lhs,*rhs;
  51. MemberExp( Exp *l,Exp *r ):lhs(l),rhs(r){}
  52. Val *_eval( Scope *scope );
  53. };
  54. struct SelfExp : public Exp{
  55. Val *_eval( Scope *scope );
  56. };
  57. struct SuperExp : public Exp{
  58. Val *_eval( Scope *scope );
  59. };
  60. struct NewExp : public Exp{
  61. Exp *exp;
  62. NewExp( Exp *e ):exp(e){}
  63. Val *_eval( Scope *scope );
  64. };
  65. struct ArrayExp : public Exp{
  66. Exp *exp;
  67. Type *type;
  68. ExpSeq dims;
  69. ArrayExp( Exp *e ):exp(e),type(0){}
  70. ArrayExp( Type *t ):exp(0),type(t){}
  71. Val *_eval( Scope *scope );
  72. };
  73. struct ArrayDataExp : public Exp{
  74. ExpSeq exps;
  75. Val *_eval( Scope *scope );
  76. };
  77. struct IntrinsicExp : public Exp{
  78. int toke;
  79. Type *type;
  80. Exp *exp;
  81. IntrinsicExp( int t,Type *ty,Exp *e ):toke(t),type(ty),exp(e){}
  82. Val *_eval( Scope *scope );
  83. };
  84. struct ExpSeqExp : public Exp{
  85. Exp *exp;
  86. ExpSeq seq;
  87. ExpSeqExp( Exp *e ):exp(e){}
  88. Val *_eval( Scope *scope );
  89. Val *invokeFun( Val *v,FunType *t,Scope *sc );
  90. Val *performCast( Val *v,Scope *sc );
  91. Val *indexString( Val *v,Scope *sc );
  92. Val *indexArray( Val *v,ArrayType *t,Scope *sc );
  93. Val *indexPointer( Val *v,Type *t,Scope *sc );
  94. };
  95. struct InvokeExp : public ExpSeqExp{
  96. InvokeExp( Exp *e ):ExpSeqExp(e){}
  97. Val *_eval( Scope *scope );
  98. };
  99. struct IndexExp : public ExpSeqExp{
  100. IndexExp( Exp *e ):ExpSeqExp(e){}
  101. Val *_eval( Scope *scope );
  102. };
  103. struct SliceExp : public Exp{
  104. int toke;
  105. Exp *exp;
  106. Exp *lhs,*rhs;
  107. SliceExp( int t,Exp *e,Exp *l,Exp *r ):toke(t),exp(e),lhs(l),rhs(r){}
  108. Val *_eval( Scope *scope );
  109. };
  110. //<, =, >, <=, >=, <>
  111. struct CmpExp : public Exp{
  112. int op;
  113. Exp *lhs,*rhs;
  114. CmpExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r){}
  115. Val *_eval( Scope *scope );
  116. };
  117. struct ShortCircExp : public Exp{
  118. int op;
  119. Exp *lhs,*rhs;
  120. ShortCircExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r){}
  121. Val *_eval( Scope *scope );
  122. };
  123. struct NotExp : public Exp{
  124. Exp *exp;
  125. NotExp( Exp *e ):exp(e){}
  126. Val *_eval( Scope *scope );
  127. };
  128. //-, Abs
  129. struct UnaryExp : public Exp{
  130. int op;
  131. Exp *exp;
  132. UnaryExp( int o,Exp *e ):op(o),exp(e){}
  133. Val *_eval( Scope *scope );
  134. };
  135. //+, -, *, /, Mod, Min, Max
  136. struct ArithExp : public Exp{
  137. int op;
  138. Exp *lhs,*rhs;
  139. Val *lhs_val,*rhs_val;
  140. ArithExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r),lhs_val(0),rhs_val(0){}
  141. ArithExp( int o,Val *l,Exp *r ):op(o),lhs(0),rhs(r),lhs_val(l),rhs_val(0){}
  142. Val *pointerArith( Val *pv,Val *iv );
  143. Val *_eval( Scope *scope );
  144. };
  145. //And, Or, Xor, Shl, Shr, Sar
  146. struct BitwiseExp : public Exp{
  147. int op;
  148. Exp *lhs,*rhs;
  149. Val *lhs_val,*rhs_val;
  150. BitwiseExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r),lhs_val(0),rhs_val(0){}
  151. BitwiseExp( int o,Val *l,Exp *r ):op(o),lhs(0),rhs(r),lhs_val(l),rhs_val(0){}
  152. Val *_eval( Scope *scope );
  153. };
  154. #endif