#pragma once #include enum SCOPE_TYPE{ //ベース SCOPE_TYPE_BASE, //分岐 SCOPE_TYPE_IF, //ループ SCOPE_TYPE_DO, SCOPE_TYPE_FOR, SCOPE_TYPE_WHILE, //ケース分け SCOPE_TYPE_SELECT, }; class CScope{ protected: int level; int StartAddress; SCOPE_TYPE TypeOfStatement; DWORD *pBreakSchedule; int nBreakSchedule; public: CScope( int level, int addr, SCOPE_TYPE TypeOfStatement ); ~CScope(); int GetStartAddress(); SCOPE_TYPE GetTypeOfStatement(); virtual void Break() = 0; virtual void RunScheduleOfBreak() = 0; }; class CLexicalScopes{ protected: CScope **ppScopes; int level; virtual CScope *CreateScope( int level, int addr, SCOPE_TYPE TypeOfStatement ) = 0; public: CLexicalScopes(); ~CLexicalScopes(); //初期化(関数コンパイルの開始時に呼び出される) void Init(int addr); // スコープを開始 void Start( int addr, SCOPE_TYPE TypeOfStatement ); // スコープを終了 virtual void End() = 0; // スコープを検索 CScope *SearchScope( SCOPE_TYPE TypeOfStatement ); int GetNowLevel(void); void SetNowLevel( int level ); int GetStartAddress(void); //スコープ終了時のデストラクタ呼び出し virtual void CallDestructorsOfScopeEnd() = 0; //Returnステートメント用のデストラクタ呼び出し virtual void CallDestructorsOfReturn( int BaseLevel = 0 ) = 0; };