| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- #ifndef EXP_H
- #define EXP_H
- #include "block.h"
- struct Exp{
- virtual ~Exp();
- Val *evalRef( Block *block );
-
- Val *eval( Scope *scope );
- Val *eval( Scope *scope,Type *type );
- Val *evalInit( Scope *scope,Type *type );
- protected:
- virtual Val *_eval( Scope *scope );
- };
- struct ExpSeq : public vector<Exp*>{
- ExpSeq();
- virtual ~ExpSeq();
- };
- struct ValExp : public Exp{
- Val *val;
- ValExp( Val *v ):val(v){}
- Val *_eval( Scope *scope );
- };
- struct CastExp : public Exp{
- Type *type;
- Exp *exp;
- CastExp( Type *t,Exp *e ):type(t),exp(e){}
- Val *_eval( Scope *scope );
- };
- struct NullExp : public Exp{
- Val *_eval( Scope *scope );
- };
- struct LocalDeclExp : public Exp{
- string ident;
- Type *type;
- Block *block;
-
- LocalDeclExp( string id,Type *ty,Block *b ):ident(id),type(ty),block(b){}
-
- Val *_eval( Scope *scope );
- };
- struct GlobalExp : public Exp{
- string ident;
-
- GlobalExp( string id ):ident(id){}
-
- Val *_eval( Scope *scope );
- };
- struct IdentExp : public Exp{
- string ident;
- Type *type;
-
- IdentExp( string id,Type *ty ):ident(id),type(ty){}
- Val *_eval( Scope *scope );
- };
- struct MemberExp : public Exp{
- Exp *lhs,*rhs;
- MemberExp( Exp *l,Exp *r ):lhs(l),rhs(r){}
- Val *_eval( Scope *scope );
- };
- struct SelfExp : public Exp{
- Val *_eval( Scope *scope );
- };
- struct SuperExp : public Exp{
- Val *_eval( Scope *scope );
- };
- struct NewExp : public Exp{
- Exp *exp;
- NewExp( Exp *e ):exp(e){}
-
- Val *_eval( Scope *scope );
- };
- struct ArrayExp : public Exp{
- Exp *exp;
- Type *type;
-
- ExpSeq dims;
-
- ArrayExp( Exp *e ):exp(e),type(0){}
- ArrayExp( Type *t ):exp(0),type(t){}
-
- Val *_eval( Scope *scope );
- };
- struct ArrayDataExp : public Exp{
- ExpSeq exps;
- Val *_eval( Scope *scope );
- };
- struct IntrinsicExp : public Exp{
- int toke;
- Type *type;
- Exp *exp;
-
- IntrinsicExp( int t,Type *ty,Exp *e ):toke(t),type(ty),exp(e){}
- Val *_eval( Scope *scope );
- };
- struct ExpSeqExp : public Exp{
- Exp *exp;
- ExpSeq seq;
-
- ExpSeqExp( Exp *e ):exp(e){}
-
- Val *_eval( Scope *scope );
-
- Val *invokeFun( Val *v,FunType *t,Scope *sc );
- Val *performCast( Val *v,Scope *sc );
-
- Val *indexString( Val *v,Scope *sc );
- Val *indexArray( Val *v,ArrayType *t,Scope *sc );
- Val *indexPointer( Val *v,Type *t,Scope *sc );
- };
- struct InvokeExp : public ExpSeqExp{
- InvokeExp( Exp *e ):ExpSeqExp(e){}
- Val *_eval( Scope *scope );
- };
- struct IndexExp : public ExpSeqExp{
- IndexExp( Exp *e ):ExpSeqExp(e){}
- Val *_eval( Scope *scope );
- };
- struct SliceExp : public Exp{
- int toke;
- Exp *exp;
- Exp *lhs,*rhs;
-
- SliceExp( int t,Exp *e,Exp *l,Exp *r ):toke(t),exp(e),lhs(l),rhs(r){}
-
- Val *_eval( Scope *scope );
- };
- //<, =, >, <=, >=, <>
- struct CmpExp : public Exp{
- int op;
- Exp *lhs,*rhs;
- CmpExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r){}
- Val *_eval( Scope *scope );
- };
- struct ShortCircExp : public Exp{
- int op;
- Exp *lhs,*rhs;
- ShortCircExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r){}
-
- Val *_eval( Scope *scope );
- };
- struct NotExp : public Exp{
- Exp *exp;
- NotExp( Exp *e ):exp(e){}
- Val *_eval( Scope *scope );
- };
- //-, Abs
- struct UnaryExp : public Exp{
- int op;
- Exp *exp;
- UnaryExp( int o,Exp *e ):op(o),exp(e){}
- Val *_eval( Scope *scope );
- };
- //+, -, *, /, Mod, Min, Max
- struct ArithExp : public Exp{
- int op;
- Exp *lhs,*rhs;
- Val *lhs_val,*rhs_val;
-
- ArithExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r),lhs_val(0),rhs_val(0){}
- ArithExp( int o,Val *l,Exp *r ):op(o),lhs(0),rhs(r),lhs_val(l),rhs_val(0){}
- Val *pointerArith( Val *pv,Val *iv );
- Val *_eval( Scope *scope );
- };
- //And, Or, Xor, Shl, Shr, Sar
- struct BitwiseExp : public Exp{
- int op;
- Exp *lhs,*rhs;
- Val *lhs_val,*rhs_val;
- BitwiseExp( int o,Exp *l,Exp *r ):op(o),lhs(l),rhs(r),lhs_val(0),rhs_val(0){}
- BitwiseExp( int o,Val *l,Exp *r ):op(o),lhs(0),rhs(r),lhs_val(l),rhs_val(0){}
- Val *_eval( Scope *scope );
- };
- #endif
|