Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Class_Collect.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Class_Collect.cpp	(revision 511)
+++ 	(revision )
@@ -1,1021 +1,0 @@
-#include "stdafx.h"
-
-#include <Source.h>
-#include <Class.h>
-#include <Compiler.h>
-
-#include "../common.h"
-#ifdef _AMD64_
-#include "../../compiler_x64/opcode.h"
-#else
-#include "../../compiler_x86/opcode.h"
-#endif
-
-using namespace ActiveBasic::Compiler;
-
-
-class CLoopRefCheck{
-	char **names;
-	int num;
-	void init(){
-		int i;
-		for(i=0;i<num;i++){
-			free(names[i]);
-		}
-		free(names);
-	}
-public:
-	CLoopRefCheck()
-	{
-		names=(char **)malloc(1);
-		num=0;
-	}
-	~CLoopRefCheck()
-	{
-		init();
-	}
-	void add(const char *lpszInheritsClass)
-	{
-		names=(char **)realloc(names,(num+1)*sizeof(char *));
-		names[num]=(char *)malloc(lstrlen(lpszInheritsClass)+1);
-		lstrcpy(names[num],lpszInheritsClass);
-		num++;
-	}
-	void del(const char *lpszInheritsClass)
-	{
-		int i;
-		for(i=0;i<num;i++){
-			if(lstrcmp(names[i],lpszInheritsClass)==0){
-				free(names[i]);
-				break;
-			}
-		}
-		if(i!=num){
-			num--;
-			for(;i<num;i++){
-				names[i]=names[i+1];
-			}
-		}
-	}
-	BOOL check(const CClass &inheritsClass) const
-	{
-		//ループ継承チェック
-		int i;
-		for(i=0;i<num;i++){
-			if( inheritsClass.GetName() == names[i] ){
-				return 1;
-			}
-		}
-		return 0;
-	}
-};
-CLoopRefCheck *pobj_LoopRefCheck;
-
-bool MemberVar_LoopRefCheck(const CClass &objClass){
-	if( objClass.HasSuperClass() )
-	{
-		// 基底クラスをチェック
-		if( MemberVar_LoopRefCheck( objClass.GetSuperClass() ) == false )
-		{
-			return false;
-		}
-	}
-
-	bool result = true;
-	BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
-		if(pMember->GetType().IsStruct()){
-			//循環参照でないかをチェック
-			if(pobj_LoopRefCheck->check(pMember->GetType().GetClass())){
-				extern int cp;
-				compiler.errorMessenger.Output(124,pMember->GetType().GetClass().GetName(),cp);
-				return false;
-			}
-
-			pobj_LoopRefCheck->add(objClass.GetName().c_str());
-
-			bool tempResult = MemberVar_LoopRefCheck(pMember->GetType().GetClass());
-			if( result )
-			{
-				result = tempResult;
-			}
-
-			pobj_LoopRefCheck->del(objClass.GetName().c_str());
-		}
-	}
-
-	return result;
-}
-
-void LexicalAnalyzer::AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
-	bool isVirtual, bool isOverride, const char *interfaceName, bool isAutoGeneration, int nowLine)
-{
-	if( isAutoGeneration )
-	{
-		// コード自動生成
-		pUserProc->ThisIsAutoGenerationProc();
-	}
-
-
-	////////////////////////////////////////////////////////////
-	// コンストラクタ、デストラクタの場合の処理
-	////////////////////////////////////////////////////////////
-	BOOL fConstructor=0,bDestructor=0;
-
-	if( pUserProc->GetName() == pobj_c->GetName() ){
-		//コンストラクタの場合
-
-		//標準コンストラクタ（引数なし）
-		if(pUserProc->Params().size()==0) fConstructor=1;
-
-		//強制的にConst修飾子をつける
-		isConst = true;
-	}
-	else if(pUserProc->GetName()[0]=='~'){
-		//デストラクタの場合はその名前が正しいかチェックを行う
-		if(lstrcmp(pUserProc->GetName().c_str()+1,pobj_c->GetName().c_str())!=0)
-			compiler.errorMessenger.Output(117,NULL,nowLine);
-		else
-			bDestructor=1;
-	}
-	if(fConstructor||bDestructor){
-		// コンストラクタ、デストラクタのアクセシビリティをチェック
-
-		//強制的にConst修飾子をつける
-		isConst = true;
-	}
-
-	if( fConstructor == 1 )
-		pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
-	else if( bDestructor )
-		pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
-
-
-
-	//////////////////
-	// 重複チェック
-	//////////////////
-
-	if(pobj_c->DupliCheckMember( pUserProc->GetName().c_str() )){
-		compiler.errorMessenger.Output(15,pUserProc->GetName(),nowLine);
-		return;
-	}
-
-	//メソッド
-	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
-	{
-		//基底クラスと重複する場合はオーバーライドを行う
-		if( pMethod->GetInheritsClassPtr() ) continue;
-
-		if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
-		{
-			//関数名、パラメータ、戻り値が合致したとき
-			compiler.errorMessenger.Output(15,pUserProc->GetName().c_str(),nowLine);
-			return;
-		}
-	}
-
-	//仮想関数の場合
-	if( isAbstract ) pUserProc->CompleteCompile();
-
-	// メソッドのオーバーライド
-	CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
-	if( pMethodForOverride )
-	{
-		pMethodForOverride->Override( pUserProc, accessibility, isOverride );
-		pUserProc->SetMethod( pMethodForOverride );
-		return;
-	}
-	else
-	{
-		// インターフェイス メソッドのオーバーライド
-		BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
-		{
-			if( interfaceName[0] )
-			{
-				if( pInterface->GetClass().GetName() != interfaceName )
-				{
-					// 指定されたインターフェイス名と整合しないとき
-					continue;
-				}
-			}
-
-			if( !pInterface->GetClass().IsReady() ){
-				// インターフェイスが未解析のとき
-				LexicalAnalyzer::LookaheadClass(
-					pInterface->GetClass().GetName().c_str(),
-					compiler.GetObjectModule().meta.GetClasses()
-				);
-			}
-
-			CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
-			if( pMethodForOverride )
-			{
-				pMethodForOverride->Override( pUserProc, accessibility, isOverride );
-				pUserProc->SetMethod( pMethodForOverride );
-				return;
-			}
-		}
-	}
-
-	if( interfaceName[0] )
-	{
-		compiler.errorMessenger.Output(139,interfaceName,nowLine);
-	}
-
-	if( isVirtual ){
-		pobj_c->AddVtblNum( 1 );
-	}
-
-	if( isOverride ){
-		compiler.errorMessenger.Output(12,"Override",nowLine);
-	}
-
-	if(bStatic){
-		pobj_c->GetStaticMethods().AddStatic( pUserProc, accessibility );
-	}
-	else{
-		pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);
-	}
-}
-
-bool LexicalAnalyzer::Inherits( CClass &currentClass, const char *inheritNames, int nowLine ){
-	int i = 0;
-	bool isInheritsClass = false;
-	while( true ){
-
-		char temporary[VN_SIZE];
-		for( int i2=0;; i++, i2++ ){
-			if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
-				temporary[i2] = 0;
-				break;
-			}
-			temporary[i2] = inheritNames[i];
-		}
-
-		// ジェネリクス構文を分解
-		char className[VN_SIZE];
-		Jenga::Common::Strings typeParameterStrings;
-		SplitGenericClassInstance( temporary, className, typeParameterStrings );
-
-		// 型パラメータ文字列から型データを取得
-		Types actualTypeParameters;
-		BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
-		{
-			Type type;
-			compiler.StringToType( typeParameterStr, type );
-			actualTypeParameters.push_back( type );
-		}
-
-		//継承元クラスを取得
-		const CClass *pInheritsClass = compiler.GetObjectModule().meta.GetClasses().Find(className);
-		if( !pInheritsClass ){
-			compiler.errorMessenger.Output(106,className,nowLine);
-			return false;
-		}
-
-		if( pInheritsClass->IsClass() ){
-			// クラスを継承する
-			isInheritsClass = true;
-
-			//ループ継承でないかをチェック
-			if( !LexicalAnalyzer::LoopRefCheck(*pInheritsClass) )
-			{
-				compiler.errorMessenger.Output(123,pInheritsClass->GetName(),nowLine);
-				return false;
-			}
-
-			if( !pInheritsClass->IsReady() ){
-				//継承先が読み取られていないとき
-				LexicalAnalyzer::LookaheadClass(
-					pInheritsClass->GetName().c_str(),
-					compiler.GetObjectModule().meta.GetClasses()
-				);
-			}
-
-			if( !currentClass.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
-				return false;
-			}
-		}
-		else{
-			compiler.errorMessenger.Output(135,pInheritsClass->GetFullName().c_str(),nowLine);
-			return false;
-		}
-
-		if( inheritNames[i] == '\0' ){
-			break;
-		}
-		i++;
-	}
-
-	if( !isInheritsClass ){
-		const CClass *pObjectClass = compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr();
-		//ループ継承でないかをチェック
-		if( !LexicalAnalyzer::LoopRefCheck( *pObjectClass ) )
-		{
-			compiler.errorMessenger.Output(123,pObjectClass->GetName(),nowLine);
-			return false;
-		}
-
-		if( !pObjectClass->IsReady() ){
-			//継承先が読み取られていないとき
-			LexicalAnalyzer::LookaheadClass(
-				pObjectClass->GetName().c_str(),
-				compiler.GetObjectModule().meta.GetClasses()
-			);
-		}
-
-		// クラスを一つも継承していないとき
-		if( !currentClass.InheritsClass( *pObjectClass, Types(), nowLine ) ){
-			return false;
-		}
-	}
-
-	return true;
-}
-
-bool LexicalAnalyzer::Implements( CClass &currentClass, const char *interfaceNames, int nowLine )
-{
-	Jenga::Common::Strings paramStrs;
-	SplitParameter( interfaceNames, paramStrs );
-	
-	BOOST_FOREACH( const std::string &paramStr, paramStrs )
-	{
-		char className[VN_SIZE];
-		Jenga::Common::Strings typeParameterStrings;
-		SplitGenericClassInstance( paramStr.c_str(), className, typeParameterStrings );
-
-		Types actualTypeParameters;
-		BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
-		{
-			Type type;
-			compiler.StringToType( typeParameterStr, type );
-			actualTypeParameters.push_back( type );
-		}
-
-		//継承元クラスを取得
-		const CClass *pInterfaceClass = compiler.GetObjectModule().meta.GetClasses().Find( className );
-		if( !pInterfaceClass ){
-			compiler.errorMessenger.Output(106,paramStr.c_str(),nowLine);
-			continue;
-		}
-
-		if( !pInterfaceClass->IsReady() ){
-			// インターフェイスが未解析のとき
-			LexicalAnalyzer::LookaheadClass(
-				pInterfaceClass->GetName().c_str(),
-				compiler.GetObjectModule().meta.GetClasses()
-			);
-		}
-
-		// インターフェイスを継承する
-		currentClass.Implements( *pInterfaceClass, actualTypeParameters, nowLine );
-	}
-
-	return true;
-}
-
-void GetClass_recur( const char *lpszInheritsClass, Classes &classes )
-{
-	extern char *basbuf;
-	int i,i2,i3,sub_address,top_pos;
-	char temporary[8192];
-
-	// 名前空間管理
-	NamespaceScopes backupNamespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
-	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
-	namespaceScopes.clear();
-
-	// Importsされた名前空間の管理
-	NamespaceScopesCollection backupImportedNamespaces = compiler.GetNamespaceSupporter().GetImportedNamespaces();
-	compiler.GetNamespaceSupporter().GetImportedNamespaces().clear();
-
-	// 呼び出し元でコンパイル中のクラスポインタをバックアップ
-	const CClass *pBackCompilingClass = compiler.pCompilingClass;
-
-	for(i=0;;i++){
-		if(basbuf[i]=='\0') break;
-
-
-		// 名前空間
-		if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){
-			for(i+=2,i2=0;;i2++,i++){
-				if( IsCommandDelimitation( basbuf[i] ) ){
-					temporary[i2]=0;
-					break;
-				}
-				temporary[i2]=basbuf[i];
-			}
-			namespaceScopes.push_back( temporary );
-
-			continue;
-		}
-		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){
-			if( namespaceScopes.size() <= 0 ){
-				compiler.errorMessenger.Output(12, "End Namespace", i );
-			}
-			else{
-				namespaceScopes.pop_back();
-			}
-
-			i += 2;
-			continue;
-		}
-
-		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPORTS ){
-			for(i+=2,i2=0;;i2++,i++){
-				if( IsCommandDelimitation( basbuf[i] ) ){
-					temporary[i2]=0;
-					break;
-				}
-				temporary[i2]=basbuf[i];
-			}
-			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
-			{
-				compiler.errorMessenger.Output(64,temporary,i );
-			}
-
-			continue;
-		}
-		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
-			compiler.GetNamespaceSupporter().GetImportedNamespaces().clear();
-			continue;
-		}
-
-
-
-		if(basbuf[i]==1&&basbuf[i+1]==ESC_INTERFACE){
-			//////////////////////////
-			// インターフェイス
-			//////////////////////////
-
-			top_pos=i;
-
-			i+=2;
-
-			//インターフェイス名を取得
-			GetCommandToken( temporary, basbuf, i );
-
-			char className[VN_SIZE];
-			Jenga::Common::Strings typeParameters;
-			Jenga::Common::Strings typeParameterBaseClassNames;
-			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
-
-			CClass *pobj_c = const_cast<CClass *>( classes.Find(namespaceScopes, className) );
-			if(!pobj_c) continue;
-
-			compiler.pCompilingClass = pobj_c;
-
-			if(lpszInheritsClass){
-				if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
-					//継承先先読み用
-					continue;
-				}
-			}
-
-			if(pobj_c->IsReady()){
-				//既に先読みされているとき
-				continue;
-			}
-
-			/////////////////////////////////////////////////////////
-			// ☆★☆ ジェネリクスサポート ☆★☆
-			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
-			{
-				Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
-				if( typeParameterBaseClassNames[i2].size() )
-				{
-					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
-					{
-						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
-					}
-					else if( !baseType.IsObject() )
-					{
-						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
-					}
-				}
-
-				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
-			}
-			/////////////////////////////////////////////////////////
-
-			pobj_c->Readed();
-
-			pobj_c->SetConstructorMemberSubIndex( -1 );
-			pobj_c->SetDestructorMemberSubIndex( -1 );
-
-			if( memcmp( basbuf+i+1, "__COM", 5 ) == 0 && IsCommandDelimitation( basbuf[i+1+5] ) )
-			{
-				// COMインターフェイス
-				pobj_c->SetClassType( CClass::ComInterface );
-
-				i += 6;
-			}
-
-			if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
-				//継承を行う場合
-				for(i+=3,i2=0;;i++,i2++){
-					if(IsCommandDelimitation(basbuf[i])){
-						temporary[i2]=0;
-						break;
-					}
-					temporary[i2]=basbuf[i];
-				}
-
-				if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
-					compiler.errorMessenger.Output(105,temporary,i);
-					goto Interface_InheritsError;
-				}
-
-				//継承元クラスを取得
-				const CClass *pInheritsClass = classes.Find(temporary);
-				if( !pInheritsClass ){
-					compiler.errorMessenger.Output(106,temporary,i);
-					goto Interface_InheritsError;
-				}
-
-				//ループ継承でないかをチェック
-				if( !LexicalAnalyzer::LoopRefCheck( *pInheritsClass ) )
-				{
-					compiler.errorMessenger.Output(123,pInheritsClass->GetName(),i);
-					goto Interface_InheritsError;
-				}
-
-				//継承させる
-				if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){
-					goto Interface_InheritsError;
-				}
-			}
-			else{
-				//継承無し
-				if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
-				{
-					// TODO: ここに来ないことが実証できたらこの分岐は消す
-					Jenga::Throw( "GetClass_recur内の例外" );
-				}
-			}
-Interface_InheritsError:
-
-			//メンバ変数、関数を取得
-			while(1){
-				i++;
-
-				//エラー
-				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE||basbuf[i+1]==ESC_INTERFACE)){
-					compiler.errorMessenger.Output(22,"Interface",i);
-					i--;
-					break;
-				}
-
-				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
-					compiler.errorMessenger.Output(111,NULL,i);
-					break;
-				}
-				else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPLEMENTS )
-				{
-					compiler.errorMessenger.Output(137, NULL, i );
-					break;
-				}
-
-				sub_address=i;
-
-				for(i2=0;;i++,i2++){
-					if(IsCommandDelimitation(basbuf[i])){
-						temporary[i2]=0;
-						break;
-					}
-					temporary[i2]=basbuf[i];
-				}
-				if(temporary[0]=='\0'){
-					if(basbuf[i]=='\0'){
-						i--;
-						compiler.errorMessenger.Output(22,"Interface",top_pos);
-						break;
-					}
-					continue;
-				}
-
-				//End Interface記述の場合
-				if(temporary[0]==1&&temporary[1]==ESC_ENDINTERFACE) break;
-
-				if(!(temporary[0]==1&&(
-					temporary[1]==ESC_SUB||temporary[1]==ESC_FUNCTION
-					))){
-					compiler.errorMessenger.Output(1,NULL,i);
-					break;
-				}
-
-				//関数ハッシュへ登録
-				char interfaceName[VN_SIZE] = "";
-				UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,true,pobj_c, false, interfaceName );
-				if( pUserProc )
-				{
-					compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i );
-
-					//メンバ関数を追加
-					LexicalAnalyzer::AddMethod(pobj_c,
-						pUserProc,
-						Prototype::Public,	//Publicアクセス権
-						0,					// bStatic
-						false,				// isConst
-						true,				// isAbstract
-						true,				// isVirtual
-						false,				// isOverride
-						interfaceName,
-						false,				// isAutoGeneration
-						sub_address
-						);
-				}
-			}
-		}
-
-		if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
-			//////////////////////////
-			// クラス
-			//////////////////////////
-
-			top_pos=i;
-
-			const DWORD dwClassType=basbuf[i+1];
-
-			i+=2;
-
-			int iAlign=0;
-			if(memicmp(basbuf+i,"Align(",6)==0){
-				//アラインメント修飾子
-				i+=6;
-				i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
-				iAlign=atoi(temporary);
-
-				if( dwClassType != ESC_TYPE )
-				{
-					compiler.errorMessenger.Output(140,NULL,i);
-				}
-
-				if(!(iAlign==1||iAlign==2||iAlign==4||iAlign==8||iAlign==16))
-					compiler.errorMessenger.Output(51,NULL,i);
-			}
-			else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
-				// Blittable修飾子
-				i+=10;
-				i=JumpStringInPare(basbuf,i)+1;
-
-				if( dwClassType != ESC_CLASS )
-				{
-					compiler.errorMessenger.Output(141,NULL,i);
-				}
-			}
-
-			if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM )
-			{
-				// 列挙型の場合
-				i += 2;
-			}
-			else if( basbuf[i] == 1 && basbuf[i+1] == ESC_DELEGATE )
-			{
-				// デリゲートの場合
-				i += 2;
-			}
-
-			//クラス名を取得
-			GetCommandToken( temporary, basbuf, i );
-
-			char className[VN_SIZE];
-			Jenga::Common::Strings typeParameters;
-			Jenga::Common::Strings typeParameterBaseClassNames;
-			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
-
-			CClass *pobj_c =  const_cast<CClass *>( classes.Find(namespaceScopes, className) );
-			if(!pobj_c) continue;
-
-			compiler.pCompilingClass = pobj_c;
-
-			if(lpszInheritsClass){
-				if( pobj_c->GetName() != lpszInheritsClass ){
-					//継承先先読み用
-					continue;
-				}
-			}
-
-			if( lstrcmp(className,"Control")==0)
-			{
-				int test=0;
-			}
-
-			if(pobj_c->IsReady()){
-				//既に先読みされているとき
-				continue;
-			}
-
-
-			/////////////////////////////////////////////////////////
-			// ☆★☆ ジェネリクスサポート ☆★☆
-			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
-			{
-				Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
-				if( typeParameterBaseClassNames[i2].size() )
-				{
-					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
-					{
-						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
-					}
-					else if( !baseType.IsObject() )
-					{
-						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
-					}
-				}
-
-				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
-			}
-			/////////////////////////////////////////////////////////
-
-
-			pobj_c->SetFixedAlignment( iAlign );
-
-			pobj_c->Readed();
-
-			pobj_c->SetConstructorMemberSubIndex( -1 );
-			pobj_c->SetDestructorMemberSubIndex( -1 );
-
-			//アクセス制限の初期値をセット
-			Prototype::Accessibility accessibility;
-			if(dwClassType==ESC_CLASS){
-				accessibility = Prototype::Private;
-			}
-			else{
-				accessibility = Prototype::Public;
-			}
-
-			if( pobj_c->GetName() == "Object"
-				|| dwClassType == ESC_TYPE )
-			{
-				// 何も継承しない
-
-				if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
-				{
-					// TODO: ここに来ないことが実証できたらこの分岐は消す
-					Jenga::Throw( "GetClass_recur内の例外" );
-				}
-			}
-			else{
-				if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS)
-				{
-					// クラス継承先が指定されているとき
-					i += 3;
-					GetCommandToken( temporary, basbuf, i );
-
-					if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
-						compiler.errorMessenger.Output(105,temporary,i);
-						goto InheritsError;
-					}
-				}
-				else
-				{
-					// 何の指定もないときはObjectクラスを継承する
-					lstrcpy( temporary, "Object" );
-				}
-				LexicalAnalyzer::Inherits( *pobj_c, temporary, i );
-
-				if( basbuf[i+1] == 1 && basbuf[i+2] == ESC_IMPLEMENTS )
-				{
-					// インターフェイス実装を行う場合
-					i += 3;
-					GetCommandToken( temporary, basbuf, i );
-
-					LexicalAnalyzer::Implements( *pobj_c, temporary, i );
-				}
-			}
-InheritsError:
-
-			//メンバとメソッドを取得
-			while(1){
-				i++;
-
-				//エラー
-				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
-					compiler.errorMessenger.Output(22,"Class",i);
-					i--;
-					break;
-				}
-
-				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
-					compiler.errorMessenger.Output(111,NULL,i);
-					break;
-				}
-				else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPLEMENTS )
-				{
-					compiler.errorMessenger.Output(137, NULL, i );
-					break;
-				}
-
-				//Static修飾子
-				BOOL bStatic;
-				if(basbuf[i]==1&&basbuf[i+1]==ESC_STATIC){
-					bStatic=1;
-					i+=2;
-				}
-				else bStatic=0;
-
-				//Const修飾子
-				bool isConst = false;
-				if( basbuf[i] == 1 && basbuf[i + 1] == ESC_CONST ){
-					isConst = true;
-					i += 2;
-				}
-
-				if(basbuf[i]==1&&(
-					basbuf[i+1]==ESC_ABSTRACT||basbuf[i+1]==ESC_VIRTUAL||basbuf[i+1]==ESC_OVERRIDE||
-					basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION
-					)){
-					i3=basbuf[i+1];
-					sub_address=i;
-				}
-				else i3=0;
-
-				bool isVirtual = false, isAbstract = false, isOverride = false;
-				if(i3==ESC_ABSTRACT){
-					isAbstract=1;
-					isVirtual=1;
-					i+=2;
-
-					i3=basbuf[i+1];
-				}
-				else if(i3==ESC_VIRTUAL){
-					isAbstract=0;
-					isVirtual=1;
-					i+=2;
-
-					i3=basbuf[i+1];
-				}
-				else if(i3==ESC_OVERRIDE){
-					isOverride=1;
-					isVirtual=1;
-
-					i+=2;
-
-					i3=basbuf[i+1];
-				}
-
-				for(i2=0;;i++,i2++){
-					if(IsCommandDelimitation(basbuf[i])){
-						temporary[i2]=0;
-						break;
-					}
-					temporary[i2]=basbuf[i];
-				}
-				if(temporary[0]=='\0'){
-					if(basbuf[i]=='\0'){
-
-						if(dwClassType==ESC_CLASS)
-							compiler.errorMessenger.Output(22,"Class",top_pos);
-						else
-							compiler.errorMessenger.Output(22,"Type",top_pos);
-
-						i--;
-						break;
-					}
-					continue;
-				}
-
-				//End Class記述の場合
-				if(temporary[0]==1&&temporary[1]==ESC_ENDCLASS&&dwClassType==ESC_CLASS) break;
-				if(temporary[0]==1&&temporary[1]==ESC_ENDTYPE&&dwClassType==ESC_TYPE) break;
-
-				//アクセスを変更
-				if(lstrcmpi(temporary,"Private")==0){
-					accessibility = Prototype::Private;
-					continue;
-				}
-				if(lstrcmpi(temporary,"Public")==0){
-					accessibility = Prototype::Public;
-					continue;
-				}
-				if(lstrcmpi(temporary,"Protected")==0){
-					accessibility = Prototype::Protected;
-					continue;
-				}
-
-				extern int cp;
-				if(i3==0){
-					if(bStatic){
-						//静的メンバを追加
-						cp=i;	//エラー用
-						pobj_c->AddStaticMember( accessibility, isConst, false, temporary, i);
-					}
-					else{
-						//メンバを追加
-						cp=i;	//エラー用
-						pobj_c->AddMember( accessibility, isConst, false, temporary, i );
-
-
-						if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
-							if( !pobj_c->GetDynamicMembers().back()->GetType().GetClass().IsReady() ){
-								//参照先が読み取られていないとき
-								GetClass_recur( pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str(), classes );
-							}
-						}
-
-
-						if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
-							//循環参照のチェック
-							pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
-							if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers().back()->GetType().GetClass())){
-								//エラー回避
-								Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType());
-								type.SetBasicType( DEF_PTR_VOID );
-							}
-							pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
-						}
-					}
-				}
-				else{
-					//関数ハッシュへ登録
-					char interfaceName[VN_SIZE] = "";
-					UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,isVirtual,pobj_c, (bStatic!=0), interfaceName );
-					if( pUserProc )
-					{
-						compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i );
-
-						//メソッドを追加
-						cp=i;	//エラー用
-						LexicalAnalyzer::AddMethod(pobj_c,
-							pUserProc,
-							accessibility,
-							bStatic,
-							isConst,
-							isAbstract,
-							isVirtual,
-							isOverride,
-							interfaceName,
-							false,
-							sub_address);
-					}
-
-					if( isAbstract ) continue;
-
-					for(;;i++){
-						if(basbuf[i]=='\0'){
-							i--;
-							break;
-						}
-						if(basbuf[i-1]!='*'&&
-							basbuf[i]==1&&(
-							basbuf[i+1]==ESC_SUB||
-							basbuf[i+1]==ESC_FUNCTION||
-							basbuf[i+1]==ESC_MACRO||
-							basbuf[i+1]==ESC_TYPE||
-							basbuf[i+1]==ESC_CLASS||
-							basbuf[i+1]==ESC_INTERFACE||
-							basbuf[i+1]==ESC_ENUM)){
-							GetDefaultNameFromES(i3,temporary);
-							compiler.errorMessenger.Output(22,temporary,i);
-						}
-						if(basbuf[i]==1&&basbuf[i+1]==GetEndXXXCommand((char)i3)){
-							i+=2;
-							break;
-						}
-					}
-				}
-			}
-		}
-	}
-
-	// 呼び出し元でコンパイル中のクラスポインタを元に戻す
-	compiler.pCompilingClass = pBackCompilingClass;
-
-	// 名前空間を元に戻す
-	compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = backupNamespaceScopes;
-
-	// インポートされた名前空間を元に戻す
-	compiler.GetNamespaceSupporter().GetImportedNamespaces() = backupImportedNamespaces;
-}
-
-void LexicalAnalyzer::LookaheadClass( const char *className, Classes &classes )
-{
-	pobj_LoopRefCheck->add( className );
-	GetClass_recur( className, classes );
-	pobj_LoopRefCheck->del( className );
-}
-
-bool LexicalAnalyzer::LoopRefCheck( const CClass &objClass )
-{
-	if( pobj_LoopRefCheck->check( objClass ) )
-	{
-		return false;
-	}
-
-	return true;
-}
-
-void LexicalAnalyzer::CollectClasses( const char *source, Classes &classes ){
-	//ループ継承チェック用のクラス
-	pobj_LoopRefCheck=new CLoopRefCheck();
-
-	//クラスを取得
-	GetClass_recur( 0, classes );
-
-	delete pobj_LoopRefCheck;
-	pobj_LoopRefCheck=0;
-
-	// イテレータの準備
-	classes.Iterator_Init();
-}
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 512)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 512)
@@ -0,0 +1,1021 @@
+#include "stdafx.h"
+
+#include <Source.h>
+#include <Class.h>
+#include <Compiler.h>
+
+#include "../common.h"
+#ifdef _AMD64_
+#include "../../compiler_x64/opcode.h"
+#else
+#include "../../compiler_x86/opcode.h"
+#endif
+
+using namespace ActiveBasic::Compiler;
+
+
+class CLoopRefCheck{
+	char **names;
+	int num;
+	void init(){
+		int i;
+		for(i=0;i<num;i++){
+			free(names[i]);
+		}
+		free(names);
+	}
+public:
+	CLoopRefCheck()
+	{
+		names=(char **)malloc(1);
+		num=0;
+	}
+	~CLoopRefCheck()
+	{
+		init();
+	}
+	void add(const char *lpszInheritsClass)
+	{
+		names=(char **)realloc(names,(num+1)*sizeof(char *));
+		names[num]=(char *)malloc(lstrlen(lpszInheritsClass)+1);
+		lstrcpy(names[num],lpszInheritsClass);
+		num++;
+	}
+	void del(const char *lpszInheritsClass)
+	{
+		int i;
+		for(i=0;i<num;i++){
+			if(lstrcmp(names[i],lpszInheritsClass)==0){
+				free(names[i]);
+				break;
+			}
+		}
+		if(i!=num){
+			num--;
+			for(;i<num;i++){
+				names[i]=names[i+1];
+			}
+		}
+	}
+	BOOL check(const CClass &inheritsClass) const
+	{
+		//ループ継承チェック
+		int i;
+		for(i=0;i<num;i++){
+			if( inheritsClass.GetName() == names[i] ){
+				return 1;
+			}
+		}
+		return 0;
+	}
+};
+CLoopRefCheck *pobj_LoopRefCheck;
+
+bool MemberVar_LoopRefCheck(const CClass &objClass){
+	if( objClass.HasSuperClass() )
+	{
+		// 基底クラスをチェック
+		if( MemberVar_LoopRefCheck( objClass.GetSuperClass() ) == false )
+		{
+			return false;
+		}
+	}
+
+	bool result = true;
+	BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
+		if(pMember->GetType().IsStruct()){
+			//循環参照でないかをチェック
+			if(pobj_LoopRefCheck->check(pMember->GetType().GetClass())){
+				extern int cp;
+				compiler.errorMessenger.Output(124,pMember->GetType().GetClass().GetName(),cp);
+				return false;
+			}
+
+			pobj_LoopRefCheck->add(objClass.GetName().c_str());
+
+			bool tempResult = MemberVar_LoopRefCheck(pMember->GetType().GetClass());
+			if( result )
+			{
+				result = tempResult;
+			}
+
+			pobj_LoopRefCheck->del(objClass.GetName().c_str());
+		}
+	}
+
+	return result;
+}
+
+void LexicalAnalyzer::AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
+	bool isVirtual, bool isOverride, const char *interfaceName, bool isAutoGeneration, int nowLine)
+{
+	if( isAutoGeneration )
+	{
+		// コード自動生成
+		pUserProc->ThisIsAutoGenerationProc();
+	}
+
+
+	////////////////////////////////////////////////////////////
+	// コンストラクタ、デストラクタの場合の処理
+	////////////////////////////////////////////////////////////
+	BOOL fConstructor=0,bDestructor=0;
+
+	if( pUserProc->GetName() == pobj_c->GetName() ){
+		//コンストラクタの場合
+
+		//標準コンストラクタ（引数なし）
+		if(pUserProc->Params().size()==0) fConstructor=1;
+
+		//強制的にConst修飾子をつける
+		isConst = true;
+	}
+	else if(pUserProc->GetName()[0]=='~'){
+		//デストラクタの場合はその名前が正しいかチェックを行う
+		if(lstrcmp(pUserProc->GetName().c_str()+1,pobj_c->GetName().c_str())!=0)
+			compiler.errorMessenger.Output(117,NULL,nowLine);
+		else
+			bDestructor=1;
+	}
+	if(fConstructor||bDestructor){
+		// コンストラクタ、デストラクタのアクセシビリティをチェック
+
+		//強制的にConst修飾子をつける
+		isConst = true;
+	}
+
+	if( fConstructor == 1 )
+		pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
+	else if( bDestructor )
+		pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
+
+
+
+	//////////////////
+	// 重複チェック
+	//////////////////
+
+	if(pobj_c->DupliCheckMember( pUserProc->GetName().c_str() )){
+		compiler.errorMessenger.Output(15,pUserProc->GetName(),nowLine);
+		return;
+	}
+
+	//メソッド
+	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
+	{
+		//基底クラスと重複する場合はオーバーライドを行う
+		if( pMethod->GetInheritsClassPtr() ) continue;
+
+		if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
+		{
+			//関数名、パラメータ、戻り値が合致したとき
+			compiler.errorMessenger.Output(15,pUserProc->GetName().c_str(),nowLine);
+			return;
+		}
+	}
+
+	//仮想関数の場合
+	if( isAbstract ) pUserProc->CompleteCompile();
+
+	// メソッドのオーバーライド
+	CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
+	if( pMethodForOverride )
+	{
+		pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+		pUserProc->SetMethod( pMethodForOverride );
+		return;
+	}
+	else
+	{
+		// インターフェイス メソッドのオーバーライド
+		BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
+		{
+			if( interfaceName[0] )
+			{
+				if( pInterface->GetClass().GetName() != interfaceName )
+				{
+					// 指定されたインターフェイス名と整合しないとき
+					continue;
+				}
+			}
+
+			if( !pInterface->GetClass().IsReady() ){
+				// インターフェイスが未解析のとき
+				LexicalAnalyzer::LookaheadClass(
+					pInterface->GetClass().GetName().c_str(),
+					compiler.GetObjectModule().meta.GetClasses()
+				);
+			}
+
+			CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
+			if( pMethodForOverride )
+			{
+				pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+				pUserProc->SetMethod( pMethodForOverride );
+				return;
+			}
+		}
+	}
+
+	if( interfaceName[0] )
+	{
+		compiler.errorMessenger.Output(139,interfaceName,nowLine);
+	}
+
+	if( isVirtual ){
+		pobj_c->AddVtblNum( 1 );
+	}
+
+	if( isOverride ){
+		compiler.errorMessenger.Output(12,"Override",nowLine);
+	}
+
+	if(bStatic){
+		pobj_c->GetStaticMethods().AddStatic( pUserProc, accessibility );
+	}
+	else{
+		pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);
+	}
+}
+
+bool LexicalAnalyzer::Inherits( CClass &currentClass, const char *inheritNames, int nowLine ){
+	int i = 0;
+	bool isInheritsClass = false;
+	while( true ){
+
+		char temporary[VN_SIZE];
+		for( int i2=0;; i++, i2++ ){
+			if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
+				temporary[i2] = 0;
+				break;
+			}
+			temporary[i2] = inheritNames[i];
+		}
+
+		// ジェネリクス構文を分解
+		char className[VN_SIZE];
+		Jenga::Common::Strings typeParameterStrings;
+		SplitGenericClassInstance( temporary, className, typeParameterStrings );
+
+		// 型パラメータ文字列から型データを取得
+		Types actualTypeParameters;
+		BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
+		{
+			Type type;
+			compiler.StringToType( typeParameterStr, type );
+			actualTypeParameters.push_back( type );
+		}
+
+		//継承元クラスを取得
+		const CClass *pInheritsClass = compiler.GetObjectModule().meta.GetClasses().Find(className);
+		if( !pInheritsClass ){
+			compiler.errorMessenger.Output(106,className,nowLine);
+			return false;
+		}
+
+		if( pInheritsClass->IsClass() ){
+			// クラスを継承する
+			isInheritsClass = true;
+
+			//ループ継承でないかをチェック
+			if( !LexicalAnalyzer::LoopRefCheck(*pInheritsClass) )
+			{
+				compiler.errorMessenger.Output(123,pInheritsClass->GetName(),nowLine);
+				return false;
+			}
+
+			if( !pInheritsClass->IsReady() ){
+				//継承先が読み取られていないとき
+				LexicalAnalyzer::LookaheadClass(
+					pInheritsClass->GetName().c_str(),
+					compiler.GetObjectModule().meta.GetClasses()
+				);
+			}
+
+			if( !currentClass.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
+				return false;
+			}
+		}
+		else{
+			compiler.errorMessenger.Output(135,pInheritsClass->GetFullName().c_str(),nowLine);
+			return false;
+		}
+
+		if( inheritNames[i] == '\0' ){
+			break;
+		}
+		i++;
+	}
+
+	if( !isInheritsClass ){
+		const CClass *pObjectClass = compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr();
+		//ループ継承でないかをチェック
+		if( !LexicalAnalyzer::LoopRefCheck( *pObjectClass ) )
+		{
+			compiler.errorMessenger.Output(123,pObjectClass->GetName(),nowLine);
+			return false;
+		}
+
+		if( !pObjectClass->IsReady() ){
+			//継承先が読み取られていないとき
+			LexicalAnalyzer::LookaheadClass(
+				pObjectClass->GetName().c_str(),
+				compiler.GetObjectModule().meta.GetClasses()
+			);
+		}
+
+		// クラスを一つも継承していないとき
+		if( !currentClass.InheritsClass( *pObjectClass, Types(), nowLine ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool LexicalAnalyzer::Implements( CClass &currentClass, const char *interfaceNames, int nowLine )
+{
+	Jenga::Common::Strings paramStrs;
+	SplitParameter( interfaceNames, paramStrs );
+	
+	BOOST_FOREACH( const std::string &paramStr, paramStrs )
+	{
+		char className[VN_SIZE];
+		Jenga::Common::Strings typeParameterStrings;
+		SplitGenericClassInstance( paramStr.c_str(), className, typeParameterStrings );
+
+		Types actualTypeParameters;
+		BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
+		{
+			Type type;
+			compiler.StringToType( typeParameterStr, type );
+			actualTypeParameters.push_back( type );
+		}
+
+		//継承元クラスを取得
+		const CClass *pInterfaceClass = compiler.GetObjectModule().meta.GetClasses().Find( className );
+		if( !pInterfaceClass ){
+			compiler.errorMessenger.Output(106,paramStr.c_str(),nowLine);
+			continue;
+		}
+
+		if( !pInterfaceClass->IsReady() ){
+			// インターフェイスが未解析のとき
+			LexicalAnalyzer::LookaheadClass(
+				pInterfaceClass->GetName().c_str(),
+				compiler.GetObjectModule().meta.GetClasses()
+			);
+		}
+
+		// インターフェイスを継承する
+		currentClass.Implements( *pInterfaceClass, actualTypeParameters, nowLine );
+	}
+
+	return true;
+}
+
+void GetClass_recur( const char *lpszInheritsClass, Classes &classes )
+{
+	extern char *basbuf;
+	int i,i2,i3,sub_address,top_pos;
+	char temporary[8192];
+
+	// 名前空間管理
+	NamespaceScopes backupNamespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	// Importsされた名前空間の管理
+	NamespaceScopesCollection backupImportedNamespaces = compiler.GetNamespaceSupporter().GetImportedNamespaces();
+	compiler.GetNamespaceSupporter().GetImportedNamespaces().clear();
+
+	// 呼び出し元でコンパイル中のクラスポインタをバックアップ
+	const CClass *pBackCompilingClass = compiler.pCompilingClass;
+
+	for(i=0;;i++){
+		if(basbuf[i]=='\0') break;
+
+
+		// 名前空間
+		if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( basbuf[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPORTS ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( basbuf[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+			}
+			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
+			{
+				compiler.errorMessenger.Output(64,temporary,i );
+			}
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
+			compiler.GetNamespaceSupporter().GetImportedNamespaces().clear();
+			continue;
+		}
+
+
+
+		if(basbuf[i]==1&&basbuf[i+1]==ESC_INTERFACE){
+			//////////////////////////
+			// インターフェイス
+			//////////////////////////
+
+			top_pos=i;
+
+			i+=2;
+
+			//インターフェイス名を取得
+			GetCommandToken( temporary, basbuf, i );
+
+			char className[VN_SIZE];
+			Jenga::Common::Strings typeParameters;
+			Jenga::Common::Strings typeParameterBaseClassNames;
+			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
+
+			CClass *pobj_c = const_cast<CClass *>( classes.Find(namespaceScopes, className) );
+			if(!pobj_c) continue;
+
+			compiler.pCompilingClass = pobj_c;
+
+			if(lpszInheritsClass){
+				if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
+					//継承先先読み用
+					continue;
+				}
+			}
+
+			if(pobj_c->IsReady()){
+				//既に先読みされているとき
+				continue;
+			}
+
+			/////////////////////////////////////////////////////////
+			// ☆★☆ ジェネリクスサポート ☆★☆
+			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
+			{
+				Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
+				if( typeParameterBaseClassNames[i2].size() )
+				{
+					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+					else if( !baseType.IsObject() )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+				}
+
+				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
+			}
+			/////////////////////////////////////////////////////////
+
+			pobj_c->Readed();
+
+			pobj_c->SetConstructorMemberSubIndex( -1 );
+			pobj_c->SetDestructorMemberSubIndex( -1 );
+
+			if( memcmp( basbuf+i+1, "__COM", 5 ) == 0 && IsCommandDelimitation( basbuf[i+1+5] ) )
+			{
+				// COMインターフェイス
+				pobj_c->SetClassType( CClass::ComInterface );
+
+				i += 6;
+			}
+
+			if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
+				//継承を行う場合
+				for(i+=3,i2=0;;i++,i2++){
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+
+				if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
+					compiler.errorMessenger.Output(105,temporary,i);
+					goto Interface_InheritsError;
+				}
+
+				//継承元クラスを取得
+				const CClass *pInheritsClass = classes.Find(temporary);
+				if( !pInheritsClass ){
+					compiler.errorMessenger.Output(106,temporary,i);
+					goto Interface_InheritsError;
+				}
+
+				//ループ継承でないかをチェック
+				if( !LexicalAnalyzer::LoopRefCheck( *pInheritsClass ) )
+				{
+					compiler.errorMessenger.Output(123,pInheritsClass->GetName(),i);
+					goto Interface_InheritsError;
+				}
+
+				//継承させる
+				if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){
+					goto Interface_InheritsError;
+				}
+			}
+			else{
+				//継承無し
+				if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
+				{
+					// TODO: ここに来ないことが実証できたらこの分岐は消す
+					Jenga::Throw( "GetClass_recur内の例外" );
+				}
+			}
+Interface_InheritsError:
+
+			//メンバ変数、関数を取得
+			while(1){
+				i++;
+
+				//エラー
+				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE||basbuf[i+1]==ESC_INTERFACE)){
+					compiler.errorMessenger.Output(22,"Interface",i);
+					i--;
+					break;
+				}
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
+					compiler.errorMessenger.Output(111,NULL,i);
+					break;
+				}
+				else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPLEMENTS )
+				{
+					compiler.errorMessenger.Output(137, NULL, i );
+					break;
+				}
+
+				sub_address=i;
+
+				for(i2=0;;i++,i2++){
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+				if(temporary[0]=='\0'){
+					if(basbuf[i]=='\0'){
+						i--;
+						compiler.errorMessenger.Output(22,"Interface",top_pos);
+						break;
+					}
+					continue;
+				}
+
+				//End Interface記述の場合
+				if(temporary[0]==1&&temporary[1]==ESC_ENDINTERFACE) break;
+
+				if(!(temporary[0]==1&&(
+					temporary[1]==ESC_SUB||temporary[1]==ESC_FUNCTION
+					))){
+					compiler.errorMessenger.Output(1,NULL,i);
+					break;
+				}
+
+				//関数ハッシュへ登録
+				char interfaceName[VN_SIZE] = "";
+				UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,true,pobj_c, false, interfaceName );
+				if( pUserProc )
+				{
+					compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i );
+
+					//メンバ関数を追加
+					LexicalAnalyzer::AddMethod(pobj_c,
+						pUserProc,
+						Prototype::Public,	//Publicアクセス権
+						0,					// bStatic
+						false,				// isConst
+						true,				// isAbstract
+						true,				// isVirtual
+						false,				// isOverride
+						interfaceName,
+						false,				// isAutoGeneration
+						sub_address
+						);
+				}
+			}
+		}
+
+		if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
+			//////////////////////////
+			// クラス
+			//////////////////////////
+
+			top_pos=i;
+
+			const DWORD dwClassType=basbuf[i+1];
+
+			i+=2;
+
+			int iAlign=0;
+			if(memicmp(basbuf+i,"Align(",6)==0){
+				//アラインメント修飾子
+				i+=6;
+				i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
+				iAlign=atoi(temporary);
+
+				if( dwClassType != ESC_TYPE )
+				{
+					compiler.errorMessenger.Output(140,NULL,i);
+				}
+
+				if(!(iAlign==1||iAlign==2||iAlign==4||iAlign==8||iAlign==16))
+					compiler.errorMessenger.Output(51,NULL,i);
+			}
+			else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
+				// Blittable修飾子
+				i+=10;
+				i=JumpStringInPare(basbuf,i)+1;
+
+				if( dwClassType != ESC_CLASS )
+				{
+					compiler.errorMessenger.Output(141,NULL,i);
+				}
+			}
+
+			if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM )
+			{
+				// 列挙型の場合
+				i += 2;
+			}
+			else if( basbuf[i] == 1 && basbuf[i+1] == ESC_DELEGATE )
+			{
+				// デリゲートの場合
+				i += 2;
+			}
+
+			//クラス名を取得
+			GetCommandToken( temporary, basbuf, i );
+
+			char className[VN_SIZE];
+			Jenga::Common::Strings typeParameters;
+			Jenga::Common::Strings typeParameterBaseClassNames;
+			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
+
+			CClass *pobj_c =  const_cast<CClass *>( classes.Find(namespaceScopes, className) );
+			if(!pobj_c) continue;
+
+			compiler.pCompilingClass = pobj_c;
+
+			if(lpszInheritsClass){
+				if( pobj_c->GetName() != lpszInheritsClass ){
+					//継承先先読み用
+					continue;
+				}
+			}
+
+			if( lstrcmp(className,"Control")==0)
+			{
+				int test=0;
+			}
+
+			if(pobj_c->IsReady()){
+				//既に先読みされているとき
+				continue;
+			}
+
+
+			/////////////////////////////////////////////////////////
+			// ☆★☆ ジェネリクスサポート ☆★☆
+			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
+			{
+				Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
+				if( typeParameterBaseClassNames[i2].size() )
+				{
+					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+					else if( !baseType.IsObject() )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+				}
+
+				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
+			}
+			/////////////////////////////////////////////////////////
+
+
+			pobj_c->SetFixedAlignment( iAlign );
+
+			pobj_c->Readed();
+
+			pobj_c->SetConstructorMemberSubIndex( -1 );
+			pobj_c->SetDestructorMemberSubIndex( -1 );
+
+			//アクセス制限の初期値をセット
+			Prototype::Accessibility accessibility;
+			if(dwClassType==ESC_CLASS){
+				accessibility = Prototype::Private;
+			}
+			else{
+				accessibility = Prototype::Public;
+			}
+
+			if( pobj_c->GetName() == "Object"
+				|| dwClassType == ESC_TYPE )
+			{
+				// 何も継承しない
+
+				if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
+				{
+					// TODO: ここに来ないことが実証できたらこの分岐は消す
+					Jenga::Throw( "GetClass_recur内の例外" );
+				}
+			}
+			else{
+				if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS)
+				{
+					// クラス継承先が指定されているとき
+					i += 3;
+					GetCommandToken( temporary, basbuf, i );
+
+					if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
+						compiler.errorMessenger.Output(105,temporary,i);
+						goto InheritsError;
+					}
+				}
+				else
+				{
+					// 何の指定もないときはObjectクラスを継承する
+					lstrcpy( temporary, "Object" );
+				}
+				LexicalAnalyzer::Inherits( *pobj_c, temporary, i );
+
+				if( basbuf[i+1] == 1 && basbuf[i+2] == ESC_IMPLEMENTS )
+				{
+					// インターフェイス実装を行う場合
+					i += 3;
+					GetCommandToken( temporary, basbuf, i );
+
+					LexicalAnalyzer::Implements( *pobj_c, temporary, i );
+				}
+			}
+InheritsError:
+
+			//メンバとメソッドを取得
+			while(1){
+				i++;
+
+				//エラー
+				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
+					compiler.errorMessenger.Output(22,"Class",i);
+					i--;
+					break;
+				}
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
+					compiler.errorMessenger.Output(111,NULL,i);
+					break;
+				}
+				else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPLEMENTS )
+				{
+					compiler.errorMessenger.Output(137, NULL, i );
+					break;
+				}
+
+				//Static修飾子
+				BOOL bStatic;
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_STATIC){
+					bStatic=1;
+					i+=2;
+				}
+				else bStatic=0;
+
+				//Const修飾子
+				bool isConst = false;
+				if( basbuf[i] == 1 && basbuf[i + 1] == ESC_CONST ){
+					isConst = true;
+					i += 2;
+				}
+
+				if(basbuf[i]==1&&(
+					basbuf[i+1]==ESC_ABSTRACT||basbuf[i+1]==ESC_VIRTUAL||basbuf[i+1]==ESC_OVERRIDE||
+					basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION
+					)){
+					i3=basbuf[i+1];
+					sub_address=i;
+				}
+				else i3=0;
+
+				bool isVirtual = false, isAbstract = false, isOverride = false;
+				if(i3==ESC_ABSTRACT){
+					isAbstract=1;
+					isVirtual=1;
+					i+=2;
+
+					i3=basbuf[i+1];
+				}
+				else if(i3==ESC_VIRTUAL){
+					isAbstract=0;
+					isVirtual=1;
+					i+=2;
+
+					i3=basbuf[i+1];
+				}
+				else if(i3==ESC_OVERRIDE){
+					isOverride=1;
+					isVirtual=1;
+
+					i+=2;
+
+					i3=basbuf[i+1];
+				}
+
+				for(i2=0;;i++,i2++){
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+				if(temporary[0]=='\0'){
+					if(basbuf[i]=='\0'){
+
+						if(dwClassType==ESC_CLASS)
+							compiler.errorMessenger.Output(22,"Class",top_pos);
+						else
+							compiler.errorMessenger.Output(22,"Type",top_pos);
+
+						i--;
+						break;
+					}
+					continue;
+				}
+
+				//End Class記述の場合
+				if(temporary[0]==1&&temporary[1]==ESC_ENDCLASS&&dwClassType==ESC_CLASS) break;
+				if(temporary[0]==1&&temporary[1]==ESC_ENDTYPE&&dwClassType==ESC_TYPE) break;
+
+				//アクセスを変更
+				if(lstrcmpi(temporary,"Private")==0){
+					accessibility = Prototype::Private;
+					continue;
+				}
+				if(lstrcmpi(temporary,"Public")==0){
+					accessibility = Prototype::Public;
+					continue;
+				}
+				if(lstrcmpi(temporary,"Protected")==0){
+					accessibility = Prototype::Protected;
+					continue;
+				}
+
+				extern int cp;
+				if(i3==0){
+					if(bStatic){
+						//静的メンバを追加
+						cp=i;	//エラー用
+						pobj_c->AddStaticMember( accessibility, isConst, false, temporary, i);
+					}
+					else{
+						//メンバを追加
+						cp=i;	//エラー用
+						pobj_c->AddMember( accessibility, isConst, false, temporary, i );
+
+
+						if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
+							if( !pobj_c->GetDynamicMembers().back()->GetType().GetClass().IsReady() ){
+								//参照先が読み取られていないとき
+								GetClass_recur( pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str(), classes );
+							}
+						}
+
+
+						if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
+							//循環参照のチェック
+							pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
+							if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers().back()->GetType().GetClass())){
+								//エラー回避
+								Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType());
+								type.SetBasicType( DEF_PTR_VOID );
+							}
+							pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
+						}
+					}
+				}
+				else{
+					//関数ハッシュへ登録
+					char interfaceName[VN_SIZE] = "";
+					UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,isVirtual,pobj_c, (bStatic!=0), interfaceName );
+					if( pUserProc )
+					{
+						compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i );
+
+						//メソッドを追加
+						cp=i;	//エラー用
+						LexicalAnalyzer::AddMethod(pobj_c,
+							pUserProc,
+							accessibility,
+							bStatic,
+							isConst,
+							isAbstract,
+							isVirtual,
+							isOverride,
+							interfaceName,
+							false,
+							sub_address);
+					}
+
+					if( isAbstract ) continue;
+
+					for(;;i++){
+						if(basbuf[i]=='\0'){
+							i--;
+							break;
+						}
+						if(basbuf[i-1]!='*'&&
+							basbuf[i]==1&&(
+							basbuf[i+1]==ESC_SUB||
+							basbuf[i+1]==ESC_FUNCTION||
+							basbuf[i+1]==ESC_MACRO||
+							basbuf[i+1]==ESC_TYPE||
+							basbuf[i+1]==ESC_CLASS||
+							basbuf[i+1]==ESC_INTERFACE||
+							basbuf[i+1]==ESC_ENUM)){
+							GetDefaultNameFromES(i3,temporary);
+							compiler.errorMessenger.Output(22,temporary,i);
+						}
+						if(basbuf[i]==1&&basbuf[i+1]==GetEndXXXCommand((char)i3)){
+							i+=2;
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// 呼び出し元でコンパイル中のクラスポインタを元に戻す
+	compiler.pCompilingClass = pBackCompilingClass;
+
+	// 名前空間を元に戻す
+	compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = backupNamespaceScopes;
+
+	// インポートされた名前空間を元に戻す
+	compiler.GetNamespaceSupporter().GetImportedNamespaces() = backupImportedNamespaces;
+}
+
+void LexicalAnalyzer::LookaheadClass( const char *className, Classes &classes )
+{
+	pobj_LoopRefCheck->add( className );
+	GetClass_recur( className, classes );
+	pobj_LoopRefCheck->del( className );
+}
+
+bool LexicalAnalyzer::LoopRefCheck( const CClass &objClass )
+{
+	if( pobj_LoopRefCheck->check( objClass ) )
+	{
+		return false;
+	}
+
+	return true;
+}
+
+void LexicalAnalyzer::CollectClasses( const char *source, Classes &classes ){
+	//ループ継承チェック用のクラス
+	pobj_LoopRefCheck=new CLoopRefCheck();
+
+	//クラスを取得
+	GetClass_recur( 0, classes );
+
+	delete pobj_LoopRefCheck;
+	pobj_LoopRefCheck=0;
+
+	// イテレータの準備
+	classes.Iterator_Init();
+}
