class Variable : public Type { string name; bool isConst; bool isRef; bool isArray; int subScripts[MAX_ARRAYDIM]; bool isParameter; public: Variable( const string &name, const Type &type, bool isConst = false, bool isRef = false ): Type( type ), name( name ), isConst( isConst ), isRef( isRef ), isArray( false ), isParameter( false) { subScripts[0] = -1; } Variable( const Variable &var ): Type( var ), name( var.name ), isConst( var.isConst ), isRef( var.isRef ), isArray( false ), isParameter( false ) { subScripts[0] = -1; if( var.isArray ){ SetArray( var.subScripts ); } } ~Variable(){} void SetArray( const int *pSubScripts ){ isArray = true; memcpy( this->subScripts, pSubScripts, sizeof(int) * MAX_ARRAYDIM ); } const string &GetName() const { return name; } void ConstOff(){ isConst = false; } void ConstOn(){ isConst = true; } bool IsConst() const { return isConst; } bool IsRef() const { return isRef; } bool IsArray()const { return isArray; } const int *GetSubScriptsPtr() const { return subScripts; } void ThisIsParameter(){ isParameter = true; } bool IsParameter() const { return isParameter; } int GetMemorySize() const { if( isRef || isParameter ){ return PTR_SIZE; } int size = Type::GetSize(); if( isArray ){ int num = 1; for( int i=0; i { public: Variables(){} ~Variables(){ clear(); } void clear(){ for( int i=0; i<(int)this->size(); i++ ){ delete (*this)[i]; } vector::clear(); } bool DuplicateCheck( const string &varName ) const { //レキシカルスコープを考慮して重複判定 for( int i=(int)this->size()-1; i>=0 ; i-- ){ Variable &var = *(*this)[i]; if( var.bLiving //現在のスコープで有効なもの && var.ScopeLevel == obj_LexScopes.GetNowLevel() //現在のスコープと同一レベル ){ if( var.GetName() == varName ){ return true; } } } return false; } const Variable *BackSearch( const string &varName ) const { //レキシカルスコープを考慮してバックサーチ for( int i=(int)this->size()-1; i>=0 ; i-- ){ Variable &var = *(*this)[i]; if( var.bLiving //現在のスコープで有効なもの && var.ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) ){ if( var.GetName() == varName ){ return &var; } } } return NULL; } const Variable *Find( const string &varName )const { int max = (int)this->size(); for( int i=0; iGetName() == varName ){ return pVar; } } return NULL; } }; extern Variables globalVars;