enum SCOPE_TYPE{ //ベース SCOPE_TYPE_BASE, //分岐 SCOPE_TYPE_IF, //ループ SCOPE_TYPE_DO, SCOPE_TYPE_FOR, SCOPE_TYPE_WHILE, //ケース分け SCOPE_TYPE_SELECT, }; class CScope{ 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(); void Break(); void RunScheduleOfBreak(); }; class CLexicalScopes{ CScope **ppScopes; int level; CScope *SearchScope( SCOPE_TYPE TypeOfStatement ); public: CLexicalScopes(); ~CLexicalScopes(); //初期化(関数コンパイルの開始時に呼び出される) void Init(int addr); // スコープを開始 void Start( int addr, SCOPE_TYPE TypeOfStatement ); //スコープを終了 void End(); //スコープ抜け出しステートメント void Break(); void ExitFor(); void ExitWhile(); void ExitDo(); int GetNowLevel(void); void SetNowLevel( int level ); int GetStartAddress(void); //スコープ終了時のデストラクタ呼び出し void CallDestructorsOfScopeEnd(); //Returnステートメント用のデストラクタ呼び出し void CallDestructorsOfReturn( int BaseLevel = 0 ); }; extern CLexicalScopes obj_LexScopes;