Index: /trunk/abdev/BasicCompiler_Common/BasicCompiler.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/BasicCompiler.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/BasicCompiler.cpp	(revision 147)
@@ -0,0 +1,847 @@
+#include "BasicCompiler.h"
+
+#if defined HeapAlloc
+#define MEM_MAX 65536
+LPVOID pCheckMem[MEM_MAX];
+int now;
+#undef HeapAlloc
+#undef HeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hf,DWORD dwFlags,DWORD dwBytes){
+	LPVOID ret;
+	ret=HeapAlloc(hf,dwFlags,dwBytes);
+	pCheckMem[now]=ret;
+
+	//この部分にnowのチェックを挿入
+
+	now++;
+	if(now>=MEM_MAX){
+		MessageBox(0,"pCheckMemの最大値を超えました","Check - BasicCompiler.exe",0);
+	}
+	return ret;
+}
+LPVOID CheckHeapReAlloc(HANDLE hf,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes){
+	int i;
+	LPVOID ret;
+	for(i=0;;i++){
+		if(lpMem==pCheckMem[i]) break;
+		if(i>=MEM_MAX){
+			MessageBox(0,"エラー","Check - BasicCompiler.exe",0);
+			break;
+		}
+	}
+	ret=HeapReAlloc(hf,dwFlags,lpMem,dwBytes);
+	pCheckMem[i]=ret;
+	return ret;
+}
+void HeapDefaultFree(LPVOID lpMem){
+	int i;
+	for(i=0;;i++){
+		if(lpMem==pCheckMem[i]) break;
+		if(i>=MEM_MAX||lpMem==0){
+			MessageBox(0,"エラー","Check - BasicCompiler.exe",0);
+			break;
+		}
+	}
+	pCheckMem[i]=0;
+	HeapFree(hHeap,0,lpMem);
+}
+void CheckHeapCheck(){
+	int i,i2;
+	char temp[100];
+	temp[0]=0;
+	for(i=0,i2=0;i<MEM_MAX;i++){
+		if(pCheckMem[i]){
+			sprintf(temp+lstrlen(temp),"%d\r\n",i);
+			i2++;
+			if(i2==10){
+				lstrcat(temp,"これ以上の未解放が確認されています");
+				break;
+			}
+		}
+	}
+	if(temp[0]) MessageBox(0,temp,"Check - BasicCompiler.exe",0);
+}
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+#else
+void HeapDefaultFree(LPVOID lpMem){
+	HeapFree(hHeap,0,lpMem);
+}
+#endif
+
+void ts(int i){
+	char temporary[255];
+	sprintf(temporary,"0x%08x",i);
+	MessageBox(0,temporary,"TestMessage",0);
+}
+void ts(int i,int i2){
+	char temporary[255];
+	sprintf(temporary,"0x%08x\r\n0x%08x",i,i2);
+	MessageBox(0,temporary,"TestMessage",0);
+}
+void ts(char *msg){
+	MessageBox(0,msg,"TestMessage",0);
+}
+void ts(char *msg,char *title){
+	MessageBox(0,msg,title,0);
+}
+
+void epi_check(){
+	//この部分にobpのチェックを挿入
+	//※例 … epi=0x41999  →  obp>=0x0999
+
+	extern int obp;
+	if(obp==1115){
+	}
+}
+
+void GetRelationalPath(char *path,char *dir){
+	//相対パスを取得
+	int i,i2,i3,i4,i5;
+	char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH],temp4[MAX_PATH];
+
+	//ドライブ名をチェック
+	_splitpath(path,temporary,0,0,0);
+	_splitpath(dir,temp2,0,0,0);
+	if(lstrcmpi(temporary,temp2)!=0) return;
+
+	_splitpath(path,0,temporary,0,0);
+	_splitpath(dir,0,temp2,0,0);
+	i=1;i2=1;
+	while(1){
+		i4=i;
+		if(temporary[i-1]=='\\'&&temporary[i]){	//path側
+			for(i3=0;;i++,i3++){
+				if(temporary[i]=='\\'){
+					temp3[i3]=0;
+					i++;
+					break;
+				}
+				temp3[i3]=temporary[i];
+			}
+		}
+		else temp3[0]=0;
+
+		i5=i2;
+		if(temp2[i2-1]=='\\'&&temp2[i2]){		//dir側
+			for(i3=0;;i2++,i3++){
+				if(temp2[i2]=='\\'){
+					temp4[i3]=0;
+					i2++;
+					break;
+				}
+				temp4[i3]=temp2[i2];
+			}
+		}
+		else temp4[0]=0;
+
+		if(temp3[0]=='\0'&&temp4[0]=='\0'){
+			lstrcpy(temp3,".\\");
+			break;
+		}
+
+		if(lstrcmpi(temp3,temp4)!=0){
+			for(i3=0;;i5++){
+				if(temp2[i5]=='\0') break;
+				if(temp2[i5]=='\\') i3++;
+			}
+			if(i3==0) lstrcpy(temp3,".\\");
+			else{
+				temp3[0]=0;
+				for(i2=0;i2<i3;i2++) lstrcat(temp3,"..\\");
+			}
+			lstrcat(temp3,temporary+i4);
+			break;
+		}
+	}
+	_splitpath(path,0,0,temporary,temp2);
+	lstrcat(temp3,temporary);
+	lstrcat(temp3,temp2);
+	lstrcpy(path,temp3);
+}
+void GetFullPath(char *path,char *dir){
+	int i,i2,i3,i4;
+	char temporary[MAX_PATH];
+
+	// '/'→'\'
+	for( i=0;path[i];i++ ){
+		if( path[i] == '/' ){
+			path[i]='\\';
+		}
+	}
+
+	if(strstr(path,":")||strstr(path,"\\\\")) return;
+
+	i=0;i2=0;
+	while(1){
+		if(path[i]=='.'&&path[i+1]=='\\') i+=2;
+		if(path[i]=='.'&&path[i+1]=='.'&&path[i+2]=='\\'){
+			i2++;
+			i+=3;
+		}
+		else break;
+	}
+
+	i3=lstrlen(dir);i4=0;
+	while(i4<i2){
+		for(i3--;;i3--){
+			if(dir[i3-1]=='\\'){
+				i4++;
+				break;
+			}
+		}
+	}
+	memcpy(temporary,dir,i3);
+	temporary[i3]=0;
+	lstrcat(temporary,path+i);
+	lstrcpy(path,temporary);
+}
+
+void ShowErrorLine(int LineNum,char *FileName){
+	HANDLE hFile;
+	DWORD dw;
+	char temporary[MAX_PATH];
+
+	if(LineNum==-1) return;
+
+	if(IsWindow(hOwnerEditor)){
+		if(FileName){
+
+			while(!IsFile(FileName)){
+				char temp2[MAX_PATH],temp3[MAX_PATH];
+				_splitpath(FileName,NULL,NULL,temp2,temp3);
+				lstrcat(temp2,temp3);
+
+				sprintf(temporary,"\"%s\" が見つかりません。格納されているディレクトリを指定してください。",temp2);
+				if(!GetFolder(hOwnerEditor,temp3,temporary)) return;
+
+				if(temp3[lstrlen(temp3)-1]!='\\') lstrcat(temp3,"\\");
+
+				sprintf(FileName,"%s%s",temp3,temp2);
+			}
+
+			sprintf(temporary,"%spgm.tmp",BasicSystemDir);
+			hFile=CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
+			WriteFile(hFile,FileName,lstrlen(FileName),&dw,NULL);
+			CloseHandle(hFile);
+
+			SendMessage(hOwnerEditor,WM_SHOWERROR,LineNum,0);
+		}
+	}
+}
+
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen){
+	OPENFILENAME ofstr;
+	filename[0]=0;
+	ofstr.lStructSize=sizeof(OPENFILENAME);
+	ofstr.hwndOwner=hwnd;
+	ofstr.hInstance=0;
+	ofstr.lpstrFilter=Filter;
+	ofstr.lpstrCustomFilter=NULL;
+	ofstr.nMaxCustFilter=0;
+	ofstr.nFilterIndex=1;
+	ofstr.lpstrFile=filename;
+	ofstr.nMaxFile=MAX_PATH;
+	ofstr.lpstrFileTitle=NULL;
+	ofstr.nMaxFileTitle=0;
+	ofstr.lpstrInitialDir=0;
+	ofstr.lpstrTitle=Title;
+	ofstr.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
+	ofstr.nFileOffset=0;
+	ofstr.nFileExtension=0;
+	ofstr.lpstrDefExt="*";
+	ofstr.lCustData=NULL;
+	ofstr.lpfnHook=NULL;
+	ofstr.lpTemplateName=NULL;
+	if(bOpen){
+		if(!GetOpenFileName(&ofstr)) return FALSE;
+	}
+	else{
+		if(!GetSaveFileName(&ofstr)) return FALSE;
+	}
+	return TRUE;
+}
+
+LRESULT CALLBACK ErrorListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,pos;
+	int StartPos,EndPos;
+
+	switch(message){
+		case WM_CHAR:
+			if(GetKeyState(VK_CONTROL)&0x8000){
+				//アクセラレータキーの場合を考慮
+				break;
+			}
+			return 0;
+		case WM_LBUTTONDBLCLK:
+			SendMessage(hwnd,EM_GETSEL,(WPARAM)&pos,0);
+			i=(int)SendMessage(hwnd,EM_LINEFROMCHAR,pos,0);
+			ShowErrorLine(pErrorInfo[i].line,pErrorInfo[i].FileName);
+
+			StartPos=(int)SendMessage(hwnd,EM_LINEINDEX,i,0);
+			EndPos=StartPos+(int)SendMessage(hwnd,EM_LINELENGTH,pos,0);
+			SendMessage(hwnd,EM_SETSEL,StartPos,EndPos);
+			return 0;
+	}
+	return CallWindowProc(OldErrorListProc,hwnd,message,wParam,lParam);
+}
+LRESULT CALLBACK DebugListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_CHAR:
+			if(GetKeyState(VK_CONTROL)&0x8000){
+				//アクセラレータキーの場合を考慮
+				break;
+			}
+			return 0;
+	}
+	return CallWindowProc(OldDebugListProc,hwnd,message,wParam,lParam);
+}
+void MakeMessageText(char *buffer,char *msg,int flag){
+	extern BOOL bDll;
+	char temporary[MAX_PATH];
+	if(bClipCompileView){
+		//ProjectView埋め込みがたインターフェイスのとき
+
+		//生成するファイルの相対パスを取得
+		lstrcpy(temporary,OutputFileName);
+		GetRelationalPath(temporary,BasicCurDir);
+
+		//////////
+		// 合成
+
+#if defined(JPN)
+		//日本語
+		if(flag==0){
+			if(bDll) sprintf(buffer,"DLLファイル \"%s\"     [ %s ]",temporary,msg);
+			else sprintf(buffer,"実行ファイル \"%s\"     [ %s ]",temporary,msg);
+		}
+		if(flag==1) sprintf(buffer,"\"%s\" を生成しています     [ %s ]",temporary,msg);
+		if(flag==2) lstrcpy(buffer,msg);
+#else
+		//英語
+		if(flag==0){
+			if(bDll) sprintf(buffer,"DLL file \"%s\"     [ %s ]",temporary,msg);
+			else sprintf(buffer,"Execution file \"%s\"     [ %s ]",temporary,msg);
+		}
+		if(flag==1) sprintf(buffer,"Creating \"%s\"     [ %s ]",temporary,msg);
+		if(flag==2) lstrcpy(buffer,msg);
+#endif
+	}
+	else{
+		//通常ダイアログのとき
+		lstrcpy(buffer,msg);
+	}
+}
+
+void SetPosCenter(HWND hwnd){
+	RECT OwnerRect,rect;
+	int x,y;
+
+	if(IsWindow(hOwnerEditor)) GetWindowRect(hOwnerEditor,&OwnerRect);
+	else{
+		OwnerRect.left=0;
+		OwnerRect.top=0;
+		OwnerRect.right=ScreenX;
+		OwnerRect.bottom=ScreenY;
+	}
+	GetWindowRect(hwnd,&rect);
+
+	x=((OwnerRect.right-OwnerRect.left)-(rect.right-rect.left))/2+OwnerRect.left;
+	y=((OwnerRect.bottom-OwnerRect.top)-(rect.bottom-rect.top))/2+OwnerRect.top;
+	SetWindowPos(hwnd,0,x,y,0,0,SWP_NOSIZE);
+}
+BOOL CALLBACK DlgCompile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hDebugProcess;
+	char temporary[MAX_PATH];
+	DWORD dw;
+	RECT rect;
+	POINT pos;
+	SIZE size;
+	static POINT pos_List,pos_Progress;
+	static int height_Progress;
+
+	switch(message){
+		case WM_INITDIALOG:
+			pos=pobj_nv->MainDlgPos;
+			GetWindowRect(hwnd,&rect);
+			size.cx=rect.right-rect.left;
+			size.cy=rect.bottom-rect.top;
+			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+			lstrcpy(temporary,OutputFileName);
+			GetRelationalPath(temporary,BasicCurDir);
+			SetDlgItemText(hwnd,IDC_EXEPATH,temporary);
+
+			//"エラー無し"
+			SetDlgItemText(hwnd,IDC_ERRORLIST,STRING_NOERROR);
+
+			//"デバッグ情報無し"
+			SetDlgItemText(hwnd,IDC_DEBUGLIST,STRING_NODEBUGMSG);
+
+			//リストボックスの初期位置
+			GetWindowRect(GetDlgItem(hwnd,IDC_ERRORLIST),&rect);
+			pos_List.x=rect.left;
+			pos_List.y=rect.top;
+			ScreenToClient(hwnd,&pos_List);
+
+			//プログレスバーの初期位置と高さ
+			GetWindowRect(GetDlgItem(hwnd,IDC_PROGRESS),&rect);
+			pos_Progress.x=rect.left;
+			pos_Progress.y=rect.top;
+			ScreenToClient(hwnd,&pos_Progress);
+			height_Progress=rect.bottom-rect.top;
+
+			//バージョン表記
+			sprintf(temporary,"Version %d.%02d.%02d %s",MAJOR_VER,MINOR_VER,REVISION_VER,VER_INFO);
+			SetDlgItemText(hwnd,IDC_STATIC_VERSION,temporary);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDOK,temporary,MAX_PATH);
+
+					//STRING_COMPILE = "コンパイル"
+					if(lstrcmp(temporary,STRING_COMPILE)==0){
+						GetDlgItemText(hwnd,IDC_EXEPATH,OutputFileName,MAX_PATH);
+						GetFullPath(OutputFileName,BasicCurDir);
+						CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MainThread,0,0,&dw);
+					}
+
+					//STRING_STOP = "中断"
+					else if(lstrcmp(temporary,STRING_STOP)==0){
+						if(hDebugProcess){
+							//デバッグ中のとき
+
+							//プロセスを終了
+							TerminateProcess(hDebugProcess,0);
+							hDebugProcess=0;
+
+							//デバッグダイアログを終了
+							if(hDebugWnd){
+								DestroyWindow(hDebugWnd);
+							}
+						}
+						else{
+							//コンパイル中のとき
+							bStopCompile=1;
+
+							/* メインスレッドで「閉じる」ボタンに変更することで、
+								コンパイルを中断中の早いタイミングでも終了することが可能 */
+							//"閉じる"
+							SetDlgItemText(hwnd,IDOK,STRING_CLOSE);
+						}
+					}
+
+					else{
+						SetFocus(hOwnerEditor);
+						DestroyWindow(hwnd);
+					}
+					return 1;
+				case IDCANCEL:
+					//×ボタン用
+
+					if(hDebugProcess){
+						//デバッグ中のとき
+
+						//プロセスを終了
+						TerminateProcess(hDebugProcess,0);
+						hDebugProcess=0;
+
+						//デバッグダイアログを終了
+						if(hDebugWnd){
+							DestroyWindow(hDebugWnd);
+						}
+					}
+
+					SetFocus(hOwnerEditor);
+					DestroyWindow(hwnd);
+					return 1;
+				case IDC_SHOWERROR:
+					ShowWindow(GetDlgItem(hwnd,IDC_ERRORLIST),SW_SHOW);
+					ShowWindow(GetDlgItem(hwnd,IDC_DEBUGLIST),SW_HIDE);
+					return 1;
+				case IDC_SHOWDEBUG:
+					ShowWindow(GetDlgItem(hwnd,IDC_ERRORLIST),SW_HIDE);
+					ShowWindow(GetDlgItem(hwnd,IDC_DEBUGLIST),SW_SHOW);
+					return 1;
+			}
+			break;
+		case WM_SHOWVARLIST:
+			if(bClipCompileView){
+				//埋め込み表示
+				CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_DEBUGGER),hOwnerEditor,(DLGPROC)DlgDebugger,lParam);
+				ShowWindow(hDebugWnd,SW_SHOW);
+
+				SendMessage(hOwnerEditor,WM_SETDEBUGGERVIEW,0,(LPARAM)hDebugWnd);
+			}
+			else{
+				//ポップアップ表示
+				CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_VARLIST),hOwnerEditor,(DLGPROC)DlgVarList,lParam);
+				SetForegroundWindow(hDebugWnd);
+			}
+			return 1;
+		case WM_SIZE:
+			if(bClipCompileView){
+				//エラーリストの位置
+				MoveWindow(GetDlgItem(hwnd,IDC_ERRORLIST),
+					pos_List.x,
+					pos_List.y,
+					LOWORD(lParam)-pos_List.x,
+					HIWORD(lParam)-pos_List.y,
+					1);
+
+				//デバッグリストの位置
+				MoveWindow(GetDlgItem(hwnd,IDC_DEBUGLIST),
+					pos_List.x,
+					pos_List.y,
+					LOWORD(lParam)-pos_List.x,
+					HIWORD(lParam)-pos_List.y,
+					1);
+
+				//プログレスバーの位置
+				MoveWindow(GetDlgItem(hwnd,IDC_PROGRESS),
+					pos_Progress.x,
+					pos_Progress.y,
+					LOWORD(lParam)-pos_Progress.x,
+					height_Progress,
+					1);
+			}
+			return 1;
+		case WM_DESTROY:
+			GetWindowRect(hwnd,&rect);
+
+			if(!bClipCompileView){
+				pobj_nv->MainDlgPos.x=rect.left;
+				pobj_nv->MainDlgPos.y=rect.top;
+			}
+
+			PostQuitMessage(0);
+			return 1;
+
+
+
+		///////////////////////
+		// デバッグコマンド
+		///////////////////////
+
+		case WM_DEBUG_STOP:
+			Debugger_Stop();
+			return 1;
+		case WM_DEBUG_PAUSE:
+			Debugger_Pause();
+			return 1;
+
+
+		case WM_CLOSE_DEBUGGER:
+			if(hDebugWnd){
+				DestroyWindow(hDebugWnd);
+			}
+			return 1;
+	}
+	return 0;
+}
+
+int PASCAL WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd){
+	int i,i2;
+	char temporary[1024],temp2[MAX_PATH];
+
+	//MessageBox(0,"starting compiler/debugger","ActiveBasic",MB_OK);
+	trace( "Start ActiveBasic Compiler!" );
+
+	//コモンコントロールを初期化
+	InitCommonControls();
+
+	hHeap=GetProcessHeap();
+	ScreenX=GetSystemMetrics(SM_CXSCREEN);
+	ScreenY=GetSystemMetrics(SM_CYSCREEN);
+
+	hInst=hThisInst;
+
+	GetModuleFileName(hInst,temporary,MAX_PATH);
+	_splitpath(temporary,BasicSystemDir,temp2,NULL,NULL);
+	lstrcat(BasicSystemDir,temp2);
+
+	//不揮発性データを取得
+	pobj_nv=new CNonVolatile;
+	pobj_nv->load();
+
+	//ソースファイル名を取得
+	i=0;
+	if(lpCmdLine[0]!='/'){
+		if(lpCmdLine[0]=='\"'){
+			for(i=1,i2=0;;i++,i2++){
+				if(lpCmdLine[i]=='\"'){
+					SourceFileName[i2]=0;
+					break;
+				}
+				SourceFileName[i2]=lpCmdLine[i];
+				if(lpCmdLine[i]=='\0') break;
+			}
+			i++;
+			while(lpCmdLine[i]==' ') i++;
+		}
+		else{
+			for(i=0;;i++){
+				if(lpCmdLine[i]==' '){
+					SourceFileName[i]=0;
+					break;
+				}
+				SourceFileName[i]=lpCmdLine[i];
+				if(lpCmdLine[i]=='\0') break;
+			}
+			while(lpCmdLine[i]==' ') i++;
+		}
+	}
+
+	BOOL bFromEditor=0;
+	bDll=0;
+	OutputFileName[0]=0;
+	if(lpCmdLine[i]&&lpCmdLine[i]!='/'){
+		if(lpCmdLine[i]=='\"'){
+			for(i++,i2=0;;i++,i2++){
+				if(lpCmdLine[i]=='\"'){
+					OutputFileName[i2]=0;
+					break;
+				}
+				OutputFileName[i2]=lpCmdLine[i];
+				if(lpCmdLine[i]=='\0') break;
+			}
+			i++;
+			while(lpCmdLine[i]==' ') i++;
+		}
+		else{
+			for(i2=0;;i++,i2++){
+				if(lpCmdLine[i]==' '){
+					OutputFileName[i2]=0;
+					break;
+				}
+				OutputFileName[i2]=lpCmdLine[i];
+				if(lpCmdLine[i]=='\0') break;
+			}
+			while(lpCmdLine[i]==' ') i++;
+		}
+	}
+
+	KillSpaces(lpCmdLine+i,temporary);
+	i=0;
+	while(temporary[i]=='/'){
+		for(i++,i2=0;;i++,i2++){
+			if(temporary[i]=='/'){
+				temp2[i2]=0;
+				break;
+			}
+			if(temporary[i]==':'){
+				temp2[i2]=0;
+				break;
+			}
+			temp2[i2]=temporary[i];
+			if(temporary[i]=='\0') break;
+		}
+
+		char temp3[MAX_PATH];
+		if(temporary[i]==':'){
+			i++;
+			if(temporary[i]=='\"'){
+				for(i++,i2=0;;i++,i2++){
+					if(temporary[i]=='\"'){
+						temp3[i2]=0;
+						RemoveStringQuotes(temp3);
+						i++;
+						break;
+					}
+					temp3[i2]=temporary[i];
+					if(temporary[i]=='\0') break;
+				}
+			}
+			else{
+				for(i2=0;;i++,i2++){
+					if(temporary[i]=='/'){
+						temp3[i2]=0;
+						break;
+					}
+					if(temporary[i]==':'){
+						temp3[i2]=0;
+						break;
+					}
+					temp3[i2]=temporary[i];
+					if(temporary[i]=='\0') break;
+				}
+			}
+		}
+		else temp3[0]=0;
+
+
+		/////////////////////////
+		// コマンドラインを調査
+		/////////////////////////
+
+		//ウィンドウハンドル
+		if(lstrcmp(temp2,"wnd")==0){
+			bFromEditor=1;
+
+			if(temp3[0]) sscanf(temp3,"%08x",&hOwnerEditor);
+		}
+
+		//デバッグコンパイル
+		else if(lstrcmp(temp2,"debug")==0) bDebugCompile=1;
+
+		//デバッグ実行
+		else if(lstrcmp(temp2,"run")==0) bDebugRun=1;
+
+		//デバッグ実行（アタッチする）
+		else if(lstrcmp(temp2,"attach")==0){
+			bDebugRun=1;
+			bAttach=1;
+
+			if(temp3[0]) sscanf(temp3,"%08x",&dwAttachProcessId);
+		}
+
+		//DLL生成
+		else if(lstrcmp(temp2,"dll")==0) bDll=1;
+
+		//Unicode
+		else if( lstrcmp( temp2, "unicode" ) ==0 ){
+			isUnicode = true;
+			typeOfPtrChar = MAKE_PTR_TYPE(DEF_WORD,1);
+			typeOfPtrUChar = MAKE_PTR_TYPE(DEF_WORD,1);
+		}
+
+		//埋め込み型コンパイラビュー
+		else if(lstrcmp(temp2,"clip_compile_view")==0) bClipCompileView=1;
+
+		//インクルードディレクトリ
+		else if(lstrcmp(temp2,"include_dir")==0){
+			lstrcpy(szIncludeDir,temp3);
+		}
+	}
+
+	//ソースファイル名が与えられなかったとき
+	if(SourceFileName[0]=='\0'){
+		if(!GetFilePathDialog(0,SourceFileName,BasicFileFilter,"コンパイルするファイルを指定して下さい",1))
+			return 0;
+	}
+
+	//出力ファイル名が与えられなかったとき
+	if(OutputFileName[0]=='\0'){
+		_splitpath(SourceFileName,OutputFileName,temporary,temp2,0);
+		lstrcat(OutputFileName,temporary);
+		lstrcat(OutputFileName,temp2);
+		if(bDebugCompile||bDebugRun) lstrcat(OutputFileName,"_debug.exe");
+		else lstrcat(OutputFileName,".exe");
+	}
+
+	//インクルードディレクトリが指定されなかったとき
+	if(szIncludeDir[0]=='\0'){
+		lstrcpy(szIncludeDir,".\\Include\\");
+	}
+
+	//インクルードディレクトリを絶対パスに変更
+	GetFullPath(szIncludeDir,BasicSystemDir);
+
+	if(bDll){
+		//DLLファイル名を取得
+		_splitpath(OutputFileName,NULL,NULL,szDllName,temporary);
+		lstrcat(szDllName,temporary);
+	}
+
+	if(bDebugRun){
+		//コマンドライン、DLLの実行可能アプリケーションを取得
+		HANDLE hFile;
+		DWORD dwAccessBytes;
+		sprintf(temporary,"%spgm.tmp",BasicSystemDir);
+		hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile!=INVALID_HANDLE_VALUE){
+			ReadFile(hFile,temporary,MAX_PATH,&dwAccessBytes,NULL);
+			CloseHandle(hFile);
+			temporary[dwAccessBytes]=0;
+		}
+		else temporary[0]=0;
+
+		for(i=0;;i++){
+			if(temporary[i]=='\r'&&temporary[i+1]=='\n'||temporary[i]=='\0'){
+				szDebugExeForDll[i]=0;
+				break;
+			}
+			szDebugExeForDll[i]=temporary[i];
+		}
+		if(temporary[i]){
+			lstrcpy(szDebugCmdLine,temporary+i+2);
+		}
+	}
+
+	_splitpath(SourceFileName,BasicCurDir,temporary,NULL,NULL);
+	lstrcat(BasicCurDir,temporary);
+
+	//エラーリスト情報を初期化
+	pErrorInfo=(ERRORINFO *)HeapAlloc(hHeap,0,1);
+	ErrorNum=0;
+	CompileMsgNum=0;
+	WarningNum=0;
+	bError=0;
+
+	if(bClipCompileView){
+		//ProjectEditor埋め込み型インターフェイス
+		hMainDlg=CreateDialog(hInst,MAKEINTRESOURCE(IDD_CLIPMAIN),hOwnerEditor,(DLGPROC)DlgCompile);
+		ShowWindow(hMainDlg,SW_SHOW);
+		SendMessage(hOwnerEditor,WM_SETCOMPILEVIEW,0,(LPARAM)hMainDlg);
+
+		//プログレスバーの色をセットする
+		PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETBARCOLOR,0,RGB(255,220,192));
+		PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETBKCOLOR,0,RGB(255,255,255));
+	}
+	else{
+		//通常ダイアログインターフェイス
+		hMainDlg=CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),hOwnerEditor,(DLGPROC)DlgCompile);
+
+#ifdef _DEBUG
+		// VC++によるデバッグの場合は画面を出さない
+		// ※別スレッドのウィンドウ ループとの不整合性がデッドロックを生む場合がある（特にステップ実行時など）
+		PostMessage( hMainDlg, WM_COMMAND, IDOK, 0 );
+#else
+		ShowWindow(hMainDlg,SW_SHOW);
+#endif
+	}
+	SendDlgItemMessage(hMainDlg,IDC_SHOWERROR,BM_SETCHECK,BST_CHECKED,0);
+
+	//エラーリストをサブクラス化
+	OldErrorListProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hMainDlg,IDC_ERRORLIST),GWLP_WNDPROC);
+	SetWindowLongPtr(GetDlgItem(hMainDlg,IDC_ERRORLIST),GWLP_WNDPROC,(LONG_PTR)ErrorListProc);
+
+	//デバッグリストをサブクラス化
+	OldDebugListProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hMainDlg,IDC_DEBUGLIST),GWLP_WNDPROC);
+	SetWindowLongPtr(GetDlgItem(hMainDlg,IDC_DEBUGLIST),GWLP_WNDPROC,(LONG_PTR)DebugListProc);
+
+	if(bFromEditor) SendMessage(hMainDlg,WM_COMMAND,IDOK,0);
+
+	MSG msg;
+	while(GetMessage(&msg,0,0,0)){
+		if(IsDialogMessage(hMainDlg,&msg)) continue;
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	}
+
+	//エラーリスト情報を解放
+	for(i=0;i<ErrorNum;i++){
+		if(pErrorInfo[i].FileName) HeapDefaultFree(pErrorInfo[i].FileName);
+	}
+	HeapDefaultFree(pErrorInfo);
+
+	//不揮発性データを保存
+	pobj_nv->save();
+	delete pobj_nv;
+	pobj_nv=0;
+
+#if defined HeapAlloc
+	CheckHeapCheck();
+#endif
+
+	if(bClipCompileView){
+		SendMessage(hOwnerEditor,WM_DESTROYCOMPILEVIEW,0,0);
+	}
+
+	trace("Complete ActiveBasic Compiler!");
+
+
+	return 0;
+}
Index: /trunk/abdev/BasicCompiler_Common/BasicCompiler.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/BasicCompiler.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/BasicCompiler.h	(revision 147)
@@ -0,0 +1,92 @@
+#include "../BasicCompiler_Common/common.h"
+
+LPSTR BasicFileFilter="プログラム ファイル(*.ab;*.bas;*.abp;*.sbp)\0*.ab;*.bas;*.abp;*sbp\0テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0";
+LPSTR ExeFileFilter="実行可能ファイル(*.exe)\0*.exe\0すべてのファイル(*.*)\0*\0\0";
+
+HINSTANCE hInst;
+HWND hOwnerEditor;
+HWND hMainDlg;
+HWND hDebugWnd;
+HANDLE hHeap;
+int ScreenX,ScreenY;
+WNDPROC OldErrorListProc,OldDebugListProc;
+WNDPROC OldThreadComboProc;
+WNDPROC OldProcComboProc;
+unsigned short TypeOfSubSystem;
+BOOL bClipCompileView;
+
+//不揮発性データ（レジストリに保存される）
+CNonVolatile *pobj_nv;
+
+//プログラム情報
+BOOL bStrict;
+DWORD ImageBase;
+INCLUDEFILEINFO IncludeFileInfo;
+GlobalProc **ppSubHash;
+int SubNum;
+char **ppMacroNames;
+int MacroNum;
+DllProc **ppDeclareHash;
+CONSTINFO **ppConstHash;
+
+ERRORINFO *pErrorInfo;
+int ErrorNum;
+int CompileMsgNum;
+int WarningNum;
+BOOL bError;
+char **SynonymErrorWords;
+int SynonymErrorNum;
+BOOL bStopCompile;
+
+//リソース情報
+char ResourceFileName[MAX_PATH];
+RESOURCEDATAINFO *pCursorResourceInfo;
+int CursorResourceNum;
+RESOURCEDATAINFO *pBitmapResourceInfo;
+int BitmapResourceNum;
+RESOURCEDATAINFO *pIconResourceInfo;
+int IconResourceNum;
+char szManifestPath[MAX_PATH];
+int XPManiResourceNum;
+
+//デバッグ
+BOOL bDebugCompile=0;
+BOOL bDebugRun=0;
+BOOL bAttach=0;
+DWORD dwAttachProcessId;
+BOOL bDebugSupportProc;
+BOOL bSystemProc;
+DWORD dwStepRun;
+double width_ratio_VarList=0.3;
+HWND hDebuggerToolbar;
+char szDebugCmdLine[1024];
+char szDebugExeForDll[1024];
+
+//デバッグ用行番号情報
+LINEINFO *pLineInfo;
+int MaxLineInfoNum;
+
+//ウォッチリスト
+int width_WatchColumn_Expression=200;
+int width_WatchColumn_Value=400;
+
+
+//関数ポインタのベース タイプ インデックス（左辺の関数ポインタのパラメータを参考に、オーバーロードを解決）
+LONG_PTR ProcPtr_BaseIndex;
+
+
+int cp;
+
+BOOL bDll;
+bool isUnicode = false;
+int typeOfPtrChar = MAKE_PTR_TYPE(DEF_SBYTE,1);
+int typeOfPtrUChar = MAKE_PTR_TYPE(DEF_BYTE,1);
+
+char *basbuf;
+
+char BasicSystemDir[MAX_PATH];	//BasicCompiler.exeが存在するディレクトリ
+char BasicCurDir[MAX_PATH];		//コンパイルするファイルが存在するディレクトリ
+char SourceFileName[MAX_PATH];
+char OutputFileName[MAX_PATH];
+char szDllName[MAX_PATH];
+char szIncludeDir[MAX_PATH]="";
Index: /trunk/abdev/BasicCompiler_Common/BasicFixed.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/BasicFixed.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/BasicFixed.h	(revision 147)
@@ -0,0 +1,199 @@
+//BasicFixed.h
+
+
+////////////////
+// マシンタイプ
+////////////////
+
+#define MACHINE_X86		1
+#define MACHINE_AMD64	2
+
+
+////////////////
+// 型
+////////////////
+
+#define DEF_NON			-1
+
+/* basic\command.sbp内の "_System_Type_***" 定数と同期が必要 */
+#define FLAG_PTR		0x80000000
+#define FLAG_CAST		0x40000000
+
+//整数型
+#define DEF_SBYTE		0x00000001
+#define DEF_BYTE		0x00000002
+#define DEF_INTEGER		0x00000003
+#define DEF_WORD		0x00000004
+#define DEF_LONG		0x00000005
+#define DEF_DWORD		0x00000006
+#define DEF_INT64		0x00000007
+#define DEF_QWORD		0x00000008
+
+//実数型
+#define DEF_SINGLE		0x00000009
+#define DEF_DOUBLE		0x0000000A
+
+//文字型
+#define DEF_CHAR		0x0000000B
+
+//bool型
+#define DEF_BOOLEAN		0x0000000C
+
+//文字列型
+#define DEF_STRING		0x0000000D
+
+//ポインタ型
+#define DEF_PTR_VOID	0x0000000E
+#define DEF_PTR_PROC	0x0000000F
+
+//特殊型
+#define DEF_ANY			0x00000015
+#define DEF_OBJECT		0x00000016
+#define DEF_STRUCT		0x00000017
+#define DEF_ELLIPSE		0x00000018
+
+//ポインタ型
+#define MASK_PTR		0x0000ff00
+#define MASK_NATURAL	0x000000ff
+
+#define PTR_LEVEL(t)	(((t)&MASK_PTR)>>8)
+#define NATURAL_TYPE(t)	((t)&MASK_NATURAL)
+#define MAKE_PTR_TYPE(t,p)	((t)|((p)<<8))
+#define PTR_LEVEL_UP(t)		t = MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)+1)
+#define PTR_LEVEL_DOWN(t)	t = MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)-1)
+
+#define DEF_PTR_OBJECT	MAKE_PTR_TYPE(DEF_OBJECT,1)
+#define DEF_PTR_STRUCT	MAKE_PTR_TYPE(DEF_STRUCT,1)
+
+
+
+//NumOpe関数の結果がリテラル値の場合、その値の補助情報がindexに格納される
+#define LITERAL_NULL		-2
+#define LITERAL_M128_0		-3
+#define LITERAL_0_255		-4
+#define LITERAL_M32768_0	-5
+#define LITERAL_0_65535		-6
+#define LITERAL_OTHER_MINUS	-7
+#define LITERAL_OTHER_PLUS	-8
+
+#define LITERAL_STRING		-9
+
+#define IS_LITERAL(x) (x<=LITERAL_NULL&&x!=LITERAL_STRING)
+#define IS_MINUS_LITERAL(x) (x==LITERAL_M128_0||x==LITERAL_M32768_0||x==LITERAL_OTHER_MINUS)
+#define IS_POSITIVE_LITERAL(x) (x==LITERAL_NULL||x==LITERAL_0_255||x==LITERAL_0_65535||x==LITERAL_OTHER_PLUS)
+
+//////////////////////////////////////
+/* 演算子（優先順位が関係している） */
+//////////////////////////////////////
+
+//論理演算子
+#define CALC_XOR			3	// Xor
+#define CALC_OR				6	// Or
+#define CALC_AND			9	// And
+#define CALC_NOT			12	// Not
+
+//比較演算子
+#define CALC_PE				21	// <=
+#define CALC_QE				22	// >=
+#define CALC_NOTEQUAL		23	// <>
+#define CALC_EQUAL			24	// =
+#define CALC_P				25	// <
+#define CALC_Q				26	// >
+
+//算術演算子
+#define CALC_SHL			31	//<<
+#define CALC_SHR			32	//>>
+#define CALC_ADDITION		41	// +
+#define CALC_SUBTRACTION	42	// -
+#define CALC_STRPLUS		43	// &
+#define CALC_MOD			51	// Mod
+#define CALC_PRODUCT		61	// *
+#define CALC_QUOTIENT		62	// /
+#define CALC_INTQUOTIENT	63	//整数除算
+#define CALC_AS				71	// As
+#define CALC_BYVAL			72	// ByVal
+#define CALC_MINUSMARK		81	// -x
+#define CALC_POWER			91	// ^
+
+//代入演算子
+#define CALC_SUBSITUATION	200
+
+//添え字演算子
+#define CALC_ARRAY_GET		201
+#define CALC_ARRAY_SET		202
+
+
+//////////////////////////////////////////////////////////////////////
+// エスケープシーケンス用のバイトコードは0xA0～0xCFの範囲も利用できる
+//////////////////////////////////////////////////////////////////////
+
+//以下制御用エスケープシーケンス
+#define ESC_MOD				'1'		// MOD 演算子
+#define ESC_AND				'&'		// AND 演算子
+#define ESC_OR				'3'		// OR 演算子
+#define ESC_XOR				'4'		// XOR 演算子
+#define ESC_NOT				'5'		// NOT 演算子
+#define ESC_AS				'6'		// AS（区切り文字）
+#define ESC_THEN			2		// Then
+#define ESC_ELSE			3		// Else
+#define ESC_IF				'A'		// If
+#define ESC_ELSEIF			'B'		// ElseIf
+#define ESC_ENDIF			'C'		// End If
+#define ESC_DEF				'D'		// Def
+#define ESC_DECLARE			'E'		// Declare
+#define ESC_SUB				'F'		// Sub
+#define ESC_ENDSUB			'G'		// End Sub
+#define ESC_EXITSUB			'H'		// Exit Sub
+#define ESC_FUNCTION		'I'		// Function
+#define ESC_ENDFUNCTION		'J'		// End Function
+#define ESC_EXITFUNCTION	'K'		// Exit Function
+#define ESC_BYVAL			'L'		// ByVal
+#define ESC_BYREF			'M'		// ByRef
+#define ESC_TYPE			'N'		// Type
+#define ESC_ENDTYPE			'O'		// End Type
+#define ESC_EXITFOR			'P'		// Exit For
+#define ESC_EXITWHILE		'Q'		// Exit Wend
+#define ESC_EXITDO			'R'		// Exit Do
+#define ESC_SELECTCASE		'S'		// Select Case
+#define ESC_CASE			'T'		// Case
+#define ESC_CASEELSE		'U'		// Case Else
+#define ESC_ENDSELECT		'V'		// End Select
+#define ESC_CONST			'W'		// Const
+#define ESC_WITH			'X'		// With
+#define ESC_ENDWITH			'Y'		// End With
+#define ESC_CDECL			'Z'		// cdecl規約
+#define ESC_MACRO			'a'		// Macro
+#define ESC_ENDMACRO		'b'		// End Macro
+#define ESC_EXITMACRO		'c'		// Exit Macro
+#define ESC_EXPORT			'd'		// Export
+#define ESC_CONTINUE		'e'		// Continue
+#define ESC_PSMEM			'f'		// "->" Member of Pointer Struct（構造体ポインタのメンバ参照）
+#define ESC_STATIC			'g'		// Static
+#define ESC_TYPEDEF			'h'		// TypeDef
+#define ESC_TRY				'i'		// Try
+#define ESC_CATCH			'j'		// Catch
+#define ESC_FINALLY			'k'		// Finally
+#define ESC_THROW			'l'		// Throw
+#define ESC_ENDTRY			'm'		// End Try
+#define ESC_NAMESPACE		'o'		// Namespace
+#define ESC_ENDNAMESPACE	'p'		// End Namespace
+#define ESC_IMPORTS			'q'		// Imports
+#define ESC_CLEARNAMESPACEIMPORTED 'r'	// _ClearNamespaceImported
+//EXEファイル用制御エスケープシーケンス
+#define ESC_USING			's'		// Print命令語のUsing
+#define ESC_FOR				't'		// Open命令語のFor
+#define ESC_LINENUM			'u'		// 行番号を示す
+
+//オブジェクト指向エスケープシーケンス
+#define ESC_CLASS			(char)0xA0
+#define ESC_ENDCLASS		(char)0xA1
+#define ESC_ABSTRACT		(char)0xA2
+#define ESC_VIRTUAL			(char)0xA3
+#define ESC_OVERRIDE		(char)0xA4
+#define ESC_INHERITS		(char)0xA5
+#define ESC_ENUM			(char)0xA6
+#define ESC_ENDENUM			(char)0xA7
+#define ESC_NEW				(char)0xA8
+#define ESC_INTERFACE		(char)0xA9
+#define ESC_ENDINTERFACE	(char)0xAA
+#define ESC_OPERATOR		(char)0xAB
Index: /trunk/abdev/BasicCompiler_Common/BreakPoint.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/BreakPoint.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/BreakPoint.cpp	(revision 147)
@@ -0,0 +1,192 @@
+#include "common.h"
+
+//////////////////////////
+// ブレークポイント
+//////////////////////////
+
+CDBBreakPoint *pobj_DBBreakPoint;
+
+CFileBreakPoint::CFileBreakPoint(char *lpszFileName,int iLineNum){
+	this->lpszFileName=(char *)HeapAlloc(hHeap,0,lstrlen(lpszFileName)+1);
+	lstrcpy(this->lpszFileName,lpszFileName);
+
+	piLine=(int *)HeapAlloc(hHeap,0,sizeof(int));
+	piLine[0]=iLineNum;
+	num=1;
+}
+CFileBreakPoint::~CFileBreakPoint(){
+	HeapDefaultFree(lpszFileName);
+	HeapDefaultFree(piLine);
+}
+void CFileBreakPoint::add(int iLineNum){
+	piLine=(int *)HeapReAlloc(hHeap,0,piLine,(num+1)*sizeof(int));
+	piLine[num]=iLineNum;
+	num++;
+}
+void CFileBreakPoint::remove(int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(iLineNum==piLine[i]) break;
+	}
+	if(i==num) return;
+
+	num--;
+	for(;i<num;i++){
+		piLine[i]=piLine[i+1];
+	}
+}
+
+void CFileBreakPoint::update(char *OpBuffer){
+	extern INCLUDEFILEINFO IncludeFileInfo;
+
+	int FileNum;
+	for(FileNum=0;FileNum<IncludeFileInfo.FilesNum;FileNum++){
+		if(lstrcmpi(IncludeFileInfo.ppFileNames[FileNum],lpszFileName)==0) break;
+	}
+	if(FileNum==IncludeFileInfo.FilesNum) return;
+
+	int i;
+	for(i=0;;i++){
+		if(IncludeFileInfo.LineOfFile[i]==FileNum||
+			IncludeFileInfo.LineOfFile[i]==-1) break;
+	}
+	if(IncludeFileInfo.LineOfFile[i]==-1) return;
+
+	int FileBaseLine;
+	FileBaseLine=i;
+
+	int i2,nCount=0;
+	for(i2=0;;i2++){
+		if(IncludeFileInfo.LineOfFile[FileBaseLine+i2]==-1){
+			//ソースコードの終端行
+			break;
+		}
+
+		if(i2==piLine[nCount]){
+			extern int MaxLineInfoNum;
+			extern LINEINFO *pLineInfo;
+
+loop:
+			int tempCp;
+			tempCp=GetCpFromLine(FileBaseLine+i2);
+
+			int i3;
+			for(i3=0;i3<MaxLineInfoNum-1;i3++){
+				if(pLineInfo[i3].TopCp==tempCp) break;
+			}
+			if(i3==MaxLineInfoNum-1){
+				i2--;
+				goto loop;
+			}
+
+			OpBuffer[pLineInfo[i3].TopObp]=(char)0xCC;
+
+			nCount++;
+			if(nCount>=num) break;
+		}
+	}
+}
+
+
+CDBBreakPoint::CDBBreakPoint(){
+	ppItem=(CFileBreakPoint **)HeapAlloc(hHeap,0,1);
+	num=0;
+
+
+	HANDLE hFile;
+	char temporary[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	if(temporary[lstrlen(temporary)-1]!='\\') lstrcat(temporary,"\\");
+	lstrcat(temporary,"ab_breakpoint.tmp");
+
+	//未完成
+	sprintf(temporary,"%sab_breakpoint.tmp",BasicSystemDir);
+
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,65535);
+
+	hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile!=INVALID_HANDLE_VALUE){
+		DWORD dwAccBytes;
+		ReadFile(hFile,buffer,MAX_PATH,&dwAccBytes,NULL);
+		CloseHandle(hFile);
+		buffer[dwAccBytes]=0;
+	}
+	else buffer[0]=0;
+
+	int i=0,i2;
+	char szFilePath[MAX_PATH];
+	while(buffer[i]){
+		//ファイルパス
+		i=GetOneParameter(buffer,i,szFilePath);
+		RemoveStringQuotes(szFilePath);
+
+		while(buffer[i]!='\n'&&buffer[i]!='\0'){
+			//行番号
+			i=GetOneParameter(buffer,i,temporary);
+			i2=atoi(temporary);
+
+			insert(szFilePath,i2);
+		}
+
+		while(buffer[i]=='\n') i++;
+
+		if(buffer[i]=='\0') break;
+	}
+
+	HeapDefaultFree(buffer);
+}
+CDBBreakPoint::~CDBBreakPoint(){
+	int i;
+	for(i=0;i<num;i++){
+		delete ppItem[i];
+	}
+	HeapDefaultFree(ppItem);
+}
+void CDBBreakPoint::insert(char *lpszFileName,int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(ppItem[i]->lpszFileName,lpszFileName)==0){
+			ppItem[i]->add(iLineNum);
+			return;
+		}
+	}
+
+	if(i==num){
+		ppItem=(CFileBreakPoint **)HeapReAlloc(hHeap,0,ppItem,(num+1)*sizeof(CFileBreakPoint *));
+		ppItem[num]=new CFileBreakPoint(lpszFileName,iLineNum);
+		num++;
+	}
+}
+void CDBBreakPoint::remove(char *lpszFileName,int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(lpszFileName,ppItem[i]->lpszFileName)==0){
+			ppItem[i]->remove(iLineNum);
+			break;
+		}
+	}
+	if(i==num) return;
+
+	if(ppItem[i]->num==0){
+		delete ppItem[i];
+
+		num--;
+		for(;i<num;i++){
+			ppItem[i]=ppItem[i+1];
+		}
+	}
+}
+
+char *CDBBreakPoint::update(char *OpBuffer,int SizeOf_CodeSection){
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,SizeOf_CodeSection);
+	memcpy(buffer,OpBuffer,SizeOf_CodeSection);
+
+	int i;
+	for(i=0;i<num;i++){
+		ppItem[i]->update(buffer);
+	}
+
+	return buffer;
+}
Index: /trunk/abdev/BasicCompiler_Common/BreakPoint.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/BreakPoint.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/BreakPoint.h	(revision 147)
@@ -0,0 +1,34 @@
+
+
+class CFileBreakPoint{
+public:
+	char *lpszFileName;
+
+	int *piLine;
+	int num;
+
+	CFileBreakPoint(char *lpszFileName,int iLineNum);
+	~CFileBreakPoint();
+
+	void add(int iLineNum);
+	void remove(int iLineNum);
+
+	void update(char *OpBuffer);
+};
+
+class CDBBreakPoint{
+	CFileBreakPoint **ppItem;
+	int num;
+
+public:
+	CDBBreakPoint();
+	~CDBBreakPoint();
+
+	void insert(char *lpszFileName,int iLineNum);
+	void remove(char *lpszFileName,int iLineNum);
+
+	char *update(char *OpBuffer,int SizeOf_CodeSection);
+};
+
+
+extern CDBBreakPoint *pobj_DBBreakPoint;
Index: /trunk/abdev/BasicCompiler_Common/CDebugThreadInfo.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/CDebugThreadInfo.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/CDebugThreadInfo.cpp	(revision 147)
@@ -0,0 +1,109 @@
+#include "common.h"
+
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+
+extern HANDLE hDebugProcess;
+
+CDebugThreadInfo *pobj_dti;
+
+CDebugThreadInfo::CDebugThreadInfo(){
+	memset(this,0,sizeof(CDebugThreadInfo));
+}
+CDebugThreadInfo::~CDebugThreadInfo(){
+	Free();
+}
+
+BOOL CDebugThreadInfo::Reflesh(int ThreadNum){
+	Free();
+
+	ULONG_PTR lpData;
+	ULONG_PTR lpAccBytes;
+
+	DWORD dwRWSectionPos;
+	dwRWSectionPos=pobj_DBDebugSection->ppobj_ds[0]->dwImageBase+
+						pobj_DBDebugSection->ppobj_ds[0]->dwRVA_RWSection;
+
+	ReadProcessMemory(hDebugProcess,
+		(void *)(dwRWSectionPos+sizeof(DWORD)*256+ThreadNum*sizeof(DWORD)),
+		&iProcLevel,
+		sizeof(DWORD),&lpAccBytes);
+	lplpObp=(ULONG_PTR *)HeapAlloc(hHeap,0,(iProcLevel+1)*sizeof(ULONG_PTR));
+	lplpSpBase=(ULONG_PTR *)HeapAlloc(hHeap,0,(iProcLevel+1)*sizeof(ULONG_PTR));
+	lpdwCp=(DWORD *)HeapAlloc(hHeap,0,(iProcLevel+1)*sizeof(DWORD));
+
+	//lplpObp
+	ReadProcessMemory(hDebugProcess,
+		(void *)(dwRWSectionPos+sizeof(DWORD)*256*2+ThreadNum*sizeof(DWORD)),
+		&lpData,
+		sizeof(ULONG_PTR),&lpAccBytes);
+	ReadProcessMemory(hDebugProcess,
+		(void *)lpData,
+		lplpObp,
+		(iProcLevel+1)*sizeof(ULONG_PTR),&lpAccBytes);
+
+	//lplpSpBase
+	ReadProcessMemory(hDebugProcess,
+		(void *)(dwRWSectionPos+sizeof(DWORD)*256*2+sizeof(ULONG_PTR)*256+ThreadNum*sizeof(ULONG_PTR)),
+		&lpData,
+		sizeof(ULONG_PTR),&lpAccBytes);
+	ReadProcessMemory(hDebugProcess,
+		(void *)lpData,
+		lplpSpBase,
+		(iProcLevel+1)*sizeof(ULONG_PTR),&lpAccBytes);
+
+	//現在の実行情報
+	CONTEXT Context;
+	Context.ContextFlags=CONTEXT_CONTROL;
+	GetThreadContext(array_hDebugThread[ThreadNum],&Context);
+
+
+	//マッピングされているモジュールのイメージベースを取得
+	HMODULE array_hModule[1024];
+	DWORD cbReturned;
+	if(!EnumProcessModules( hDebugProcess, array_hModule, sizeof(HMODULE)*1024, &cbReturned )) return 0;
+
+	int i;
+	HMODULE hTargetModule=0;
+	for(i=0;i<(int)(cbReturned/sizeof(HMODULE));i++){
+		if((LONG_PTR)array_hModule[i]<=(LONG_PTR)EIP_RIP(Context)){
+			if(hTargetModule<array_hModule[i]) hTargetModule=array_hModule[i];
+		}
+	}
+
+	extern DWORD ImageBase;
+	if((HMODULE)(ULONG_PTR)ImageBase!=hTargetModule){
+		for(i=0;i<pobj_DBDebugSection->num;i++){
+			if((HMODULE)(ULONG_PTR)pobj_DBDebugSection->ppobj_ds[i]->dwImageBase==hTargetModule){
+				pobj_DBDebugSection->choice(i);
+				break;
+			}
+		}
+	}
+
+
+
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+
+	if(ImageBase+MemPos_CodeSection <= EIP_RIP(Context) &&
+		EIP_RIP(Context) < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+		lplpObp[iProcLevel]=EIP_RIP(Context);
+		lplpSpBase[iProcLevel]=SP_BASE(Context);
+	}
+	//else API関数内などの場合は既存の lplpObp[iProcLevel] を利用する
+
+	return 1;
+}
+
+void CDebugThreadInfo::Free(void){
+	if(lplpObp){
+		HeapDefaultFree(lplpObp);
+		HeapDefaultFree(lplpSpBase);
+		HeapDefaultFree(lpdwCp);
+	}
+
+	memset(this,0,sizeof(CDebugThreadInfo));
+}
Index: /trunk/abdev/BasicCompiler_Common/Class.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Class.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Class.cpp	(revision 147)
@@ -0,0 +1,1693 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+CDBClass *pobj_DBClass;
+
+const CClass *pobj_CompilingClass;
+
+CMember *pCompilingMethod;
+
+
+CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name )
+	: isReady( false )
+	, Prototype( namespaceScopes, name )
+	, importedNamespaces( importedNamespaces )
+	, ConstructorMemberSubIndex( 0 )
+	, DestructorMemberSubIndex( 0 )
+	, classType( Class )
+	, pobj_InheritsClass( NULL )
+	, vtblNum( 0 )
+	, iAlign( 0 )
+	, vtbl_offset( -1 )
+	, isCompilingConstructor( false )
+	, isCompilingDestructor( false )
+	, pobj_NextClass( NULL )
+{
+}
+CClass::~CClass(){
+	// 動的メンバ
+	foreach( CMember *member, dynamicMembers ){
+		delete member;
+	}
+
+	// 静的メンバ
+	foreach( CMember *member, staticMembers ){
+		delete member;
+	}
+}
+
+bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const
+{
+	BOOST_FOREACH( const InheritedInterface &objInterface, interfaces ){
+		if( pInterfaceClass == &objInterface.GetInterfaceClass() ){
+			return true;
+		}
+	}
+	return false;
+}
+
+bool CClass::IsClass() const
+{
+	return classType == CClass::Class;
+}
+bool CClass::IsInterface() const
+{
+	return classType == CClass::Interface;
+}
+bool CClass::IsEnum() const
+{
+	return classType == CClass::Enum;
+}
+bool CClass::IsDelegate() const
+{
+	return classType == CClass::Delegate;
+}
+bool CClass::IsStructure() const
+{
+	return classType == CClass::Structure;
+}
+
+bool CClass::Inherits( 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];
+		}
+
+		//継承元クラスを取得
+		const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
+		if( !pInheritsClass ){
+			SetError(106,temporary,nowLine);
+			return false;
+		}
+
+		if( pInheritsClass->IsInterface() ){
+			// インターフェイスはあとで継承する
+		}
+		else if( pInheritsClass->IsClass() ){
+			// クラスを継承する
+			isInheritsClass = true;
+
+			if( !InheritsClass( *pInheritsClass, nowLine ) ){
+				return false;
+			}
+		}
+		else{
+			SetError(135,NULL,nowLine);
+			return false;
+		}
+
+		if( inheritNames[i] == '\0' ){
+			break;
+		}
+		i++;
+	}
+
+	if( !isInheritsClass ){
+		// クラスを一つも継承していないとき
+		const CClass *pObjectClass = pobj_DBClass->Find("Object");
+		if( !pObjectClass ){
+			SetError(106,"Object",i);
+			return false;
+		}
+
+		if( !InheritsClass( *pObjectClass, nowLine ) ){
+			return false;
+		}
+	}
+
+	i=0;
+	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];
+		}
+
+		//継承元クラスを取得
+		const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
+		if( !pInheritsClass ){
+			SetError(106,temporary,nowLine);
+			return false;
+		}
+
+		if( pInheritsClass->IsInterface() ){
+			// インターフェイスを継承する
+			if( !InheritsInterface( *pInheritsClass, nowLine ) ){
+				return false;
+			}
+		}
+		else if( pInheritsClass->IsClass() ){
+			// クラスはさっき継承した
+		}
+		else{
+			SetError(135,NULL,nowLine);
+			return false;
+		}
+
+		if( inheritNames[i] == '\0' ){
+			break;
+		}
+		i++;
+	}
+
+	return true;
+}
+bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){
+
+	//ループ継承でないかをチェック
+	if(pobj_LoopRefCheck->check(inheritsClass)){
+		SetError(123,inheritsClass.GetName(),nowLine);
+		return false;
+	}
+
+	if( !inheritsClass.IsReady() ){
+		//継承先が読み取られていないとき
+		pobj_LoopRefCheck->add(this->GetName().c_str());
+		pobj_DBClass->GetClass_recur(inheritsClass.GetName().c_str());
+		pobj_LoopRefCheck->del(this->GetName().c_str());
+	}
+
+	//メンバをコピー
+	BOOST_FOREACH( CMember *inheritsClassDynamicMember, inheritsClass.dynamicMembers ){
+		CMember *pMember = new CMember( *inheritsClassDynamicMember );
+
+		// アクセシビリティ
+		if( inheritsClassDynamicMember->IsPrivate() ){
+			pMember->SetAccessibility( Prototype::None );
+		}
+		else{
+			pMember->SetAccessibility( inheritsClassDynamicMember->GetAccessibility() );
+		}
+
+		dynamicMembers.push_back( pMember );
+	}
+
+	//メソッドをコピー
+	foreach( const CMethod *pBaseMethod, inheritsClass.methods ){
+		CMethod *pMethod = new DynamicMethod( *pBaseMethod );
+
+		// アクセシビリティ
+		if(pBaseMethod->GetAccessibility() == Prototype::Private){
+			pMethod->SetAccessibility( Prototype::None );
+		}
+		else{
+			pMethod->SetAccessibility( pBaseMethod->GetAccessibility() );
+		}
+
+		//pobj_Inherits
+		// ※継承元のClassIndexをセット（入れ子継承を考慮する）
+		if(pBaseMethod->GetInheritsClassPtr()==0){
+			pMethod->SetInheritsClassPtr( &inheritsClass );
+		}
+		else{
+			pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );
+		}
+
+		methods.push_back( pMethod );
+	}
+
+	//仮想関数の数
+	AddVtblNum( inheritsClass.GetVtblNum() );
+
+	//継承先のクラスをメンバとして保持する
+	pobj_InheritsClass = &inheritsClass;
+
+	return true;
+}
+bool CClass::InheritsInterface( const CClass &inheritsInterface, int nowLine ){
+
+	//ループ継承でないかをチェック
+	if(pobj_LoopRefCheck->check(inheritsInterface)){
+		SetError(123,inheritsInterface.GetName(),nowLine);
+		return false;
+	}
+
+	if( !inheritsInterface.IsReady() ){
+		//継承先が読み取られていないとき
+		pobj_LoopRefCheck->add(this->GetName().c_str());
+		pobj_DBClass->GetClass_recur(inheritsInterface.GetName().c_str());
+		pobj_LoopRefCheck->del(this->GetName().c_str());
+	}
+
+	//メソッドをコピー
+	foreach( const CMethod *pBaseMethod, inheritsInterface.methods ){
+		CMethod *pMethod = new DynamicMethod( *pBaseMethod );
+
+		// アクセシビリティ
+		if(pBaseMethod->GetAccessibility() == Prototype::Private){
+			pMethod->SetAccessibility( Prototype::None );
+		}
+		else{
+			pMethod->SetAccessibility( pBaseMethod->GetAccessibility() );
+		}
+
+		//pobj_Inherits
+		// ※継承元のClassIndexをセット（入れ子継承を考慮する）
+		if(pBaseMethod->GetInheritsClassPtr()==0){
+			pMethod->SetInheritsClassPtr( &inheritsInterface );
+		}
+		else{
+			pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );
+		}
+
+		methods.push_back( pMethod );
+	}
+
+	interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtblNum ) );
+
+	//仮想関数の数
+	AddVtblNum( inheritsInterface.GetVtblNum() );
+
+	return true;
+}
+void CClass::AddMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer ){
+	CMember *pMember = new CMember( this, accessibility, isConst, isRef, buffer );
+	dynamicMembers.push_back( pMember );
+}
+void CClass::AddStaticMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine ){
+	CMember *pMember = new CMember( this, accessibility, isConst, isRef, buffer, nowLine );
+	staticMembers.push_back( pMember );
+}
+BOOL CClass::DupliCheckAll(const char *name){
+	//重複チェック
+
+	//メンバ
+	if(DupliCheckMember(name)) return 1;
+
+	//メソッド
+	foreach( const CMethod *pMethod, methods ){
+		if( lstrcmp( name, pMethod->pUserProc->GetName().c_str() ) == 0 ){
+			return 1;
+		}
+	}
+
+	return 0;
+}
+BOOL CClass::DupliCheckMember(const char *name){
+	//重複チェック
+
+	// 動的メンバ
+	BOOST_FOREACH( CMember *pMember, dynamicMembers ){
+		if( GetName() == pMember->GetName() ){
+			return 1;
+		}
+	}
+
+	// 静的メンバ
+	foreach( CMember *pMember, staticMembers ){
+		if( GetName() == pMember->GetName() ){
+			return 1;
+		}
+	}
+
+	return 0;
+}
+
+//デフォルト コンストラクタ メソッドを取得
+const CMethod *CClass::GetConstructorMethod() const
+{
+	if( ConstructorMemberSubIndex == -1 ) return NULL;
+	return methods[ConstructorMemberSubIndex];
+}
+
+//デストラクタ メソッドを取得
+const CMethod *CClass::GetDestructorMethod() const
+{
+	if( DestructorMemberSubIndex == -1 ) return NULL;
+	return methods[DestructorMemberSubIndex];
+}
+
+//サイズを取得
+int CClass::GetSize() const
+{
+	return GetMemberOffset( NULL, NULL );
+}
+
+//メンバのオフセットを取得
+int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const
+{
+	int i2;
+
+	//仮想関数が存在する場合は関数リストへのポインタのサイズを追加
+	int offset = IsExistVirtualFunctions() ? PTR_SIZE : 0;
+
+	int alignment;
+	if(iAlign) alignment=iAlign;
+	else alignment=1;
+
+	int iMaxAlign=0;
+	int i = -1;
+	BOOST_FOREACH( CMember *pMember, dynamicMembers ){
+		i++;
+
+		i2 = pMember->GetType().GetSize();
+
+		//アラインメントを算出
+		int member_size;
+		if( pMember->GetType().IsStruct() ){
+			//メンバクラスのアラインメントを取得
+			member_size=pMember->GetType().GetClass().GetAlignment();
+		}
+		else{
+			//メンバサイズを取得
+			member_size=i2;
+		}
+		if(iMaxAlign<member_size) iMaxAlign=member_size;
+
+		//アラインメントを考慮
+		if(iAlign&&iAlign<member_size){
+			if(offset%alignment) offset+=alignment-(offset%alignment);
+		}
+		else{
+			if(alignment<member_size) alignment=member_size;
+
+			if(member_size==0){
+				//メンバを持たないクラス
+				//※何もしない（オフセットの計算をしない）
+			}
+			else{
+				if(offset%member_size) offset+=member_size-(offset%member_size);
+			}
+		}
+
+		if(memberName){
+			//メンバ指定がある場合は、オフセットを返す
+			if( pMember->GetName() == memberName ){
+				if(pMemberNum) *pMemberNum=i;
+				return offset;
+			}
+		}
+
+		//配列を考慮したメンバサイズを取得
+		member_size=i2 * JumpSubScripts(pMember->SubScripts);
+
+		//メンバサイズを加算
+		offset+= member_size;
+	}
+
+	if(iMaxAlign<alignment) alignment=iMaxAlign;
+
+	//アラインメントを考慮
+	if(alignment){
+		if(offset%alignment) offset+=alignment-(offset%alignment);
+	}
+
+	if(pMemberNum) *pMemberNum=i;
+	return offset;
+}
+
+int CClass::GetAlignment() const
+{
+	//仮想関数が存在する場合は関数リストへのポインタのサイズを追加
+	int alignment = IsExistVirtualFunctions() ? PTR_SIZE : 0;
+
+	BOOST_FOREACH( CMember *pMember, dynamicMembers ){
+		int member_size;
+		if(pMember->GetType().IsStruct()){
+			//メンバクラスのアラインメントを取得
+			member_size=pMember->GetType().GetClass().GetAlignment();
+		}
+		else{
+			//メンバサイズを取得
+			member_size = pMember->GetType().GetSize();
+		}
+
+		//アラインメントをセット
+		if(alignment<member_size) alignment=member_size;
+	}
+
+	if(alignment==0) return 0;
+
+	if(iAlign) alignment=iAlign;
+
+	return alignment;
+}
+
+
+
+int CClass::GetFuncNumInVtbl( const UserProc *pUserProc ) const
+{
+	int n = 0;
+	foreach( const CMethod *pMethod, methods ){
+		if( pMethod->pUserProc == pUserProc ) break;
+		if( pMethod->IsVirtual() ) n++;
+	}
+	return n;
+}
+LONG_PTR CClass::GetVtblGlobalOffset(void) const
+{
+
+	//既に存在する場合はそれを返す
+	if(vtbl_offset!=-1) return vtbl_offset;
+
+
+
+	//////////////////////////////////////
+	// 存在しないときは新たに生成する
+	//////////////////////////////////////
+
+	UserProc **ppsi;
+	ppsi=(UserProc **)HeapAlloc(hHeap,0,GetVtblNum()*sizeof(GlobalProc *));
+
+	//関数テーブルに値をセット
+	int i2 = 0;
+	foreach( const CMethod *pMethod, methods ){
+		if(pMethod->IsVirtual()){
+			pMethod->pUserProc->Using();
+
+			if(pMethod->IsAbstract()){
+				extern int cp;
+				SetError(300,NULL,cp);
+
+				ppsi[i2]=0;
+			}
+			else{
+				ppsi[i2]=pMethod->pUserProc;
+			}
+			i2++;
+		}
+	}
+
+	vtbl_offset=dataTable.AddBinary((void *)ppsi,GetVtblNum()*sizeof(LONG_PTR));
+
+	for( int i=0; i < GetVtblNum(); i++ ){
+		pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR));
+	}
+
+	HeapDefaultFree(ppsi);
+
+	return vtbl_offset;
+}
+void CClass::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
+	if(vtbl_offset==-1) return;
+
+	LONG_PTR *pVtbl;
+	pVtbl=(LONG_PTR *)((char *)dataTable.GetPtr()+vtbl_offset);
+
+	int i;
+	for(i=0;i<GetVtblNum();i++){
+		GlobalProc *pUserProc;
+		pUserProc=(GlobalProc *)pVtbl[i];
+		if(!pUserProc) continue;
+		pVtbl[i]=pUserProc->beginOpAddress+ImageBase+MemPos_CodeSection;
+	}
+}
+bool CClass::IsAbstract() const
+{
+	// 未実装(abstract)の仮想関数を持つ場合はtrueを返す
+
+	foreach( const CMethod *pMethod, methods ){
+		if(pMethod->IsVirtual()){
+			if(pMethod->IsAbstract()){
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
+// コンストラクタのコンパイルを開始
+void CClass::NotifyStartConstructorCompile() const
+{
+	isCompilingConstructor = true;
+}
+
+//コンストラクタのコンパイルを終了
+void CClass::NotifyFinishConstructorCompile() const
+{
+	isCompilingConstructor = false;
+}
+
+//コンストラクタをコンパイル中かどうかを判別
+bool CClass::IsCompilingConstructor() const
+{
+	return isCompilingConstructor;
+}
+
+//デストラクタのコンパイルを開始
+void CClass::NotifyStartDestructorCompile() const{
+	isCompilingDestructor = true;
+}
+
+//デストラクタのコンパイルを終了
+void CClass::NotifyFinishDestructorCompile() const{
+	isCompilingDestructor = false;
+}
+
+//デストラクタをコンパイル中かどうかを判別
+bool CClass::IsCompilingDestructor() const
+{
+	return isCompilingDestructor;
+}
+
+//自身の派生クラスかどうかを確認
+bool CClass::IsSubClass( const CClass *pClass ) const
+{
+	pClass = pClass->pobj_InheritsClass;
+	while( pClass ){
+		if( this == pClass ) return true;
+		pClass = pClass->pobj_InheritsClass;
+	}
+	return false;
+}
+
+//自身と等しいまたは派生クラスかどうかを確認
+bool CClass::IsEqualsOrSubClass( const CClass *pClass ) const
+{
+	if( IsEquals( pClass ) ) return true;
+	return IsSubClass( pClass );
+}
+
+// 自身と等しいまたは派生クラス、基底クラスかどうかを確認
+bool CClass::IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const
+{
+	if( IsEquals( &objClass ) ) return true;
+	if( IsSubClass( &objClass ) ) return true;
+	if( objClass.IsSubClass( this ) ) return true;
+	return false;
+}
+
+
+
+int CDBClass::hash(const char *name) const{
+	int key;
+
+	for(key=0;*name!='\0';name++){
+		key=((key<<8)+ *name )%MAX_CLASS_HASH;
+	}
+
+	return key;
+}
+
+void CDBClass::DestroyClass(CClass *pobj_c){
+	if(pobj_c->pobj_NextClass){
+		DestroyClass(pobj_c->pobj_NextClass);
+	}
+
+	delete pobj_c;
+}
+
+CDBClass::CDBClass():
+	pStringClass( NULL ),
+	pObjectClass( NULL ),
+	pCompilingClass( NULL ),
+	pCompilingMethod( NULL ),
+	ppobj_IteClass( NULL ),
+	iIteMaxNum( 0 ),
+	iIteNextNum( 0 )
+{
+	memset( pobj_ClassHash, 0, MAX_CLASS_HASH * sizeof(CClass *) );
+}
+CDBClass::~CDBClass(){
+	int i;
+	for(i=0;i<MAX_CLASS_HASH;i++){
+		if(pobj_ClassHash[i]) DestroyClass(pobj_ClassHash[i]);
+	}
+
+	if(ppobj_IteClass) HeapDefaultFree(ppobj_IteClass);
+}
+
+void CDBClass::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
+	int i;
+	for(i=0;i<MAX_CLASS_HASH;i++){
+		if(pobj_ClassHash[i]){
+			CClass *pobj_c;
+			pobj_c=pobj_ClassHash[i];
+			while(1){
+				pobj_c->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
+
+				if(pobj_c->pobj_NextClass==0) break;
+				pobj_c=pobj_c->pobj_NextClass;
+			}
+		}
+	}
+}
+
+const CClass *CDBClass::Find( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	int key;
+	key=hash(name.c_str());
+
+	if( namespaceScopes.size() == 0 && name == "Object" ){
+		return GetObjectClassPtr();
+	}
+	else if( namespaceScopes.size() == 0 && name == "String" ){
+		return GetStringClassPtr();
+	}
+
+	if(pobj_ClassHash[key]){
+		CClass *pobj_c;
+		pobj_c=pobj_ClassHash[key];
+		while(1){
+			if( pobj_c->IsEqualSymbol( namespaceScopes, name ) ){
+				//名前空間とクラス名が一致した
+				return pobj_c;
+			}
+
+			if(pobj_c->pobj_NextClass==0) break;
+			pobj_c=pobj_c->pobj_NextClass;
+		}
+	}
+
+	// TypeDefも見る
+	int index = Smoothie::Meta::typeDefs.GetIndex( namespaceScopes, name );
+	if( index != -1 ){
+		Type type = Smoothie::Meta::typeDefs[index].GetBaseType();
+		if( type.IsObject() ){
+			return &type.GetClass();
+		}
+	}
+
+	return NULL;
+}
+const CClass *CDBClass::Find( const string &fullName ) const
+{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	return Find( NamespaceScopes( AreaName ), NestName );
+}
+
+CClass *CDBClass::AddClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name,int nowLine){
+	//////////////////////////////////////////////////////////////////////////
+	// クラスを追加
+	// ※名前のみを登録。その他の情報はSetClassメソッドで！
+	//////////////////////////////////////////////////////////////////////////
+
+	CClass *pobj_c;
+	pobj_c=new CClass(namespaceScopes, importedNamespaces, name);
+
+	if(lstrcmp(name,"String")==0){
+		//Stringクラス
+		pStringClass=pobj_c;
+	}
+	if( lstrcmp( name, "Object" ) == 0 ){
+		pObjectClass = pobj_c;
+	}
+
+
+	/////////////////////////////////
+	// ハッシュデータに追加
+	/////////////////////////////////
+
+	int key;
+	key=hash(name);
+
+	if(pobj_ClassHash[key]){
+		CClass *pobj_c2;
+		pobj_c2=pobj_ClassHash[key];
+		while(1){
+			if( pobj_c2->IsEqualSymbol( namespaceScopes, name ) ){
+				//名前空間及びクラス名が重複した場合
+				SetError(15,name,nowLine);
+				return 0;
+			}
+
+			if(pobj_c2->pobj_NextClass==0) break;
+			pobj_c2=pobj_c2->pobj_NextClass;
+		}
+		pobj_c2->pobj_NextClass=pobj_c;
+	}
+	else{
+		pobj_ClassHash[key]=pobj_c;
+	}
+
+	return pobj_c;	
+}
+
+void CDBClass::InitNames(void){
+	extern char *basbuf;
+	int i, i2;
+	char temporary[VN_SIZE];
+
+	// Blittable型管理オブジェクトを初期化
+	Smoothie::Meta::blittableTypes.clear();
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	namespaceScopes.clear();
+
+	// Importsされた名前空間の管理
+	NamespaceScopesCollection &importedNamespaces = Smoothie::Temp::importedNamespaces;
+	importedNamespaces.clear();
+
+	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 ){
+				SetError(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];
+			}
+			importedNamespaces.Imports( temporary );
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
+			importedNamespaces.clear();
+			continue;
+		}
+
+		if(basbuf[i]==1&&(
+			basbuf[i+1]==ESC_CLASS||
+			basbuf[i+1]==ESC_TYPE||
+			basbuf[i+1]==ESC_INTERFACE
+			)){
+				int nowLine;
+				nowLine=i;
+
+				i+=2;
+				Type blittableType;
+				if(memicmp(basbuf+i,"Align(",6)==0){
+					//アラインメント修飾子
+					i+=6;
+					i=JumpStringInPare(basbuf,i)+1;
+				}
+				else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
+					// Blittable修飾子
+					i+=10;
+					i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
+					Type::StringToType( temporary, blittableType );
+				}
+
+				bool isEnum = false;
+				if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM ){
+					// 列挙型の場合
+					isEnum = true;
+
+					i+=2;
+				}
+
+				int i2;
+				char temporary[VN_SIZE];
+				for(i2=0;;i++,i2++){
+					if(!IsVariableChar(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+
+				//クラスを追加
+				CClass *pClass = pobj_DBClass->AddClass(namespaceScopes, importedNamespaces, temporary,nowLine);
+				if( pClass ){
+					if( basbuf[nowLine+1] == ESC_CLASS ){
+						if( isEnum ){
+							pClass->classType = CClass::Enum;
+						}
+						else{
+							pClass->classType = CClass::Class;
+						}
+					}
+					else if( basbuf[nowLine+1] == ESC_INTERFACE ){
+						pClass->classType = CClass::Interface;
+					}
+					else{
+						pClass->classType = CClass::Structure;
+					}
+				}
+
+				// Blittable型の場合
+				if( !blittableType.IsNull() ){
+					pClass->SetBlittableType( blittableType );
+
+					// Blittable型として登録
+					Smoothie::Meta::blittableTypes.push_back( BlittableType( blittableType, pClass ) );
+				}
+		}
+	}
+}
+
+
+void CDBClass::AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
+						 bool isVirtual, bool isOverride, char *buffer, int nowLine){
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	i=2;
+	for(i2=0;;i++,i2++){
+		if(buffer[i]=='('||buffer[i]=='\0'){
+			temporary[i2]=0;
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+
+	//関数ハッシュへ登録
+	GlobalProc *pUserProc;
+	pUserProc=AddSubData( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0) );
+	if(!pUserProc) return;
+
+
+	////////////////////////////////////////////////////////////
+	// コンストラクタ、デストラクタの場合の処理
+	////////////////////////////////////////////////////////////
+	BOOL fConstructor=0,bDestructor=0;
+
+	if(lstrcmp(temporary,pobj_c->GetName().c_str())==0){
+		//コンストラクタの場合
+
+		//標準コンストラクタ（引数なし）
+		if(pUserProc->Params().size()==0) fConstructor=1;
+
+		//強制的にConst修飾子をつける
+		isConst = true;
+	}
+	else if(temporary[0]=='~'){
+		//デストラクタの場合はその名前が正しいかチェックを行う
+		if(lstrcmp(temporary+1,pobj_c->GetName().c_str())!=0)
+			SetError(117,NULL,nowLine);
+		else
+			bDestructor=1;
+	}
+	if(fConstructor||bDestructor){
+		// コンストラクタ、デストラクタのアクセシビリティをチェック
+
+		//強制的にConst修飾子をつける
+		isConst = true;
+	}
+
+	if( fConstructor == 1 )
+		pobj_c->ConstructorMemberSubIndex = (int)pobj_c->methods.size();
+	else if( bDestructor )
+		pobj_c->DestructorMemberSubIndex = (int)pobj_c->methods.size();
+
+
+
+	//////////////////
+	// 重複チェック
+	//////////////////
+
+	if(pobj_c->DupliCheckMember(temporary)){
+		SetError(15,temporary,nowLine);
+		return;
+	}
+
+	//メソッド
+	foreach( const CMethod *pMethod, pobj_c->methods ){
+		//基底クラスと重複する場合はオーバーライドを行う
+		if( pMethod->GetInheritsClassPtr() ) continue;
+
+		if( pMethod->pUserProc->GetName() == temporary ){
+			if( pMethod->pUserProc->Params().Equals( pUserProc->Params() ) ){
+				//関数名、パラメータ属性が合致したとき
+				SetError(15,pUserProc->GetName().c_str(),nowLine);
+				return;
+			}
+		}
+	}
+
+	//仮想関数の場合
+	if( isAbstract ) pUserProc->CompleteCompile();
+
+	//メソッドのオーバーライド
+	foreach( CMethod *pMethod, pobj_c->methods ){
+		if( pMethod->pUserProc->GetName() == temporary ){
+			if( pMethod->pUserProc->Params().Equals( pUserProc->Params() ) ){
+
+				if(pMethod->IsVirtual()){
+					//メンバ関数を上書き
+					pMethod->pUserProc=pUserProc;
+					pMethod->Override();
+
+					if( !isOverride ){
+						SetError(127,NULL,nowLine);
+					}
+					if(pMethod->GetAccessibility() != accessibility ){
+						SetError(128,NULL,nowLine);
+					}
+
+					pUserProc->SetMethod( pMethod );
+					return;
+				}
+			}
+		}
+	}
+
+	if( isVirtual ){
+		pobj_c->AddVtblNum( 1 );
+	}
+
+	if( isOverride ){
+		SetError(12,"Override",nowLine);
+	}
+
+	if(bStatic){
+		pobj_c->staticMethods.AddStatic( pUserProc, accessibility );
+	}
+	else{
+		pobj_c->methods.Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);
+	}
+}
+
+BOOL CDBClass::MemberVar_LoopRefCheck(const CClass &objClass){
+	int i2,bRet=1;
+	BOOST_FOREACH( CMember *pMember, objClass.dynamicMembers ){
+		if(pMember->GetType().IsStruct()){
+			//循環参照でないかをチェック
+			if(pobj_LoopRefCheck->check(pMember->GetType().GetClass())){
+				extern int cp;
+				SetError(124,pMember->GetType().GetClass().GetName(),cp);
+				return 0;
+			}
+
+			pobj_LoopRefCheck->add(objClass.GetName().c_str());
+
+			i2=MemberVar_LoopRefCheck(pMember->GetType().GetClass());
+			if(bRet==1) bRet=i2;
+
+			pobj_LoopRefCheck->del(objClass.GetName().c_str());
+		}
+	}
+
+	return bRet;
+}
+
+void CDBClass::GetClass_recur(const char *lpszInheritsClass){
+	extern char *basbuf;
+	int i,i2,i3,sub_address,top_pos;
+	char temporary[8192];
+
+	// 名前空間管理
+	NamespaceScopes backupNamespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	namespaceScopes.clear();
+
+	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 ){
+				SetError(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+
+
+		if(basbuf[i]==1&&basbuf[i+1]==ESC_INTERFACE){
+			//////////////////////////
+			// インターフェイス
+			//////////////////////////
+
+			top_pos=i;
+
+			i+=2;
+
+			//インターフェイス名を取得
+			GetIdentifierToken( temporary, basbuf, i );
+
+			CClass *pobj_c = const_cast<CClass *>( pobj_DBClass->Find(namespaceScopes, temporary) );
+			if(!pobj_c) continue;
+
+			if(lpszInheritsClass){
+				if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
+					//継承先先読み用
+					continue;
+				}
+			}
+
+			if(pobj_c->IsReady()){
+				//既に先読みされているとき
+				continue;
+			}
+
+			pobj_c->Readed();
+
+			pobj_c->ConstructorMemberSubIndex=-1;
+			pobj_c->DestructorMemberSubIndex=-1;
+
+			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){
+					SetError(105,temporary,i);
+					goto Interface_InheritsError;
+				}
+
+				//継承元クラスを取得
+				const CClass *pInheritsClass = Find(temporary);
+				if( !pInheritsClass ){
+					SetError(106,temporary,i);
+					goto Interface_InheritsError;
+				}
+
+				//継承させる
+				if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){
+					goto Interface_InheritsError;
+				}
+			}
+			else{
+				//継承無し
+				pobj_c->pobj_InheritsClass=0;
+
+				//仮想関数の数を初期化
+				pobj_c->SetVtblNum( 0 );
+			}
+Interface_InheritsError:
+
+			//メンバ変数、関数を取得
+			while(1){
+				i++;
+
+				//エラー
+				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE||basbuf[i+1]==ESC_INTERFACE)){
+					SetError(22,"Interface",i);
+					i--;
+					break;
+				}
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
+					SetError(111,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--;
+						SetError(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
+					))){
+					SetError(1,NULL,i);
+					break;
+				}
+
+				//メンバ関数を追加
+				AddMethod(pobj_c,
+					Prototype::Public,	//Publicアクセス権
+					0,					//Static指定なし
+					false,				//Constではない
+					1,					//Abstract
+					1,					//Virtual
+					0,
+					temporary,
+					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(!(iAlign==1||iAlign==2||iAlign==4||iAlign==8||iAlign==16))
+					SetError(51,NULL,i);
+			}
+			else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
+				// Blittable修飾子
+				i+=10;
+				i=JumpStringInPare(basbuf,i)+1;
+			}
+
+			if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM ){
+				// 列挙型の場合
+				i+=2;
+			}
+
+			//クラス名を取得
+			GetIdentifierToken( temporary, basbuf, i );
+
+			CClass *pobj_c =  const_cast<CClass *>( pobj_DBClass->Find(namespaceScopes, temporary) );
+			if(!pobj_c) continue;
+
+			if(lpszInheritsClass){
+				if( pobj_c->GetName() != lpszInheritsClass ){
+					//継承先先読み用
+					continue;
+				}
+			}
+
+			if(pobj_c->IsReady()){
+				//既に先読みされているとき
+				continue;
+			}
+
+			pobj_c->iAlign=iAlign;
+
+			pobj_c->Readed();
+
+			pobj_c->ConstructorMemberSubIndex=-1;
+			pobj_c->DestructorMemberSubIndex=-1;
+
+			//アクセス制限の初期値をセット
+			Prototype::Accessibility accessibility;
+			if(dwClassType==ESC_CLASS){
+				accessibility = Prototype::Private;
+			}
+			else{
+				accessibility = Prototype::Public;
+			}
+
+			if( pobj_c->GetName() == "Object" || dwClassType == ESC_TYPE ){
+				// 継承無し
+				pobj_c->pobj_InheritsClass = NULL;
+
+				// 仮想関数の数を初期化
+				pobj_c->SetVtblNum( 0 );
+			}
+			else{
+				bool isInherits = false;
+				if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
+					//継承を行う場合
+					isInherits = true;
+
+					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){
+						SetError(105,temporary,i);
+						goto InheritsError;
+					}
+				}
+
+				if( !isInherits ){
+					//Objectを継承する
+					lstrcpy( temporary, "Object" );
+				}
+
+				pobj_c->Inherits( temporary, i );
+			}
+InheritsError:
+
+			//メンバとメソッドを取得
+			while(1){
+				i++;
+
+				//エラー
+				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
+					SetError(22,"Class",i);
+					i--;
+					break;
+				}
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
+					SetError(111,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)
+							SetError(22,"Class",top_pos);
+						else
+							SetError(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 );
+
+
+						if(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().IsStruct()){
+							if( !pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().GetClass().IsReady() ){
+								//参照先が読み取られていないとき
+								GetClass_recur(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().GetClass().GetName().c_str());
+							}
+						}
+
+
+						if(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().IsStruct()){
+							//循環参照のチェック
+							pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
+							if(!MemberVar_LoopRefCheck(pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().GetClass())){
+								//エラー回避
+								pobj_c->dynamicMembers[pobj_c->dynamicMembers.size()-1]->GetType().SetBasicType( DEF_PTR_VOID );
+							}
+							pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
+						}
+					}
+				}
+				else{
+					//メソッドを追加
+					cp=i;	//エラー用
+					AddMethod(pobj_c,
+						accessibility,
+						bStatic,
+						isConst,
+						isAbstract,
+						isVirtual,
+						isOverride,
+						temporary,
+						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);
+							SetError(22,temporary,i);
+						}
+						if(basbuf[i]==1&&basbuf[i+1]==GetEndXXXCommand((char)i3)){
+							i+=2;
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+
+
+	// 名前空間を元に戻す
+	Smoothie::Lexical::liveingNamespaceScopes = backupNamespaceScopes;
+}
+
+void CDBClass::GetAllClassInfo(void){
+	//ループ継承チェック用のクラス
+	pobj_LoopRefCheck=new CLoopRefCheck();
+
+	//クラスを取得
+	GetClass_recur(0);
+
+	delete pobj_LoopRefCheck;
+	pobj_LoopRefCheck=0;
+
+	// イテレータ用のデータを作る
+	pobj_DBClass->Iterator_Init();
+}
+
+void CDBClass::Compile_System_InitializeUserTypes(){
+	char temporary[VN_SIZE];
+
+	////////////////////////////////////////////////////////////////////
+	// クラス登録
+	////////////////////////////////////////////////////////////////////
+
+	// イテレータをリセット
+	Iterator_Reset();
+
+	while( Iterator_HasNext() ){
+		const CClass &objClass = *Iterator_GetNext();
+
+		if( !objClass.IsUsing() ){
+			// 未使用のクラスは無視する
+			continue;
+		}
+
+		char referenceOffsetsBuffer[1024] = "";
+		int numOfReference = 0;
+		BOOST_FOREACH( CMember *pMember, objClass.dynamicMembers ){
+			if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() ){
+				if( referenceOffsetsBuffer[0] ){
+					lstrcat( referenceOffsetsBuffer, "," );
+				}
+
+				sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ),
+					"%d",
+					objClass.GetMemberOffset( pMember->GetName().c_str() ) );
+
+				numOfReference++;
+			}
+		}
+
+		sprintf( temporary
+			, "Add(%c%c_System_TypeForClass(\"%s\",\"%s\",[%s],%d))"
+			, 1
+			, ESC_NEW
+			, ""							// 名前空間 (TODO: 実装)
+			, objClass.GetName().c_str()	// クラス名
+			, referenceOffsetsBuffer		// 参照メンバオフセット配列
+			, numOfReference				// 参照メンバの個数
+			);
+
+		// コンパイル
+		ChangeOpcode( temporary );
+
+		// ネイティブコードバッファの再確保
+		ReallocNativeCodeBuffer();
+	}
+
+
+	////////////////////////////////////////////////////////////////////
+	// 基底クラスを登録
+	////////////////////////////////////////////////////////////////////
+
+	sprintf(temporary, "%c%ctempType=Nothing%c%cTypeBaseImpl"
+		, HIBYTE( COM_DIM )
+		, LOBYTE( COM_DIM )
+		, 1
+		, ESC_AS
+		);
+	ChangeOpcode( temporary );
+
+	// イテレータをリセット
+	Iterator_Reset();
+
+	while( Iterator_HasNext() ){
+		const CClass &objClass = *Iterator_GetNext();
+
+		if( !objClass.IsUsing() ){
+			// 未使用のクラスは無視する
+			continue;
+		}
+
+		if( objClass.pobj_InheritsClass ){
+			sprintf( temporary
+				, "tempType=Search(\"%s\",\"%s\")"
+				, ""							// 名前空間 (TODO: 実装)
+				, objClass.GetName().c_str()	// クラス名
+				);
+
+			// コンパイル
+			ChangeOpcode( temporary );
+
+			sprintf( temporary
+				, "tempType.SetBaseType(Search(\"%s\",\"%s\"))"
+				, ""								// 名前空間 (TODO: 実装)
+				, objClass.pobj_InheritsClass->GetName().c_str()	// 基底クラス名
+				);
+
+			// コンパイル
+			ChangeOpcode( temporary );
+		}
+
+		// ネイティブコードバッファの再確保
+		ReallocNativeCodeBuffer();
+	}
+
+
+
+	////////////////////////////////////////////////////////////////////
+	// 継承関係登録
+	////////////////////////////////////////////////////////////////////
+	// TODO: 未完成
+	/*
+
+	// イテレータをリセット
+	Iterator_Reset();
+
+	while( Iterator_HasNext() ){
+		CClass *pClass = Iterator_GetNext();
+
+		sprintf( genBuffer + length
+			, "obj.Search( \"%s\" ).SetBaseType( Search( \"%s\" ) ):"
+			, ""				// クラス名
+			, pClass->name		// クラス名
+			);
+		length += lstrlen( genBuffer + length );
+
+		while( length + 8192 > max ){
+			max += 8192;
+			genBuffer = (char *)realloc( genBuffer, max );
+		}
+	}*/
+}
+
+
+
+CClass *CDBClass::GetStringClassPtr() const
+{
+	if( !pStringClass ){
+		SetError();
+		return NULL;
+	}
+	return pStringClass;
+}
+CClass *CDBClass::GetObjectClassPtr() const
+{
+	if( !pObjectClass ){
+		SetError();
+		return NULL;
+	}
+	return pObjectClass;
+}
+
+void CDBClass::StartCompile( UserProc *pUserProc ){
+	pCompilingClass = pUserProc->GetParentClassPtr();
+	if( pCompilingClass ){
+		pCompilingClass->Using();
+
+		pCompilingMethod = pCompilingClass->methods.GetMethodPtr( pUserProc );
+		if( !pCompilingMethod ){
+			pCompilingMethod = pCompilingClass->staticMethods.GetMethodPtr( pUserProc );
+			if( !pCompilingMethod ){
+				SetError(300,NULL,cp);
+			}
+		}
+	}
+	else{
+		pCompilingMethod = NULL;
+	}
+}
+const CClass *CDBClass::GetNowCompilingClass() const
+{
+	return pCompilingClass;
+}
+const CMethod *CDBClass::GetNowCompilingMethodInfo(){
+	return pCompilingMethod;
+}
+
+
+
+
+//////////////////////
+// イテレータ
+//////////////////////
+
+void CDBClass::Iterator_Init(void){
+	if(ppobj_IteClass) HeapDefaultFree(ppobj_IteClass);
+
+	iIteMaxNum=0;
+	iIteNextNum=0;
+	ppobj_IteClass=(CClass **)HeapAlloc(hHeap,0,1);
+
+	int i;
+	for(i=0;i<MAX_CLASS_HASH;i++){
+		if(pobj_ClassHash[i]){
+			CClass *pobj_c;
+			pobj_c=pobj_ClassHash[i];
+			while(1){
+				ppobj_IteClass=(CClass **)HeapReAlloc(hHeap,0,ppobj_IteClass,(iIteMaxNum+1)*sizeof(CClass *));
+				ppobj_IteClass[iIteMaxNum]=pobj_c;
+				iIteMaxNum++;
+
+				if(pobj_c->pobj_NextClass==0) break;
+				pobj_c=pobj_c->pobj_NextClass;
+			}
+		}
+	}
+}
+void CDBClass::Iterator_Reset(void){
+	iIteNextNum = 0;
+}
+BOOL CDBClass::Iterator_HasNext(void){
+	if(iIteNextNum<iIteMaxNum) return 1;
+	return 0;
+}
+CClass *CDBClass::Iterator_GetNext(void){
+	CClass *pobj_c;
+	pobj_c=ppobj_IteClass[iIteNextNum];
+	iIteNextNum++;
+	return pobj_c;
+}
+int CDBClass::Iterator_GetMaxCount(void){
+	return iIteMaxNum;
+}
Index: /trunk/abdev/BasicCompiler_Common/Class.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Class.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Class.h	(revision 147)
@@ -0,0 +1,304 @@
+#pragma once
+
+#include <vector>
+#include <string>
+
+#include <Prototype.h>
+#include <Method.h>
+#include <Member.h>
+#include "Procedure.h"
+
+class CDBClass;
+class CDebugSection;
+class CClass;
+class InheritedInterface
+{
+	CClass *pInterfaceClass;
+	int vtblOffset;
+public:
+	InheritedInterface( CClass *pInterfaceClass, int vtblOffset )
+		: pInterfaceClass( pInterfaceClass )
+		, vtblOffset( vtblOffset )
+	{
+	}
+
+	CClass &GetInterfaceClass() const{
+		return *pInterfaceClass;
+	}
+	int GetVtblOffset() const
+	{
+		return vtblOffset;
+	}
+};
+typedef vector<InheritedInterface> Interfaces;
+class CClass : public Prototype
+{
+	friend CMember;
+	friend CDBClass;
+	friend CDebugSection;
+
+	bool isReady;
+	void Readed(){
+		isReady = true;
+	}
+	bool IsReady() const{
+		return isReady;
+	}
+
+	// importされている名前空間
+	NamespaceScopesCollection importedNamespaces;
+
+	// 継承するインターフェイス
+	Interfaces interfaces;
+
+	// Blittable型情報
+	Type blittableType;
+
+	// 動的メンバ
+	Members dynamicMembers;
+
+	// 静的メンバ
+	Members staticMembers;
+
+	// 動的メソッド
+	Methods methods;
+	int ConstructorMemberSubIndex;
+	int DestructorMemberSubIndex;
+	int vtblNum;					// 仮想関数の数
+
+	// 静的メソッド
+	Methods staticMethods;
+
+	enum ClassType{
+		Class,
+		Interface,
+		Enum,
+		Delegate,
+		Structure,
+	};
+
+	ClassType classType;
+
+public:
+
+	//継承クラスへのポインタ
+	const CClass *pobj_InheritsClass;
+
+	//アラインメント値
+	int iAlign;
+
+	CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name );
+	~CClass();
+
+	const NamespaceScopesCollection &GetImportedNamespaces() const
+	{
+		return importedNamespaces;
+	}
+
+	// インターフェイス
+	bool HasInterfaces() const
+	{
+		return ( interfaces.size() != 0 );
+	}
+	bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
+
+	// Blittable型
+	bool IsBlittableType() const
+	{
+		return !blittableType.IsNull();
+	}
+	const Type &GetBlittableType() const
+	{
+		return blittableType;
+	}
+	void SetBlittableType( const Type &type ){
+		blittableType = type;
+	}
+
+	bool IsClass() const;
+	bool IsInterface() const;
+	bool IsEnum() const;
+	bool IsDelegate() const;
+	bool IsStructure() const;
+
+	//継承させる
+	bool Inherits( const char *inheritNames, int nowLine );
+	bool InheritsClass( const CClass &inheritsClass, int nowLine );
+	bool InheritsInterface( const CClass &inheritsClass, int nowLine );
+
+	//メンバ、メソッドの追加
+	void AddMember( Prototype::Accessibility accessibility, bool idConst, bool isRef, char *buffer );
+	void AddStaticMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
+
+	//重複チェック
+	BOOL DupliCheckAll(const char *name);
+	BOOL DupliCheckMember(const char *name);
+
+	const Members &GetDynamicMembers() const
+	{
+		return dynamicMembers;
+	}
+
+	const Methods &GetMethods() const
+	{
+		return methods;
+	}
+	const Methods &GetStaticMethods() const
+	{
+		return staticMethods;
+	}
+
+	//デフォルト コンストラクタ メソッドを取得
+	const CMethod *GetConstructorMethod() const;
+
+	//デストラクタ メソッドを取得
+	const CMethod *GetDestructorMethod() const;
+
+	// vtblに存在する仮想関数の数
+	int GetVtblNum() const
+	{
+		return vtblNum;
+	}
+	void SetVtblNum( int vtblNum )
+	{
+		this->vtblNum = vtblNum;
+	}
+	void AddVtblNum( int vtblNum )
+	{
+		this->vtblNum += vtblNum;
+	}
+	bool IsExistVirtualFunctions() const
+	{
+		return ( vtblNum > 0 );
+	}
+
+	// メンバの総合サイズを取得
+	int GetSize() const;
+
+	// メンバのオフセットを取得
+	int GetMemberOffset( const char *memberName, int *pMemberNum = NULL ) const;
+
+private:
+	// アラインメント値を取得
+	int GetAlignment() const;
+
+
+	//vtbl
+private:
+	mutable long vtbl_offset;
+public:
+	int GetFuncNumInVtbl( const UserProc *pUserProc ) const;
+	LONG_PTR GetVtblGlobalOffset(void) const;
+	void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
+	bool IsAbstract() const;
+
+
+	//コンストラクタをコンパイルしているかどうかのチェックフラグ
+private:
+	mutable bool isCompilingConstructor;
+public:
+	void NotifyStartConstructorCompile() const;
+	void NotifyFinishConstructorCompile() const;
+	bool IsCompilingConstructor() const;
+
+	//デストラクタをコンパイルしているかどうかのチェックフラグ
+private:
+	mutable bool isCompilingDestructor;
+public:
+	void NotifyStartDestructorCompile() const;
+	void NotifyFinishDestructorCompile() const;
+	bool IsCompilingDestructor() const;
+
+
+	//自身の派生クラスかどうかを確認
+	bool IsSubClass( const CClass *pClass ) const;
+
+	//自身と等しいまたは派生クラスかどうかを確認
+	bool IsEqualsOrSubClass( const CClass *pClass ) const;
+
+	// 自身と等しいまたは派生クラス、基底クラスかどうかを確認
+	bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const;
+
+
+	//線形リスト用
+	CClass *pobj_NextClass;
+
+
+	//メンバの参照方法
+	enum RefType{
+		Non = 0,		// no reference member
+		Dot,			// obj.member
+		Pointer,		// obj->member
+	};
+};
+
+#define MAX_CLASS_HASH 65535
+class CDBClass{
+	int hash(const char *name) const;
+	void DestroyClass(CClass *pobj_c);
+public:
+	CClass *pobj_ClassHash[MAX_CLASS_HASH];
+
+	CDBClass();
+	~CDBClass();
+
+	const CClass *Find( const string &fullName ) const;
+	const CClass *Find( const NamespaceScopes &namespaceScopes, const string &name ) const;
+
+	CClass *AddClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name,int nowLine);
+
+	void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
+
+private:
+	void AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
+		bool isVirtual, bool isOverride, char *buffer, int nowLine);
+	BOOL MemberVar_LoopRefCheck(const CClass &objClass);
+public:
+	void InitNames(void);
+	void GetClass_recur(const char *lpszInheritsClass);
+	void GetAllClassInfo(void);
+	void Compile_System_InitializeUserTypes();
+
+
+	/////////////////////////////
+	// 特殊クラス
+	/////////////////////////////
+	CClass *pStringClass;
+	CClass *pObjectClass;
+	CClass *GetStringClassPtr() const;
+	CClass *GetObjectClassPtr() const;
+
+
+	/////////////////////////////
+	// 現在コンパイル中の情報
+	/////////////////////////////
+private:
+	const CClass *pCompilingClass;
+	const CMethod *pCompilingMethod;
+public:
+	//コンパイル開始の通知を受け取るメソッド
+	void StartCompile( UserProc *pUserProc );
+
+	//現在コンパイル中のメソッド情報を取得
+	const CClass *GetNowCompilingClass() const;
+	const CMethod *GetNowCompilingMethodInfo();
+
+
+	/////////////////////
+	// イテレータ
+	/////////////////////
+private:
+	CClass **ppobj_IteClass;
+	int iIteMaxNum;
+	int iIteNextNum;
+public:
+	void Iterator_Init(void);
+	void Iterator_Reset(void);
+	BOOL Iterator_HasNext(void);
+	CClass *Iterator_GetNext(void);
+	int Iterator_GetMaxCount(void);
+};
+
+
+extern CDBClass *pobj_DBClass;
+extern const CClass *pobj_CompilingClass;
Index: /trunk/abdev/BasicCompiler_Common/CommandFormat.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/CommandFormat.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/CommandFormat.cpp	(revision 147)
@@ -0,0 +1,316 @@
+#include "common.h"
+
+void ComOpen(char *Parameter,char *buffer,int nowLine){
+	int i,i2,IsStr;
+	char temporary[255];
+
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		if((
+			((Parameter[i]==' '||Parameter[i]=='\t')&&(Parameter[i+1]=='f'||Parameter[i+1]=='F')&&(Parameter[i+2]=='o'||Parameter[i+2]=='O')&&(Parameter[i+3]=='r'||Parameter[i+3]=='R')&&(Parameter[i+4]==' '||Parameter[i+4]=='\t'))||
+			(Parameter[i]==1&&Parameter[i+1]==ESC_AS)
+			)&&IsStr==0){
+			buffer[i2]=0;
+			break;
+		}
+		buffer[i2]=Parameter[i];
+		if(Parameter[i]=='\0') return;
+	}
+
+	KillStringSpaces(buffer);
+
+	if(Parameter[i]==1&&Parameter[i+1]==ESC_AS) lstrcat(buffer,",0");
+	else{
+		i+=4;
+		while(Parameter[i]==' '||Parameter[i]=='\t') i++;
+		for(i2=0;;i++,i2++){
+			if(Parameter[i]=='\0'){
+				SetError(1,NULL,nowLine);
+				return;
+			}
+			if(Parameter[i]==' '||Parameter[i]=='\t'||(Parameter[i]==1&&Parameter[i+1]==ESC_AS)){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=Parameter[i];
+		}
+		if(lstrcmpi(temporary,"input")==0) lstrcat(buffer,",1");
+		else if(lstrcmpi(temporary,"output")==0) lstrcat(buffer,",2");
+		else if(lstrcmpi(temporary,"append")==0) lstrcat(buffer,",3");
+		else{
+			SetError(1,NULL,nowLine);
+			return;
+		}
+
+		while(Parameter[i]==' '||Parameter[i]=='\t') i++;
+		if(!(Parameter[i]==1&&Parameter[i+1]==ESC_AS)) return;
+	}
+
+	i+=2;
+	while(Parameter[i]==' '||Parameter[i]=='\t') i++;
+	if(Parameter[i]=='#') i++;
+
+	lstrcat(buffer,",");
+	lstrcat(buffer,Parameter+i);
+}
+void ComClose(char *Parameter,char *buffer){
+	if(Parameter[0]=='#') lstrcpy(buffer,Parameter+1);
+	else lstrcpy(buffer,Parameter);
+}
+void ComField(char *Parameter,char *buffer){
+	if(Parameter[0]=='#') KillSpaces(Parameter+1,buffer);
+	else KillSpaces(Parameter,buffer);
+}
+
+void ComLine(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+	char temporary[VN_SIZE],temp2[VN_SIZE];
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]=='-'){
+		lstrcpy(buffer,"&H80000000,&H80000000");
+		i=0;
+	}
+	else{
+		if(Parameter[0]!='('){
+			SetError(10,"Line",nowLine);
+			return;
+		}
+		for(i=1,i2=0,PareNum=1;;i++,i2++){
+			if(Parameter[i]=='(') PareNum++;
+			if(Parameter[i]==')'){
+				PareNum--;
+				if(PareNum==0){
+					temporary[i2]=0;
+					break;
+				}
+			}
+			temporary[i2]=Parameter[i];
+		}
+
+		lstrcpy(buffer,temporary);
+
+		if(Parameter[i+1]!='-'){
+			SetError(10,"Line",nowLine);
+			return;
+		}
+		i++;
+	}
+
+	i++;
+	if((Parameter[i]=='s'||Parameter[i]=='S')&&(Parameter[i+1]=='t'||Parameter[i+1]=='T')&&(Parameter[i+2]=='e'||Parameter[i+2]=='E')&&(Parameter[i+3]=='p'||Parameter[i+3]=='P')){
+		lstrcat(buffer,",1,");
+		i+=4;
+	}
+	else lstrcat(buffer,",0,");
+
+	if(Parameter[i]!='('){
+		SetError(10,"Line",nowLine);
+		return;
+	}
+	for(i++,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				temporary[i2]=0;
+				break;
+			}
+		}
+		temporary[i2]=Parameter[i];
+	}
+
+	lstrcat(buffer,temporary);
+
+	if(Parameter[i+1]=='\0'){
+		lstrcat(buffer,",7");
+		return;
+	}
+	else if(Parameter[i+1]!=','){
+		SetError(10,"Line",nowLine);
+		return;
+	}
+	i+=2;
+
+	i=GetOneParameter(Parameter,i,temporary);	//第５パラメータ取得
+	if(temporary[0]=='\0')
+		lstrcpy(temporary,"7");
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	lstrcpy(temp2,temporary);
+
+	if(Parameter[i]=='\0') return;
+	i=GetOneParameter(Parameter,i,temporary);	//第６パラメータ取得
+	if(temporary[0]=='\0') lstrcat(buffer,",0");
+	else if(lstrcmpi(temporary,"b")==0) lstrcat(buffer,",1");
+	else if(lstrcmpi(temporary,"bf")==0) lstrcat(buffer,",2");
+	else{
+		SetError(10,"Line",nowLine);
+		return;
+	}
+
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",");
+		lstrcat(buffer,temp2);
+		return;
+	}
+	i=GetOneParameter(Parameter,i,temporary);	//第７パラメータ取得
+	if(Parameter[i-1]==','){
+		SetError(10,"Line",nowLine);
+		return;
+	}
+	if(temporary[0]=='\0') lstrcpy(temporary,temp2);
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+}
+void ComCircle(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+	char temporary[VN_SIZE],temp2[VN_SIZE];
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]!='('){
+		SetError(10,"Circle",nowLine);
+		return;
+	}
+	for(i=1,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i2]=0;
+				break;
+			}
+		}
+		buffer[i2]=Parameter[i];
+	}
+
+	i++;
+	if(Parameter[i]!=','){
+		SetError(10,"Circle",nowLine);
+		return;
+	}
+	i++;
+
+	i=GetOneParameter(Parameter,i,temporary);	//第３パラメータ取得(radius)
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",7,0,0,1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第４パラメータ取得(color)
+	if(temporary[0]=='\0') lstrcpy(temporary,"7");
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	lstrcpy(temp2,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",0,0,1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第５パラメータ取得(start)
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",0,1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第６パラメータ取得(end)
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第７パラメータ取得(aspect)
+	lstrcat(buffer,",");
+	if(temporary[0]=='\0')
+		lstrcat(buffer,"1");
+	else
+		lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0') return;
+
+	i=GetOneParameter(Parameter,i,temporary);	//第８パラメータ取得(f)
+	if(lstrcmpi(temporary,"f")==0){
+		lstrcat(buffer,",1");
+	}
+	else{
+		SetError(10,"Circle",nowLine);
+		return;
+	}
+
+	if(Parameter[i]){
+		i=GetOneParameter(Parameter,i,temporary);	//第９パラメータ取得(BrushColor)
+		if(temporary[0]=='\0') lstrcpy(temporary,"7");
+		lstrcat(buffer,",");
+		lstrcat(buffer,temporary);
+		if(Parameter[i-1]==','){
+			SetError(10,"Circle",nowLine);
+			return;
+		}
+	}
+	else{
+		lstrcat(buffer,",");
+		lstrcat(buffer,temp2);
+	}
+}
+void ComPSet(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]!='('){
+		SetError(10,"PSet",nowLine);
+		return;
+	}
+	for(i=1,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i2]=0;
+				break;
+			}
+		}
+		buffer[i2]=Parameter[i];
+	}
+
+	if(Parameter[i+1]==',')lstrcat(buffer,Parameter+i+1);
+	else if(Parameter[i+1]=='\0') lstrcat(buffer,",7");
+	else{
+		SetError(10,"PSet",nowLine);
+		return;
+	}
+}
+void ComPaint(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]!='('){
+		SetError(10,"Paint",nowLine);
+		return;
+	}
+	for(i=1,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i2]=0;
+				break;
+			}
+		}
+		buffer[i2]=Parameter[i];
+	}
+	if(Parameter[i+1]!=','){
+		SetError(10,"Paint",nowLine);
+		return;
+	}
+
+	lstrcat(buffer,Parameter+i+1);
+}
Index: /trunk/abdev/BasicCompiler_Common/Compile.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Compile.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Compile.cpp	(revision 147)
@@ -0,0 +1,694 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+//ラベルアドレス
+LABEL *pLabelNames;
+int MaxLabelNum;
+
+//Continueアドレス
+DWORD dwContinueAddress;
+
+//Caseスケジュール
+DWORD *pCaseSchedule;
+int CaseScheduleNum;
+int NowCaseSchedule;
+
+//プロシージャ抜け出しスケジュール（Exit Sub/Function）
+DWORD *pExitSubSchedule;
+int ExitSubScheduleNum;
+
+//Goto未知ラベル スケジュール
+GOTOLABELSCHEDULE *pGotoLabelSchedule;
+int GotoLabelScheduleNum;
+
+//グローバル変数初期バッファ
+BYTE *initGlobalBuf;
+
+//With情報
+WITHINFO WithInfo;
+
+
+int obp,obp_AllocSize;
+int GlobalOpBufferSize;
+char *OpBuffer;
+void ReallocNativeCodeBuffer(){
+	if(obp_AllocSize<obp+8192){
+		obp_AllocSize+=8192;
+		OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
+	}
+}
+
+
+///////////////////////////////////////////////////
+// トークンを取得
+///////////////////////////////////////////////////
+void GetIdentifierToken( char *token, const char *source, int &pos ){
+	for( int i=0; ; i++, pos++ ){
+		if( ! IsVariableChar( source[pos] ) ){
+			token[i] = 0;
+			break;
+		}
+		token[i] = source[pos];
+	}
+}
+
+
+///////////////////////////////////////////////////
+// 対になっているステートメントを飛び越す
+// ※グローバル領域用
+///////////////////////////////////////////////////
+int JumpStatement(const char *source, int &pos){
+	if( source[pos] != 1 ) return 0;
+
+	if( ! IsCommandDelimitation( source[pos - 1] ) ){
+		//直前がコマンド区切りではない場合
+		return 0;
+	}
+
+	char cStatement = source[pos + 1];
+
+	char cEnd = GetEndXXXCommand( cStatement );
+	if( cEnd == 0 ) return 0;
+
+	pos += 2;
+	while( ! ( source[pos] == 1 && source[pos + 1] == cEnd ) ){
+
+		if( source[pos] == '\0' ){
+			char temporary[64];
+			GetDefaultNameFromES( cStatement, temporary );
+			SetError( 22, temporary, pos );
+			return -1;
+		}
+
+		pos++;
+	}
+	if( ! ( source[pos] == '\0' || source[pos + 2] == '\0' ) ){
+		pos += 2;
+	}
+
+	return 1;
+}
+
+
+void NextLine(void){
+	extern HANDLE hHeap;
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+	if(MaxLineInfoNum){
+		if(pLineInfo[MaxLineInfoNum-1].TopObp==obp){
+			pLineInfo[MaxLineInfoNum-1].TopCp=cp;
+			return;
+		}
+	}
+	pLineInfo=(LINEINFO *)HeapReAlloc(hHeap,0,pLineInfo,(MaxLineInfoNum+1)*sizeof(LINEINFO));
+	pLineInfo[MaxLineInfoNum].TopCp=cp;
+	pLineInfo[MaxLineInfoNum].TopObp=obp;
+
+	extern BOOL bDebugSupportProc;
+	extern BOOL bSystemProc;
+	pLineInfo[MaxLineInfoNum].dwCodeType=0;
+	if(bDebugSupportProc)
+		pLineInfo[MaxLineInfoNum].dwCodeType|=CODETYPE_DEBUGPROC;
+	if(bSystemProc)
+		pLineInfo[MaxLineInfoNum].dwCodeType|=CODETYPE_SYSTEMPROC;
+
+	MaxLineInfoNum++;
+}
+
+void ChangeOpcode(char *Command){
+	extern HANDLE hHeap;
+	int i,i2;
+
+	if(Command[0]=='\0') return;
+	if(Command[0]=='*'&&IsVariableTopChar(Command[1])){
+		//Goto先ラベル
+		pLabelNames=(LABEL *)HeapReAlloc(hHeap,0,pLabelNames,(MaxLabelNum+1)*sizeof(LABEL));
+		pLabelNames[MaxLabelNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Command+1)+1);
+		lstrcpy(pLabelNames[MaxLabelNum].pName,Command+1);
+		pLabelNames[MaxLabelNum].address=obp;
+		MaxLabelNum++;
+
+		//書き込みスケジュール
+		for(i=0;i<GotoLabelScheduleNum;i++){
+			if(lstrcmp(pGotoLabelSchedule[i].pName,Command+1)==0){
+				*((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
+
+				HeapDefaultFree(pGotoLabelSchedule[i].pName);
+
+				//詰める
+				GotoLabelScheduleNum--;
+				for(i2=i;i2<GotoLabelScheduleNum;i2++){
+					pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
+					pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
+					pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
+				}
+				i--;
+				continue;
+			}
+		}
+		return;
+	}
+	if(Command[0]==1){
+		switch(Command[1]){
+			case ESC_CONST:
+				OpcodeDim(Command+2, DIMFLAG_CONST);
+				break;
+
+			case ESC_TYPEDEF:
+				if( UserProc::IsLocalAreaCompiling() ){
+					// ローカル領域をコンパイルしているとき
+					SetError(65,"TypeDef",cp );
+				}
+
+				//既に収集済み
+				break;
+
+			case ESC_STATIC:
+				OpcodeDim(Command+2,DIMFLAG_STATIC);
+				break;
+
+			case ESC_IF:
+				OpcodeIf(Command+2);
+				break;
+			case ESC_EXITWHILE:
+				obj_LexScopes.ExitWhile();
+				break;
+			case ESC_EXITFOR:
+				obj_LexScopes.ExitFor();
+				break;
+			case ESC_EXITDO:
+				obj_LexScopes.ExitDo();
+				break;
+			case ESC_CONTINUE:
+				OpcodeContinue();
+				break;
+
+			case ESC_EXITSUB:
+			case ESC_EXITFUNCTION:
+			case ESC_EXITMACRO:
+				OpcodeExitSub();
+				break;
+
+			case ESC_SELECTCASE:
+				OpcodeSelect(Command+2);
+				break;
+			case ESC_CASE:
+			case ESC_CASEELSE:
+				OpcodeCase(Command+2);
+				break;
+
+			case ESC_WITH:
+				extern WITHINFO WithInfo;
+
+				WithInfo.ppName=(char **)HeapReAlloc(hHeap,0,WithInfo.ppName,(WithInfo.num+1)*sizeof(char **));
+				WithInfo.ppName[WithInfo.num]=(char *)HeapAlloc(hHeap,0,lstrlen(Command+2)+1);
+				lstrcpy(WithInfo.ppName[WithInfo.num],Command+2);
+
+				WithInfo.pWithCp=(int *)HeapReAlloc(hHeap,0,WithInfo.pWithCp,(WithInfo.num+1)*sizeof(int));
+				WithInfo.pWithCp[WithInfo.num]=cp;
+
+				WithInfo.num++;
+				break;
+			case ESC_ENDWITH:
+				if(WithInfo.num<=0){
+					SetError(12,"End With",cp);
+					return;
+				}
+				WithInfo.num--;
+				HeapDefaultFree(WithInfo.ppName[WithInfo.num]);
+				break;
+			case ESC_DECLARE:
+				if( UserProc::IsLocalAreaCompiling() ){
+					// ローカル領域をコンパイルしているとき
+					SetError(65,"Declare",cp );
+				}
+				break;
+
+			case ESC_NAMESPACE:
+				Smoothie::Lexical::liveingNamespaceScopes.push_back( Command + 2 );
+				break;
+			case ESC_ENDNAMESPACE:
+				if( Smoothie::Lexical::liveingNamespaceScopes.size() <= 0 ){
+					SetError(12,"End Namespace",cp);
+				}
+				Smoothie::Lexical::liveingNamespaceScopes.pop_back();
+				break;
+			case ESC_IMPORTS:
+				Smoothie::Temp::importedNamespaces.Imports( Command + 2 );
+				break;
+			case ESC_CLEARNAMESPACEIMPORTED:
+				Smoothie::Temp::importedNamespaces.clear();
+				break;
+
+				//Tryによる例外処理
+			case ESC_TRY:
+				Exception::TryCommand();
+				break;
+			case ESC_CATCH:
+				Exception::CatchCommand();
+				break;
+			case ESC_FINALLY:
+				Exception::FinallyCommand();
+				break;
+			case ESC_ENDTRY:
+				Exception::EndTryCommand();
+				break;
+			case ESC_THROW:
+				Exception::ThrowCommand( Command + 2 );
+				break;
+
+			default:
+				char temporary[64];
+				GetDefaultNameFromES(Command[1],temporary);
+				SetError(30,temporary,cp);
+				break;
+		}
+		return;
+	}
+	switch(MAKEWORD(Command[1],Command[0])){
+		case COM_DIM:
+			OpcodeDim(Command+2,0);
+			break;
+		case COM_DELETE:
+			OpcodeDelete(Command+2, false);
+			break;
+		case COM_SWEEPINGDELETE:
+			OpcodeDelete(Command+2, true);
+			break;
+
+		case COM_GOTO:
+			OpcodeGoto(Command+2);
+			break;
+		case COM_WHILE:
+			OpcodeWhile(Command+2);
+			break;
+		case COM_FOR:
+			OpcodeFor(Command+2);
+			break;
+		case COM_DO:
+			OpcodeDo(Command+2);
+			break;
+
+		case COM_GOSUB:
+			OpcodeGosub(Command+2);
+			break;
+		case COM_RETURN:
+			OpcodeReturn(Command+2);
+			break;
+
+		case COM_SETDOUBLE:
+			OpcodeSetPtrData(Command+2,DEF_DOUBLE);
+			break;
+		case COM_SETSINGLE:
+			OpcodeSetPtrData(Command+2,DEF_SINGLE);
+			break;
+		case COM_SETQWORD:
+			OpcodeSetPtrData(Command+2,DEF_QWORD);
+			break;
+		case COM_SETDWORD:
+			OpcodeSetPtrData(Command+2,DEF_DWORD);
+			break;
+		case COM_SETWORD:
+			OpcodeSetPtrData(Command+2,DEF_WORD);
+			break;
+		case COM_SETBYTE:
+			OpcodeSetPtrData(Command+2,DEF_BYTE);
+			break;
+
+		case COM_DEBUG:
+			extern BOOL bDebugCompile;
+			//int 3
+			if(bDebugCompile) OpBuffer[obp++]=(char)0xCC;
+#if defined(_DEBUG)
+			else OpBuffer[obp++]=(char)0xCC;
+#endif
+			break;
+
+		case COM_LET:
+			OpcodeCalc(Command+2);
+			break;
+		default:
+			OpcodeOthers(Command);
+			break;
+	}
+}
+
+void GetGlobalDataForDll(void){
+	extern char *basbuf;
+	extern HANDLE hHeap;
+	int i2,BufferSize;
+	char *Command;
+	DWORD dwRetCode;
+
+	dwRetCode=0;
+	BufferSize=128;
+	Command=(char *)HeapAlloc(hHeap,0,BufferSize);
+	for(cp++,i2=0;;cp++,i2++){
+		if(i2>=BufferSize){
+			//バッファ領域が足りなくなった場合はバッファを増量する
+			BufferSize+=128;
+			Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+		}
+		if(basbuf[cp]=='\"'){
+			Command[i2]=basbuf[cp];
+			for(cp++,i2++;;cp++,i2++){
+				if(i2>=BufferSize){
+					//バッファ領域が足りなくなった場合はバッファを増量する
+					BufferSize+=128;
+					Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+				}
+				Command[i2]=basbuf[cp];
+				if(basbuf[cp]=='\"') break;
+			}
+			continue;
+		}
+		if(IsCommandDelimitation(basbuf[cp])){
+			Command[i2]=0;
+
+			if(Command[0]==1&&Command[1]==ESC_SUB){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDSUB)){
+					if(basbuf[cp]=='\0'){
+						SetError(22,"Sub",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_FUNCTION){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDFUNCTION)){
+					if(basbuf[cp]=='\0'){
+						SetError(22,"Function",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_MACRO){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDMACRO)){
+					if(basbuf[cp]=='\0'){
+						SetError(22,"Macro",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_TYPE){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDTYPE)){
+					if(basbuf[cp]=='\0'){
+						SetError(22,"Type",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_CLASS){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDCLASS)){
+					if(basbuf[cp]=='\0'){
+						SetError(22,"Class",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_INTERFACE){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDINTERFACE)){
+					if(basbuf[cp]=='\0'){
+						SetError(22,"Interface",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+
+			//DLLのグローバルデータに必要なコマンドだけ
+			if(MAKEWORD(Command[1],Command[0])==COM_DIM)
+				OpcodeDim(Command+2,0);
+
+			// ネイティブコードバッファの再確保
+			ReallocNativeCodeBuffer();
+
+			if(basbuf[cp]=='\0') break;
+			i2=-1;
+			continue;
+		}
+		Command[i2]=basbuf[cp];
+	}
+	HeapDefaultFree(Command);
+}
+DWORD CompileBuffer(char Return_Sequence,WORD Return_Command){
+	extern char *basbuf;
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,BufferSize,ScopeStart;
+	char *Command,temporary[VN_SIZE],*temp2,temp3[32];
+	DWORD dwRetCode;
+
+	ScopeStart=cp;
+
+	dwRetCode=0;
+	BufferSize=128;
+	Command=(char *)HeapAlloc(hHeap,0,BufferSize);
+
+	for(cp++,i2=0;;cp++,i2++){
+		if(i2>=BufferSize){
+			//バッファ領域が足りなくなった場合はバッファを増量する
+			BufferSize+=128;
+			Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+		}
+		if(basbuf[cp]=='\"'){
+			Command[i2]=basbuf[cp];
+			for(cp++,i2++;;cp++,i2++){
+				if(i2>=BufferSize){
+					//バッファ領域が足りなくなった場合はバッファを増量する
+					BufferSize+=128;
+					Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+				}
+				Command[i2]=basbuf[cp];
+				if(basbuf[cp]=='\"') break;
+			}
+			continue;
+		}
+		if(IsCommandDelimitation(basbuf[cp])){
+			Command[i2]=0;
+
+			if(Command[0]==1&&Command[1]==ESC_LINENUM){
+				for(i=2,i2=0;;i++,i2++){
+					if(Command[i]==','){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=Command[i];
+				}
+				i3=atoi(temporary);
+				i4=i+1;
+
+				//Goto先ラベル
+				pLabelNames=(LABEL *)HeapReAlloc(hHeap,0,pLabelNames,(MaxLabelNum+1)*sizeof(LABEL));
+				pLabelNames[MaxLabelNum].pName=0;
+				pLabelNames[MaxLabelNum].line=i3;
+				pLabelNames[MaxLabelNum].address=obp;
+				MaxLabelNum++;
+
+				//書き込みスケジュール
+				for(i=0;i<GotoLabelScheduleNum;i++){
+					if(pGotoLabelSchedule[i].pName==0&&
+						pGotoLabelSchedule[i].line==i3){
+						*((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
+
+						//詰める
+						GotoLabelScheduleNum--;
+						for(i2=i;i2<GotoLabelScheduleNum;i2++){
+							pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
+							pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
+							pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
+						}
+						i--;
+					}
+				}
+
+				temp2=(char *)HeapAlloc(hHeap,0,lstrlen(Command+i4)+1);
+				lstrcpy(temp2,Command+i4);
+				lstrcpy(Command,temp2);
+				HeapDefaultFree(temp2);
+			}
+
+			if(Command[0]==1&&
+				(((Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE)&&Command[2]==1&&(Command[3]==ESC_SUB||Command[3]==ESC_FUNCTION))||
+				Command[1]==ESC_SUB||
+				Command[1]==ESC_FUNCTION||
+				Command[1]==ESC_MACRO||
+				Command[1]==ESC_TYPE||
+				Command[1]==ESC_CLASS||
+				Command[1]==ESC_INTERFACE||
+				Command[1]==ESC_ENUM||
+				(Command[1]==ESC_CONST&&Command[2]==1&&Command[3]==ESC_ENUM)
+				)
+				){
+				if(Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE||Command[1]==ESC_CONST){
+					GetDefaultNameFromES(Command[3],temporary);
+				}
+				else{
+					GetDefaultNameFromES(Command[1],temporary);
+				}
+				if(Return_Sequence){
+					SetError(12,temporary,cp);
+					break;
+				}
+
+				if(Command[1]==ESC_CONST) i3=GetEndXXXCommand(Command[3]);
+				else i3=GetEndXXXCommand(Command[1]);
+				for(i2=cp;;cp++){
+					if(basbuf[cp]==1){
+						if(basbuf[cp+1]==i3) break;
+						if(Command[1]==ESC_CLASS||Command[1]==ESC_INTERFACE){
+							//クラス、インターフェイスではSub、Functionの定義を可能にしておく
+							if(basbuf[cp+1]==ESC_MACRO||
+								basbuf[cp+1]==ESC_TYPE||
+								basbuf[cp+1]==ESC_CLASS||
+								basbuf[cp+1]==ESC_INTERFACE||
+								basbuf[cp+1]==ESC_ENUM){
+								GetDefaultNameFromES(basbuf[cp+1],temp3);
+								SetError(12,temp3,cp);
+							}
+						}
+						else{
+							if(basbuf[cp-1]!='*'&&(
+								basbuf[cp+1]==ESC_VIRTUAL||
+								basbuf[cp+1]==ESC_OVERRIDE||
+								basbuf[cp+1]==ESC_SUB||
+								basbuf[cp+1]==ESC_FUNCTION||
+								basbuf[cp+1]==ESC_MACRO||
+								basbuf[cp+1]==ESC_TYPE||
+								basbuf[cp+1]==ESC_CLASS||
+								basbuf[cp+1]==ESC_INTERFACE||
+								basbuf[cp+1]==ESC_ENUM)){
+								GetDefaultNameFromES(basbuf[cp+1],temp3);
+								SetError(12,temp3,cp);
+							}
+						}
+					}
+					if(basbuf[cp]=='\0'){
+						//error
+						//既にエラー発行済みのため、何もせずに抜ける
+						break;
+					}
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+
+			if(Command[0]==0x10||Command[0]==0x11){
+				//Wend、Next、Loopなど
+				if(Return_Command==MAKEWORD(Command[1],Command[0])){
+					if(Return_Command==COM_NEXT){
+						//Nextの場合は、パラメータ（省略化）の整合性を判断する必要がある（OpcodeFor関数を参照）
+						extern char szNextVariable[VN_SIZE];
+						if(Command[2]) lstrcpy(szNextVariable,Command+2);
+						else szNextVariable[0]=0;
+					}
+					break;
+				}
+			}
+
+			NextLine();
+
+			if(Command[0]==1){
+				if(Return_Sequence==ESC_ENDIF&&Command[1]==ESC_ELSE){
+					dwRetCode=ESC_ELSE;
+					break;
+				}
+
+				if(Command[1]==Return_Sequence){
+					dwRetCode=Command[1];
+					break;
+				}
+			}
+
+			ChangeOpcode(Command);
+
+#ifdef _DEBUG
+			epi_check();
+#endif
+
+			//コンパイルを中断するとき
+			extern BOOL bStopCompile;
+			if(bStopCompile) return 0;
+
+			if(obp_AllocSize<obp+8192){
+				obp_AllocSize+=8192;
+				OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize);
+			}
+
+			if(basbuf[cp]=='\0'){
+				switch(Return_Command){
+					case COM_WEND:
+						SetError(4,"\"While\" - \"Wend\" ",ScopeStart);
+						break;
+					case COM_NEXT:
+						SetError(4,"\"For\" - \"Next\" ",ScopeStart);
+						break;
+					case COM_LOOP:
+						SetError(4,"\"Do\" - \"Loop\" ",ScopeStart);
+						break;
+				}
+				switch(Return_Sequence){
+					case ESC_ENDSUB:
+						SetError(4,"\"Sub\" - \"End Sub\" ",ScopeStart);
+						break;
+					case ESC_ENDFUNCTION:
+						SetError(4,"\"Function\" - \"End Function\" ",ScopeStart);
+						break;
+					case ESC_ENDMACRO:
+						SetError(4,"\"Macro\" - \"End Macro\" ",ScopeStart);
+						break;
+					case ESC_ENDIF:
+						SetError(22,"If",ScopeStart);
+						break;
+				}
+				break;
+			}
+			i2=-1;
+			continue;
+		}
+		Command[i2]=basbuf[cp];
+	}
+	HeapDefaultFree(Command);
+
+	return dwRetCode;
+}
Index: /trunk/abdev/BasicCompiler_Common/Const.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Const.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Const.cpp	(revision 147)
@@ -0,0 +1,230 @@
+#include "common.h"
+#include OPCODE_H_PATH	//opcode.h
+
+
+//シングルトンオブジェクト
+CDBConst CDBConst::obj;
+
+
+bool ConstBase::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	if( GetName() != name ){
+		return false;
+	}
+	return NamespaceScopes::IsSameArea( this->namespaceScopes, namespaceScopes );
+}
+bool ConstBase::IsEqualSymbol( const string &fullName ) const
+{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	return IsEqualSymbol( NamespaceScopes( AreaName ), NestName );
+}
+
+
+
+
+CConst::CConst( const NamespaceScopes &namespaceScopes, const string &name, const Type &type, _int64 i64data)
+	: ConstBase( namespaceScopes, name )
+	, type( type )
+	, i64data( i64data )
+	, pNext( NULL )
+{
+}
+CConst::CConst( const NamespaceScopes &namespaceScopes, const string &name, int value)
+	: ConstBase( namespaceScopes, name )
+	, type( Type(DEF_LONG) )
+	, i64data( value )
+	, pNext( NULL )
+{
+}
+CConst::~CConst(){
+	//連結先のオブジェクトを破棄
+	if(pNext){
+		delete pNext;
+		pNext = 0;
+	}
+}
+
+Type CConst::GetType(){
+	return type;
+}
+_int64 CConst::GetWholeData(){
+	return i64data;
+}
+double CConst::GetDoubleData(){
+	double dbl;
+	memcpy(&dbl,&i64data,sizeof(_int64));
+	return dbl;
+}
+
+
+
+CConstMacro::CConstMacro( const NamespaceScopes &namespaceScopes, const string &name, char *Expression)
+	: ConstBase( namespaceScopes, name )
+{
+}
+CConstMacro::~CConstMacro(){
+}
+
+
+
+
+
+CDBConst::CDBConst(){
+	memset(this,0,sizeof(CDBConst));
+
+	ppHash = (CConst **)calloc(MAX_HASH*sizeof(CConst *),1);
+	Init();
+}
+CDBConst::~CDBConst(){
+	Free();
+
+	free(ppHash);
+}
+
+//解放
+void CDBConst::Free(){
+	int i;
+	for(i=0; i<MAX_HASH; i++){
+		if(ppHash[i]){
+			delete ppHash[i];
+			ppHash[i] = 0;
+		}
+	}
+}
+
+//初期化
+void CDBConst::Init(){
+	Free();
+}
+
+void AddConstData(char *Command);
+void CDBConst::Add( const NamespaceScopes &namespaceScopes, char *buffer ){
+	int i;
+
+	//名前を取得
+	char Name[VN_SIZE];
+	for(i=0;;i++){
+		if(buffer[i]=='\0'){
+			SetError(10,"Const",cp);
+			return;
+		}
+		if(buffer[i]=='='||buffer[i]=='('){
+			Name[i]=0;
+			break;
+		}
+		Name[i]=buffer[i];
+	}
+
+	//重複チェック
+	if(GetBasicType(Name)){
+		SetError(15,Name,cp);
+		return;
+	}
+
+	if(buffer[i] == '('){
+		//定数マクロ
+
+		//未完成
+		AddConstData(buffer);
+	}
+	else{
+		//一般の定数
+		char *Expression = buffer + i + 1;
+
+		AddConst( namespaceScopes, Name,Expression);
+	}
+}
+
+void CDBConst::AddConst( const string &name, CConst *newconst){
+	int key = hash_default(name.c_str());
+
+	//ハッシュリストに追加
+	if(ppHash[key]){
+		CConst *pConst = ppHash[key];
+		while(pConst->pNext){
+			pConst = pConst->pNext;
+		}
+
+		pConst->pNext = newconst;
+	}
+	else{
+		ppHash[key] = newconst;
+	}
+}
+void CDBConst::AddConst( const NamespaceScopes &namespaceScopes, const string &name , char *Expression){
+	_int64 i64data;
+	Type resultType;
+	if( !StaticCalculation(false, Expression, 0, &i64data, resultType) ){
+		//変数の場合
+		//何もしない（実行領域コンパイル時にdim宣言として扱う）
+		return;
+	}
+
+	//リテラル値の場合
+	//登録を行う
+
+	CConst *newconst = new CConst(namespaceScopes, name, resultType, i64data);
+
+	AddConst( name, newconst);
+}
+void CDBConst::AddConst(const NamespaceScopes &namespaceScopes, const string &name, int value){
+	CConst *newconst = new CConst( namespaceScopes, name, value);
+
+	AddConst(name, newconst);
+}
+
+CConst *CDBConst::GetObjectPtr( const string &name ){
+	char ObjName[VN_SIZE];		//オブジェクト変数
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	bool isObjectMember = SplitMemberName( name.c_str(), ObjName, NestMember );
+
+	//ハッシュ値を取得
+	int key;
+	key=hash_default( NestMember );
+
+	//格納位置を取得
+	CConst *pConst;
+	pConst=ppHash[key];
+	while(pConst){
+		if( pConst->IsEqualSymbol( name ) ) break;
+
+		pConst=pConst->pNext;
+	}
+
+	return pConst;
+}
+
+
+int CDBConst::GetBasicType(char *Name){
+	CConst *pConst = GetObjectPtr(Name);
+
+	if(!pConst) return 0;
+
+	return pConst->GetType().GetBasicType();
+}
+_int64 CDBConst::GetWholeData(char *Name){
+	CConst *pConst = GetObjectPtr(Name);
+
+	if(!pConst) return 0;
+
+	return pConst->GetWholeData();
+}
+double CDBConst::GetDoubleData(char *Name){
+	CConst *pConst = GetObjectPtr(Name);
+
+	if(!pConst) return 0;
+
+	return pConst->GetDoubleData();
+}
+bool CDBConst::IsStringPtr( char *Name ){
+	CConst *pConst = GetObjectPtr(Name);
+
+	if(!pConst) return false;
+
+	const Type &type = pConst->GetType();
+
+	return ( type.GetBasicType() == typeOfPtrChar && type.GetIndex() == LITERAL_STRING );
+}
Index: /trunk/abdev/BasicCompiler_Common/Const.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Const.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Const.h	(revision 147)
@@ -0,0 +1,91 @@
+
+
+//定数の基底クラス
+class ConstBase{
+	const string name;
+	const NamespaceScopes namespaceScopes;
+
+public:
+
+	ConstBase( const NamespaceScopes &namespaceScopes, const string &name )
+		: namespaceScopes( namespaceScopes )
+		, name( name )
+	{
+	}
+	~ConstBase()
+	{
+	}
+
+	const string &GetName() const
+	{
+		return name;
+	}
+
+	bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
+	bool IsEqualSymbol( const string &name ) const;
+};
+
+//定数
+class CConst:public ConstBase{
+	Type type;
+	_int64 i64data;
+
+public:
+	CConst *pNext;
+
+	CConst( const NamespaceScopes &namespaceScopes, const string &name, const Type &type, _int64 i64data);
+	CConst( const NamespaceScopes &namespaceScopes, const string &name, int value);
+	~CConst();
+
+	Type GetType();
+	_int64 GetWholeData();
+	double GetDoubleData();
+};
+
+//定数マクロ
+class CConstMacro:public ConstBase{
+	int ParmNum;
+	char **ppParm;
+public:
+
+	CConstMacro( const NamespaceScopes &namespaceScopes, const string &name, char *Expression);
+	~CConstMacro();
+};
+
+//定数管理クラス
+class CDBConst{
+	CConst **ppHash;
+
+	CConstMacro **ppobj_Macro;
+	int NumOfMacro;
+
+	//シングルトンクラスなので、プライベートに置く
+	CDBConst();
+	~CDBConst();
+	void _free();
+	void Free();
+
+public:
+
+	void Init();
+
+	void Add( const NamespaceScopes &namespaceScopes, char *buffer);
+private:
+	void AddConst( const string &name, CConst *newconst);
+public:
+	void AddConst( const NamespaceScopes &namespaceScopes, const string &name, char *Expression);
+	void AddConst( const NamespaceScopes &namespaceScopes, const string &name, int value);
+
+private:
+	CConst *GetObjectPtr( const string &name );
+public:
+
+	int GetBasicType(char *Name);
+	_int64 GetWholeData(char *Name);
+	double GetDoubleData(char *Name);
+	bool IsStringPtr(char *Name);
+
+
+	//シングルトンオブジェクト
+	static CDBConst obj;
+};
Index: /trunk/abdev/BasicCompiler_Common/DataTable.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/DataTable.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/DataTable.cpp	(revision 147)
@@ -0,0 +1,91 @@
+#include "common.h"
+
+DataTable dataTable;
+
+DataTable::DataTable(){
+	pdata = malloc( 1 );
+	size = 0;
+}
+DataTable::~DataTable(){
+	free( pdata );
+}
+
+void DataTable::Init(){
+	free( pdata );
+
+	pdata = malloc( 1 );
+	size = 0;
+}
+
+int DataTable::AddBinary( const void *pdata, int size ){
+	int retSize = this->size;
+
+	this->pdata = realloc( this->pdata, this->size + size );
+	memcpy( (char *)this->pdata + this->size, pdata, size );
+	this->size += size;
+
+	return retSize;
+}
+int DataTable::Add( _int64 i64data ){
+	int retSize = size;
+	AddBinary( &i64data, sizeof( _int64 ) );
+	return retSize;
+}
+int DataTable::Add( int i32data ){
+	int retSize = size;
+	AddBinary( &i32data, sizeof( int ) );
+	return retSize;
+}
+int DataTable::Add( double dbl ){
+	int retSize = size;
+	AddBinary( &dbl, sizeof( double ) );
+	return retSize;
+}
+int DataTable::Add( float flt ){
+	int retSize = size;
+	AddBinary( &flt, sizeof( float ) );
+	return retSize;
+}
+int DataTable::AddString( const char *str, int length ){
+	int retSize = size;
+
+	if( isUnicode ){
+		//Shift-JIS → Unicode
+		int size = MultiByteToWideChar(
+			CP_ACP,
+			0,
+			str, length + 1,
+			NULL, 0 ) * 2;
+
+		LPWSTR pwstr = (LPWSTR)malloc( size );
+
+		MultiByteToWideChar(
+			CP_ACP,
+			0,
+			str, length + 1,
+			pwstr, length + 1 );
+
+		AddBinary( pwstr, size );
+
+		free( pwstr );
+	}
+	else{
+		AddBinary( str, length + 1 );
+	}
+
+	return retSize;
+}
+int DataTable::AddString( const char *str ){
+	int retSize = size;
+	AddString( str, lstrlen( str ) );
+	return retSize;
+}
+
+const void *DataTable::GetPtr() const
+{
+	return pdata;
+}
+int DataTable::GetSize() const
+{
+	return size;
+}
Index: /trunk/abdev/BasicCompiler_Common/Debug.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Debug.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Debug.cpp	(revision 147)
@@ -0,0 +1,767 @@
+#include "../BasicCompiler_Common/common.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+extern char *OpBuffer;
+
+extern DWORD dwStepRun;
+
+HANDLE hDebugProcess;
+
+DWORD _DebugSys_dwThreadID[MAX_DEBUG_THREAD];
+HANDLE array_hDebugThread[MAX_DEBUG_THREAD];
+
+int StepCursorObpSchedule=-1;
+int StepCursor_BackupChar;
+
+int NextStepThreadNum;
+
+
+void Debugger_StepIn(void){
+	dwStepRun=1;
+}
+void Debugger_StepOver(void){
+	dwStepRun=2;
+}
+char *ReadBuffer_NonErrMsg(char *path);
+void Debugger_StepCursor(void){
+	char temporary[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	if(temporary[lstrlen(temporary)-1]!='\\') lstrcat(temporary,"\\");
+	lstrcat(temporary,"ab_breakpoint.tmp");
+
+	char *buffer;
+	buffer=ReadBuffer_NonErrMsg(temporary);
+
+	int i=0;
+	char szFilePath[MAX_PATH];
+	i=GetOneParameter(buffer,i,szFilePath);
+	RemoveStringQuotes(szFilePath);
+
+	int iLineNum;
+	i=GetOneParameter(buffer,i,temporary);
+	iLineNum=atoi(temporary);
+
+
+
+	/////////////////////////////////////////////////////////
+	// デバッグ中プロセスのネイティブバッファ領域を更新
+	/////////////////////////////////////////////////////////
+
+	extern INCLUDEFILEINFO IncludeFileInfo;
+
+	int FileNum;
+	for(FileNum=0;FileNum<IncludeFileInfo.FilesNum;FileNum++){
+		if(lstrcmpi(IncludeFileInfo.ppFileNames[FileNum],szFilePath)==0) break;
+	}
+	if(FileNum==IncludeFileInfo.FilesNum) return;
+
+	for(i=0;;i++){
+		if(IncludeFileInfo.LineOfFile[i]==FileNum||
+			IncludeFileInfo.LineOfFile[i]==-1) break;
+	}
+	if(IncludeFileInfo.LineOfFile[i]==-1) return;
+
+	int FileBaseLine;
+	FileBaseLine=i;
+
+	int i2;
+	for(i2=0;;i++,i2++){
+		if(FileNum<IncludeFileInfo.LineOfFile[i]){
+			while(FileNum!=IncludeFileInfo.LineOfFile[i]) i++;
+		}
+
+		if(i2==iLineNum){
+			extern int MaxLineInfoNum;
+			extern LINEINFO *pLineInfo;
+
+loop:
+			int tempCp;
+			tempCp=GetCpFromLine(FileBaseLine+i2);
+
+			int i3;
+			for(i3=0;i3<MaxLineInfoNum-1;i3++){
+				if(pLineInfo[i3].TopCp==tempCp) break;
+			}
+			if(i3==MaxLineInfoNum-1){
+				i2--;
+				goto loop;
+			}
+
+			StepCursorObpSchedule=pLineInfo[i3].TopObp;
+			StepCursor_BackupChar=pobj_DBDebugSection->pobj_now->BreakStepCodeBuffer[StepCursorObpSchedule];
+
+			pobj_DBDebugSection->pobj_now->BreakStepCodeBuffer[StepCursorObpSchedule]=(char)0xCC;
+
+			break;
+		}
+	}
+
+	extern HWND hDebugWnd;
+	SendMessage(hDebugWnd,WM_DEBUG_CONTINUE,0,0);
+
+
+
+	HeapDefaultFree(buffer);
+}
+void Debugger_Stop(void){
+	//プロセスを終了
+	TerminateProcess(hDebugProcess,0);
+	hDebugProcess=0;
+
+	//デバッグダイアログを終了
+	extern HWND hDebugWnd;
+	if(hDebugWnd){
+		DestroyWindow(hDebugWnd);
+	}
+}
+void Debugger_Pause(void){
+	///////////////////////////
+	// デバッグを一時中断
+	///////////////////////////
+
+	//ターゲットプロセス内のスレッドを一時中断
+	int i;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			SuspendThread(array_hDebugThread[i]);
+	}
+
+	//デバッグレジスタにフラグをセット
+	CONTEXT Context;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]){
+			Context.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
+			GetThreadContext(array_hDebugThread[i],&Context);
+			Context.EFlags|=0x100;
+			SetThreadContext(array_hDebugThread[i],&Context);
+		}
+	}
+
+	//スレッドを再開
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			ResumeThread(array_hDebugThread[i]);
+	}
+}
+
+void ReleaseCPUSingleStep(void){
+	////////////////////////////////////////
+	// CPU機構のシングルステップを解除
+	////////////////////////////////////////
+
+	//ターゲットプロセス内のスレッドを一時中断
+	int i;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			SuspendThread(array_hDebugThread[i]);
+	}
+
+	//デバッグレジスタにフラグをセット
+	CONTEXT Context;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]){
+			Context.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
+			GetThreadContext(array_hDebugThread[i],&Context);
+			Context.EFlags&=~0x00000100;
+			SetThreadContext(array_hDebugThread[i],&Context);
+		}
+	}
+
+	//スレッドを再開
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			ResumeThread(array_hDebugThread[i]);
+	}
+}
+
+
+ULONG_PTR rva_to_real(DWORD p){
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	return p+ImageBase+MemPos_CodeSection;
+}
+
+void ShowVarList(DEBUG_EVENT *pde,BOOL bExit){
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+
+	//デバッグダイアログを表示
+	extern HINSTANCE hInst;
+	extern HWND hMainDlg;
+	extern HWND hDebugWnd;
+	dwStepRun=0;
+	if(!hDebugWnd) SendMessage(hMainDlg,WM_SHOWVARLIST,0,pde->dwThreadId);
+	else InitVarList(pde->dwThreadId);
+
+	if(bExit){
+		//"中断"
+		SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+		extern HWND hDebuggerToolbar;
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_START,TBSTATE_INDETERMINATE);
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPOVER,TBSTATE_INDETERMINATE);
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPIN,TBSTATE_INDETERMINATE);
+	}
+	else{
+		//"継続"
+		SetDlgItemText(hDebugWnd,IDCANCEL,STRING_CONTINUE);
+	}
+	while(hDebugWnd&&dwStepRun==0) Sleep(1);
+}
+void DebugMessage(char *buffer){
+	extern HWND hMainDlg;
+	int pos;
+
+	if(!IsWindowEnabled(GetDlgItem(hMainDlg,IDC_DEBUGLIST))){
+		SetDlgItemText(hMainDlg,IDC_DEBUGLIST,"");
+		EnableWindow(GetDlgItem(hMainDlg,IDC_DEBUGLIST),1);
+	}
+
+	pos=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_DEBUGLIST));
+	SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_SETSEL,pos,pos);
+	SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer);
+}
+GlobalProc *GetSubFromObp(ULONG_PTR pos){
+	extern GlobalProc **ppSubHash;
+	GlobalProc *pUserProc;
+	int i2;
+
+	for(i2=0;i2<MAX_HASH;i2++){
+		pUserProc=ppSubHash[i2];
+		while(pUserProc){
+			if(rva_to_real(pUserProc->beginOpAddress) <= pos  &&
+				pos < rva_to_real(pUserProc->endOpAddress))
+				return pUserProc;
+
+			pUserProc=pUserProc->pNextData;
+		}
+	}
+	return 0;
+}
+void ReleaseSingleStep(DWORD dwBeforeStepRun,HANDLE hThread,CONTEXT *pContext){
+	//以前にシングルステップ実行をした場合
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+	int i2;
+	ULONG_PTR lpAccBytes;
+
+	///////////////////////////
+	// シングルステップOFF
+	///////////////////////////
+
+	//ユーザー指定のブレークポイントをセット
+	WriteProcessMemory(hDebugProcess,
+		(void *)(ULONG_PTR)(ImageBase+MemPos_CodeSection),
+		pobj_DBDebugSection->pobj_now->BreakStepCodeBuffer,
+		FileSize_CodeSection,&lpAccBytes);
+
+	//次に実行すべき命令はユーザー指定によるブレークポイントをはずしておく
+	if(ImageBase+MemPos_CodeSection<=EIP_RIP(*pContext)&&EIP_RIP(*pContext)<ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+		if(OpBuffer[EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection-1]!=
+			pobj_DBDebugSection->pobj_now->BreakStepCodeBuffer[EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection-1]){
+			//直前のブレークポイントがユーザー指定によるものだったとき
+
+			//eip/ripを1だけ減少
+			EIP_RIP(*pContext)--;
+			SetThreadContext(hThread,pContext);
+
+			//ブレークポイントを解除
+			WriteProcessMemory(hDebugProcess,(void *)EIP_RIP(*pContext),&OpBuffer[EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection],1,&lpAccBytes);
+
+
+			extern int StepCursorObpSchedule;
+			if(StepCursorObpSchedule==(int)(EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection)){
+				//カーソル行までのステップ実行の場合
+				pobj_DBDebugSection->pobj_now->BreakStepCodeBuffer[StepCursorObpSchedule]=StepCursor_BackupChar;
+				StepCursorObpSchedule=-1;
+			}
+
+			return;
+		}
+	}
+
+
+	if(dwBeforeStepRun){
+		//直前にシングルステップを行った場合
+		if(ImageBase+MemPos_CodeSection <= EIP_RIP(*pContext) &&
+			EIP_RIP(*pContext) < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+			//オリジナルコード内のみ、シングルステップ用の"int 3"を考慮
+			EIP_RIP(*pContext)--;
+			SetThreadContext(hThread,pContext);
+		}
+
+		//他のスレッドのサスペンドを解除
+		for(i2=0;i2<MAX_DEBUG_THREAD;i2++){
+			if(array_hDebugThread[i2] && hThread!=array_hDebugThread[i2])
+				ResumeThread(array_hDebugThread[i2]);
+		}
+	}
+}
+
+void Set_DebugSys_dwThreadID(){
+	int i;
+	for(i=0;i<pobj_DBDebugSection->num;i++){
+		ULONG_PTR lpAccBytes;
+		WriteProcessMemory(hDebugProcess,
+			(void *)(ULONG_PTR)(pobj_DBDebugSection->ppobj_ds[i]->dwImageBase + pobj_DBDebugSection->ppobj_ds[i]->dwRVA_RWSection),
+			_DebugSys_dwThreadID,sizeof(DWORD)*MAX_DEBUG_THREAD,&lpAccBytes);
+	}
+}
+void AddThread(DWORD dwThreadId, HANDLE hThread){
+	int i;
+
+
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]==0){
+			_DebugSys_dwThreadID[i]=dwThreadId;
+			array_hDebugThread[i]=hThread;
+			break;
+		}
+	}
+
+	Set_DebugSys_dwThreadID();
+}
+void DeleteThread(DWORD dwThreadId){
+	int i;
+
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]==dwThreadId){
+			_DebugSys_dwThreadID[i]=0;
+			array_hDebugThread[i]=0;
+			break;
+		}
+	}
+
+	Set_DebugSys_dwThreadID();
+}
+
+void DebugProgram(void){
+	extern HWND hMainDlg;
+	extern char OutputFileName[MAX_PATH];
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	extern int MemPos_RWSection;
+	extern int FileSize_CodeSection;
+	int i2,i3,i4;
+	char temporary[1024];
+
+	extern BOOL bDll;
+	char ExeFilePathForDll[MAX_PATH];
+	if(bDll){
+		//DLLをデバッグする場合
+		extern char szDebugExeForDll[1024];
+		if(szDebugExeForDll[0]){
+			//指定済み
+			lstrcpy(ExeFilePathForDll,szDebugExeForDll);
+		}
+		else{
+			//ユーザーに実行ファイルを選択させる
+			extern HWND hOwnerEditor;
+			extern LPSTR ExeFileFilter;
+			if(!GetFilePathDialog(hOwnerEditor,ExeFilePathForDll,ExeFileFilter,"デバッグ用の実行可能ファイルを指定してください。",1)) return;
+		}
+	}
+
+
+	//"中断"
+	SetDlgItemText(hMainDlg,IDOK,STRING_STOP);
+
+	SendMessage(hOwnerEditor,WM_SETDEBUGGERBASE,0,0);
+
+	//カレントディレクトリを設定
+	extern char BasicCurDir[MAX_PATH];
+	SetCurrentDirectory(BasicCurDir);
+
+	SendDlgItemMessage(hMainDlg,IDC_SHOWERROR,BM_SETCHECK,BST_UNCHECKED,0);
+	SendDlgItemMessage(hMainDlg,IDC_SHOWDEBUG,BM_SETCHECK,BST_CHECKED,0);
+	SendMessage(hMainDlg,WM_COMMAND,IDC_SHOWDEBUG,0);
+
+	//ブレークポイントを生成
+	pobj_DBBreakPoint=new CDBBreakPoint;
+
+
+	extern BOOL bAttach;
+	if(bAttach){
+		extern DWORD dwAttachProcessId;
+
+		//プロセスIDを元にハンドルを取得
+		HANDLE hProcess;
+		hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwAttachProcessId);
+		if(!hProcess) goto AttachError;
+
+		//そのプロセスにおける実行モジュールのインスタンスハンドルを取得
+		HINSTANCE hModule;
+		DWORD cbReturned;
+		if(!EnumProcessModules( hProcess, &hModule, sizeof(HINSTANCE), &cbReturned )) goto AttachError;
+
+		//実行ファイル名を取得
+		GetModuleFileNameEx(hProcess,hModule,OutputFileName,MAX_PATH);
+
+		CloseHandle(hProcess);
+
+/*
+		//デバッグ用の拡張情報を取得
+		pobj_DebugSection->load(OutputFileName);*/
+
+		if(!DebugActiveProcess(dwAttachProcessId)){
+AttachError:
+			DebugMessage("アタッチに失敗しました。");
+			return;
+		}
+	}
+	else{
+		/*if(!pobj_DebugSection->load(OutputFileName)){
+			extern BOOL bDebugCompile;
+			bDebugCompile=1;
+			OutputExe();
+			pobj_DebugSection->load(OutputFileName);
+		}*/
+
+		//スレッドを生成
+		extern char szDebugCmdLine[1024];
+		STARTUPINFO si;
+		PROCESS_INFORMATION pi;
+		memset(&si,0,sizeof(STARTUPINFO));
+		si.cb=sizeof(STARTUPINFO);
+		if(!bDll){
+			//EXEファイルをデバッグ
+			CreateProcess(OutputFileName,szDebugCmdLine,NULL,NULL,0,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&si,&pi);
+		}
+		else{
+			//DLLファイルをデバッグ
+			CreateProcess(ExeFilePathForDll,szDebugCmdLine,NULL,NULL,0,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&si,&pi);
+		}
+
+		CloseHandle(pi.hProcess);
+		CloseHandle(pi.hThread);
+	}
+
+
+	//デバッグ情報データベースを生成
+	pobj_DBDebugSection=new CDBDebugSection();
+
+	//デバッグスレッド情報（プロシージャの階層構造を管理）を生成
+	pobj_dti=new CDebugThreadInfo();
+
+	GlobalProc *pUserProc;
+
+	extern DWORD dwStepRun;
+	BOOL bFirstBreak=1;
+	CONTEXT Context;
+	HANDLE hMainThread;
+	ULONG_PTR lpAccBytes;
+
+	DEBUG_EVENT de;
+	memset(&de,0,sizeof(DEBUG_EVENT));
+
+	while(WaitForDebugEvent(&de,INFINITE)){
+		if(de.dwDebugEventCode==LOAD_DLL_DEBUG_EVENT){
+			WCHAR wcBuf[MAX_PATH];
+			LONG_PTR lpData;
+
+			wcBuf[0]=0;
+			temporary[0]=0;
+
+			if(de.u.LoadDll.lpImageName){
+				if(!ReadProcessMemory(hDebugProcess,de.u.LoadDll.lpImageName,&lpData,sizeof(LONG_PTR),&lpAccBytes)){
+					sprintf(temporary,"ロードされたDLLの名前取得（アドレス:&H%08x）に失敗しました。\r\n",(ULONG_PTR)de.u.LoadDll.lpImageName);
+					DebugMessage(temporary);
+					goto NextContinue;
+				}
+				if(!lpData) goto Attach_DllLoad;
+
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,wcBuf,sizeof(WCHAR)*MAX_PATH,&lpAccBytes)){
+					sprintf(temporary,"ロードされたDLLの名前取得（アドレス:&H%08x）に失敗しました。\r\n",lpData);
+					DebugMessage(temporary);
+					goto NextContinue;
+				}
+
+				if(de.dwThreadId,de.u.LoadDll.fUnicode)
+					WideCharToMultiByte(CP_ACP,0,wcBuf,-1,temporary,255,NULL,NULL);
+				else lstrcpy(temporary,(char *)wcBuf);
+			}
+			else{
+Attach_DllLoad:
+				//アタッチした場合
+				GetModuleFileNameEx(hDebugProcess,(HINSTANCE)de.u.LoadDll.lpBaseOfDll,temporary,MAX_PATH);
+			}
+
+			char temp2[1024];
+			sprintf(temp2,"\"%s\" をロードしました。\r\n",temporary);
+			DebugMessage(temp2);
+
+
+			//可能であればデバッグ情報を読みとる
+			if(pobj_DBDebugSection->add((HMODULE)de.u.LoadDll.lpBaseOfDll)){
+				pobj_DBDebugSection->choice(0);
+				Set_DebugSys_dwThreadID();
+			}
+
+
+			/*if(lstrcmpi(temporary, OutputFileName)==0){
+				ImageBase=(DWORD)de.u.LoadDll.lpBaseOfDll;
+
+				AddThread(de.dwThreadId,hMainThread);
+			}*/
+		}
+		else if(de.dwDebugEventCode==UNLOAD_DLL_DEBUG_EVENT){
+			//DLLのアンロード
+
+			pobj_DBDebugSection->del((HMODULE)de.u.UnloadDll.lpBaseOfDll);
+		}
+		else if(de.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT){
+			hDebugProcess=de.u.CreateProcessInfo.hProcess;
+			hMainThread=de.u.CreateProcessInfo.hThread;
+
+			if(pobj_DBDebugSection->add((HMODULE)de.u.CreateProcessInfo.lpBaseOfImage)){
+				pobj_DBDebugSection->choice(0);
+			}
+
+			AddThread(de.dwThreadId,de.u.CreateProcessInfo.hThread);
+		}
+		else if(de.dwDebugEventCode==CREATE_THREAD_DEBUG_EVENT){
+			AddThread(de.dwThreadId,de.u.CreateThread.hThread);
+		}
+		else if(de.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT){
+			//デバッグダイアログを終了
+			SendMessage(hMainDlg,WM_CLOSE_DEBUGGER,0,0);
+
+			DeleteThread(de.dwThreadId);
+
+			//"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_THREADFINISH,de.dwThreadId,de.u.ExitProcess.dwExitCode);
+			DebugMessage(temporary);
+
+			//"プログラムはコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_PROCESSFINISH,de.u.ExitProcess.dwExitCode);
+			DebugMessage(temporary);
+			break;
+		}
+		else if(de.dwDebugEventCode==EXIT_THREAD_DEBUG_EVENT){
+			//"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_THREADFINISH,de.dwThreadId,de.u.ExitThread.dwExitCode);
+			DebugMessage(temporary);
+
+			//以前にシングルステップ実行をした場合
+			//ステップ実行を解除
+			if(dwStepRun){
+				extern HWND hDebugWnd;
+				if(hDebugWnd) SendMessage(hDebugWnd,WM_VARLIST_CLOSE,0,0);
+
+				for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+					if(de.dwThreadId==_DebugSys_dwThreadID[i4]) break;
+				}
+				Context.ContextFlags=CONTEXT_CONTROL;
+				GetThreadContext(array_hDebugThread[i4],&Context);
+
+				ReleaseSingleStep(dwStepRun,array_hDebugThread[i4],&Context);
+			}
+
+			DeleteThread(de.dwThreadId);
+		}
+		else if(de.dwDebugEventCode==OUTPUT_DEBUG_STRING_EVENT){
+			ReadProcessMemory(hDebugProcess,(void *)de.u.DebugString.lpDebugStringData,temporary,de.u.DebugString.nDebugStringLength,&lpAccBytes);
+			DebugMessage(temporary);
+		}
+		else if(de.dwDebugEventCode==EXCEPTION_DEBUG_EVENT){
+
+			//////////////////////////////////////
+			// モジュールを再確認
+			// ※DLLへのデバッグ分岐を可能にする
+			//////////////////////////////////////
+
+
+			//初回例外は無視
+			if(bFirstBreak){
+				bFirstBreak=0;
+				goto NextContinue;
+			}
+
+			for(i2=0;;i2++){
+				if(_DebugSys_dwThreadID[i2]==de.dwThreadId) break;
+			}
+
+			//スレッド情報をリフレッシュ
+			if(!pobj_dti->Reflesh(i2)){
+				MessageBox(hOwnerEditor,"デバッグ情報が壊れています。ターゲットファイルを再コンパイルしてください。","ActiveBasic",MB_OK|MB_ICONEXCLAMATION);
+
+				break;
+			}
+
+			if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_ACCESS_VIOLATION){
+
+				//"スレッド(&H%X)でアクセス違反がありました(EPI=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_THREAD_ACCESSVIOLATION,de.dwThreadId,(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				MessageBeep(MB_ICONEXCLAMATION);
+				ShowVarList(&de,1);
+				break;
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT||
+				de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP){
+				/////////////////////////
+				// ブレークポイント
+				/////////////////////////
+
+				if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP){
+					//CPU機構のシングルステップによるブレークポイント
+					//※シングルステップを解除
+					ReleaseCPUSingleStep();
+				}
+
+				i3=dwStepRun;
+
+				for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+					if(de.dwThreadId==_DebugSys_dwThreadID[i4]) break;
+				}
+				Context.ContextFlags=CONTEXT_CONTROL;
+				GetThreadContext(array_hDebugThread[i4],&Context);
+
+				if(i3==0||
+					i3&&(!(ImageBase+MemPos_CodeSection<=EIP_RIP(Context)&&EIP_RIP(Context)<ImageBase+MemPos_CodeSection+FileSize_CodeSection))
+					){
+					//"スレッド(&H%X)のブレーク ポイント(EPI=&H%08X)。\r\n"
+					sprintf(temporary,STRING_DEBUG_BREAKPOINT,de.dwThreadId,(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+					DebugMessage(temporary);
+				}
+
+				ShowVarList(&de,0);
+
+				//ステップ実行を解除
+				ReleaseSingleStep(i3,array_hDebugThread[i4],&Context);
+
+				if(dwStepRun){
+					//新たにシングルステップを行う場合
+
+					if(i4!=NextStepThreadNum){
+						//次回のステップ対象が別スレッドの場合
+						Context.ContextFlags=CONTEXT_CONTROL;
+						GetThreadContext(array_hDebugThread[NextStepThreadNum],&Context);
+					}
+
+					if(ImageBase+MemPos_CodeSection <= EIP_RIP(Context) &&
+						EIP_RIP(Context) < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+						//Debug命令語が続く場合はシングルステップは不要になるので、無効にする
+						//（オリジナルコード内のみ）
+						if(OpBuffer[EIP_RIP(Context)-ImageBase-MemPos_CodeSection]==(char)0xCC)
+							dwStepRun=0;
+					}
+					if(dwStepRun==1){
+						//ステップイン
+StepIn:
+						//シングルステップON
+						WriteProcessMemory(hDebugProcess,(void *)(ULONG_PTR)(ImageBase+MemPos_CodeSection),
+							pobj_DBDebugSection->pobj_now->SingleStepCodeBuffer,
+							FileSize_CodeSection,&lpAccBytes);
+
+						//次の命令語のブレーク命令は解除しておく（シングルステップ実行後のみ）
+						//（オリジナルコード内のみ）
+						if(i3&&ImageBase+MemPos_CodeSection<=EIP_RIP(Context)&&EIP_RIP(Context)<ImageBase+MemPos_CodeSection+FileSize_CodeSection)
+							WriteProcessMemory(hDebugProcess,(void *)EIP_RIP(Context),&OpBuffer[EIP_RIP(Context)-ImageBase-MemPos_CodeSection],1,&lpAccBytes);
+
+						//他のスレッドを一時中断
+						for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+							if(_DebugSys_dwThreadID[i4] && NextStepThreadNum!=i4)
+								SuspendThread(array_hDebugThread[i4]);
+						}
+					}
+					else if(dwStepRun==2){
+						//ステップオーバー
+
+						BOOL bRet;
+						bRet=ReadProcessMemory(hDebugProcess,
+							(void *)EIP_RIP(Context),
+							temporary,
+							5,
+							&lpAccBytes);
+						if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
+
+						extern UserProc *pSub_DebugSys_EndProc;
+						if((BYTE)temporary[0]==0xE8&&
+							*((long *)(temporary+1))+5==(long)rva_to_real(pSub_DebugSys_EndProc->beginOpAddress)-(long)EIP_RIP(Context)){
+							//プロシージャの終端位置の場合はステップインを行う
+							goto StepIn;
+						}
+
+						extern int GlobalOpBufferSize;
+						if(ImageBase+MemPos_CodeSection<=pobj_dti->lplpObp[pobj_dti->iProcLevel]&&
+							pobj_dti->lplpObp[pobj_dti->iProcLevel]<ImageBase+MemPos_CodeSection+GlobalOpBufferSize){
+							//シングルステップON
+							WriteProcessMemory(hDebugProcess,
+								(void *)(ULONG_PTR)(ImageBase+MemPos_CodeSection),
+								pobj_DBDebugSection->pobj_now->SingleStepCodeBuffer,
+								GlobalOpBufferSize,
+								&lpAccBytes);
+						}
+						else{
+							//プロシージャを識別
+							pUserProc=GetSubFromObp(pobj_dti->lplpObp[pobj_dti->iProcLevel]);
+
+							//シングルステップON
+							WriteProcessMemory(hDebugProcess,
+								(void *)rva_to_real(pUserProc->beginOpAddress),
+								pobj_DBDebugSection->pobj_now->SingleStepCodeBuffer+pUserProc->beginOpAddress,
+								pUserProc->endOpAddress-pUserProc->beginOpAddress,
+								&lpAccBytes);
+						}
+
+						//次の命令語のブレーク命令は解除しておく（シングルステップ実行後のみ）
+						//（オリジナルコード内のみ）
+						if(i3&&ImageBase+MemPos_CodeSection<=EIP_RIP(Context)&&EIP_RIP(Context)<ImageBase+MemPos_CodeSection+FileSize_CodeSection)
+							WriteProcessMemory(hDebugProcess,(void *)EIP_RIP(Context),&OpBuffer[EIP_RIP(Context)-ImageBase-MemPos_CodeSection],1,&lpAccBytes);
+
+						//他のスレッドを一時中断
+						for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+							if(_DebugSys_dwThreadID[i4] && NextStepThreadNum!=i4)
+								SuspendThread(array_hDebugThread[i4]);
+						}
+					}
+				}
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==STATUS_INTEGER_DIVIDE_BY_ZERO){
+				//"0による除算が行われました。スレッド(&H%X) ブレーク ポイント(EPI=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_DIVIDE_BY_ZERO,de.dwThreadId,(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				ShowVarList(&de,1);
+				break;
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==STATUS_NO_MEMORY){
+				//"メモリ不足、またはヒープが壊れていることが原因で、メモリの割り当てに失敗しました。スレッド(&H%X) ブレーク ポイント(EPI=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_DIVIDE_NO_MEMORY,de.dwThreadId,(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				ShowVarList(&de,1);
+				break;
+			}
+			else{
+				//"例外処理\ncode:%X"
+				sprintf(temporary,STRING_DEBUG_ERROR,de.u.Exception.ExceptionRecord.ExceptionCode);
+				DebugMessage(temporary);
+			}
+		}
+NextContinue:
+		ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
+	}
+
+	extern HWND hDebugWnd;
+	if(hDebugWnd) SendMessage(hDebugWnd,WM_COMMAND,IDCANCEL,0);
+
+	//デバッグに利用した情報を解放
+	delete pobj_DBDebugSection;
+
+	//デバッグスレッド情報を解放
+	delete pobj_dti;
+
+	//ブレークポイントを解放
+	delete pobj_DBBreakPoint;
+
+	//"閉じる"
+	SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+	SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERBASE,0,0);
+}
Index: /trunk/abdev/BasicCompiler_Common/DebugMiddleFile.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/DebugMiddleFile.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/DebugMiddleFile.cpp	(revision 147)
@@ -0,0 +1,1056 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+#define MDLFILE_VER	0x70000003
+
+
+void SetLpIndex_DebugFile(char *buffer,int *p,const Type &type){
+	if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
+		lstrcpy(buffer+(*p),type.GetClass().GetName().c_str());
+		(*p)+=lstrlen(buffer+(*p))+1;
+	}
+	else{
+		*(LONG_PTR *)(buffer+(*p))=type.GetIndex();
+		(*p)+=sizeof(LONG_PTR);
+	}
+}
+
+
+void GetLpIndex_DebugFile(char *buffer,int *p,Type &type){
+	if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
+		char szClassName[VN_SIZE];
+		lstrcpy(szClassName,buffer+(*p));
+		(*p)+=lstrlen(buffer+(*p))+1;
+
+		type.SetIndex( (LONG_PTR)pobj_DBClass->Find(szClassName) );
+	}
+	else{
+		type.SetIndex( *(LONG_PTR *)(buffer+(*p)) );
+		(*p)+=sizeof(LONG_PTR);
+	}
+}
+
+
+
+CDebugSection::CDebugSection(){
+	memset(this,0,sizeof(CDebugSection));
+}
+CDebugSection::~CDebugSection(){
+	if(pobj_DBClass) DeleteDebugInfo();
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+}
+void CDebugSection::make(void){
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	int i2,i3,i5,BufferSize;
+
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+
+	i2=0;
+
+	extern char *basbuf;
+	BufferSize=lstrlen(basbuf)+65535;
+	buffer=(char *)HeapAlloc(hHeap,0,BufferSize);
+
+	//デバッグ用ファイルのバージョン
+	*(long *)(buffer+i2)=MDLFILE_VER;
+	i2+=sizeof(long);
+
+	//プラットフォームのビット数
+	*(long *)(buffer+i2)=PLATFORM;
+	i2+=sizeof(long);
+
+	//インクルード情報
+	*(long *)(buffer+i2)=IncludeFileInfo.FilesNum;
+	i2+=sizeof(long);
+	for(i3=0;i3<IncludeFileInfo.FilesNum;i3++){
+		lstrcpy(buffer+i2,IncludeFileInfo.ppFileNames[i3]);
+		i2+=lstrlen(buffer+i2)+1;
+	}
+	buffer[i2++]=0;
+	for(i3=0;;i3++){
+		buffer[i2++]=(char)IncludeFileInfo.LineOfFile[i3];
+		if(IncludeFileInfo.LineOfFile[i3]==-1) break;
+	}
+
+	//ソースコード
+	lstrcpy(buffer+i2,basbuf);
+	i2+=lstrlen(buffer+i2)+1;
+
+
+	////////////////////////
+	// コードと行番号の関係
+	////////////////////////
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+
+	//バッファが足りない場合は再確保
+	if(MaxLineInfoNum*sizeof(LINEINFO)<32768) i3=32768;
+	else i3=MaxLineInfoNum*sizeof(LINEINFO)+32768;
+	if(BufferSize<i2+i3){
+		BufferSize+=i3;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+	}
+
+	*(long *)(buffer+i2)=MaxLineInfoNum;
+	i2+=sizeof(long);
+	memcpy(buffer+i2,pLineInfo,MaxLineInfoNum*sizeof(LINEINFO));
+	i2+=MaxLineInfoNum*sizeof(LINEINFO);
+
+
+
+	////////////////////////////////////////////
+	// クラス情報（名前のみ。詳細は後で保存）
+	////////////////////////////////////////////
+
+	//イテレータをリセット
+	extern CDBClass *pobj_DBClass;
+	pobj_DBClass->Iterator_Reset();
+
+	//個数
+	*(long *)(buffer+i2)=pobj_DBClass->Iterator_GetMaxCount();
+	i2+=sizeof(long);
+
+	while(pobj_DBClass->Iterator_HasNext()){
+		CClass *pobj_c;
+		pobj_c=pobj_DBClass->Iterator_GetNext();
+
+		//クラス名
+		lstrcpy(buffer+i2,pobj_c->GetName().c_str());
+		i2+=lstrlen(buffer+i2)+1;
+	}
+
+
+
+	//////////////////
+	// TypeDef情報
+	//////////////////
+	*(long *)(buffer+i2)=(int)Smoothie::Meta::typeDefs.size();
+	i2+=sizeof(long);
+	for(i3=0;i3<(int)Smoothie::Meta::typeDefs.size();i3++){
+		lstrcpy(buffer+i2,Smoothie::Meta::typeDefs[i3].GetName().c_str() );
+		i2+=lstrlen(buffer+i2)+1;
+
+		lstrcpy(buffer+i2,Smoothie::Meta::typeDefs[i3].GetBaseName().c_str() );
+		i2+=lstrlen(buffer+i2)+1;
+
+		//バッファが足りない場合は再確保
+		if(BufferSize<i2+32768){
+			BufferSize+=32768;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+		}
+	}
+
+
+	//グローバル変数情報
+	*(long *)(buffer+i2)=(int)::globalVars.size();
+	i2+=sizeof(long);
+	foreach( Variable *pVar, ::globalVars ){
+		//変数名
+		lstrcpy(buffer+i2,pVar->GetName().c_str());
+		i2+=lstrlen(buffer+i2)+1;
+
+		//型
+		*(long *)(buffer+i2)=pVar->GetBasicType();
+		i2+=sizeof(long);
+
+		//型の拡張情報
+		SetLpIndex_DebugFile(buffer,&i2,*pVar);
+
+		buffer[i2++] = pVar->IsRef() ? 1 : 0;
+
+		buffer[i2++] = pVar->IsArray() ? 1 : 0;
+
+		if(pVar->IsArray()){
+			for(i5=0;;i5++){
+				*(long *)(buffer+i2)=pVar->GetSubScriptsPtr()[i5];
+				i2+=sizeof(long);
+				if(pVar->GetSubScriptsPtr()[i5]==-1) break;
+			}
+		}
+
+		//レキシカルスコープ情報
+		*(long *)(buffer+i2)=pVar->ScopeStartAddress;
+		i2+=sizeof(long);
+		*(long *)(buffer+i2)=pVar->ScopeEndAddress;
+		i2+=sizeof(long);
+		*(long *)(buffer+i2)=pVar->ScopeLevel;
+		i2+=sizeof(long);
+
+		//メモリ位置
+		*(long *)(buffer+i2)=pVar->offset;
+		i2+=sizeof(long);
+
+		//バッファが足りない場合は再確保
+		if(BufferSize<i2+32768){
+			BufferSize+=32768;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+		}
+	}
+
+	//グローバル実行領域のサイズ
+	extern int GlobalOpBufferSize;
+	*(long *)(buffer+i2)=GlobalOpBufferSize;
+	i2+=sizeof(long);
+
+	//プロシージャ情報
+	extern GlobalProc **ppSubHash;
+	extern int SubNum;
+	GlobalProc *pUserProc;
+	*(long *)(buffer+i2)=SubNum;
+	i2+=sizeof(long);
+	for(i3=0;i3<MAX_HASH;i3++){
+		pUserProc=ppSubHash[i3];
+		while(pUserProc){
+			if(pUserProc->GetParentClassPtr()){
+				lstrcpy(buffer+i2,pUserProc->GetParentClassPtr()->GetName().c_str());
+				i2+=lstrlen(buffer+i2)+1;
+			}
+			else{
+				lstrcpy(buffer+i2,"");
+				i2+=lstrlen(buffer+i2)+1;
+			}
+
+			//ID
+			*(long *)(buffer+i2)=pUserProc->id;
+			i2+=sizeof(long);
+
+			//関数名
+			lstrcpy(buffer+i2,pUserProc->GetName().c_str());
+			i2+=lstrlen(buffer+i2)+1;
+
+			*(long *)(buffer+i2)=pUserProc->beginOpAddress;
+			i2+=sizeof(long);
+			*(long *)(buffer+i2)=pUserProc->endOpAddress;
+			i2+=sizeof(long);
+
+			//ローカル変数情報
+			*(long *)(buffer+i2)=(int)pUserProc->localVars.size();
+			i2+=sizeof(long);
+
+			//バッファが足りない場合は再確保
+			if(BufferSize<i2+32768){
+				BufferSize+=32768;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+			}
+
+			foreach( Variable *pVar, pUserProc->localVars ){
+				lstrcpy(buffer+i2,pVar->GetName().c_str());
+				i2+=lstrlen(buffer+i2)+1;
+
+				//型
+				*(long *)(buffer+i2)=pVar->GetBasicType();
+				i2+=sizeof(long);
+
+				//型の拡張情報
+				SetLpIndex_DebugFile(buffer,&i2,*pVar);
+
+				//参照型パラメータかどうか
+				buffer[i2++] = pVar->IsRef() ? 1 : 0;
+
+				//配列かどうか
+				buffer[i2++] = pVar->IsArray() ? 1 : 0;
+
+				//配列要素
+				if(pVar->IsArray()){
+					for(i5=0;;i5++){
+						*(long *)(buffer+i2)=pVar->GetSubScriptsPtr()[i5];
+						i2+=sizeof(long);
+						if(pVar->GetSubScriptsPtr()[i5]==-1) break;
+					}
+				}
+
+				//レキシカルスコープ情報
+				*(long *)(buffer+i2)=pVar->ScopeStartAddress;
+				i2+=sizeof(long);
+				*(long *)(buffer+i2)=pVar->ScopeEndAddress;
+				i2+=sizeof(long);
+				*(long *)(buffer+i2)=pVar->ScopeLevel;
+				i2+=sizeof(long);
+
+				//メモリ位置
+				*(long *)(buffer+i2)=pVar->offset;
+				i2+=sizeof(long);
+
+
+
+
+				//バッファが足りない場合は再確保
+				if(BufferSize<i2+32768){
+					BufferSize+=32768;
+					buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+				}
+			}
+
+			pUserProc=pUserProc->pNextData;
+		}
+	}
+
+
+
+	///////////////////
+	// クラス情報
+	///////////////////
+
+	//イテレータをリセット
+	pobj_DBClass->Iterator_Reset();
+
+	while(pobj_DBClass->Iterator_HasNext()){
+		CClass *pobj_c;
+		pobj_c=pobj_DBClass->Iterator_GetNext();
+
+
+		//クラス名
+		lstrcpy(buffer+i2,pobj_c->GetName().c_str());
+		i2+=lstrlen(buffer+i2)+1;
+
+		//仮想関数の数
+		*(long *)(buffer+i2)=pobj_c->GetVtblNum();
+		i2+=sizeof(long);
+
+		//アラインメント
+		*(long *)(buffer+i2)=pobj_c->iAlign;
+		i2+=sizeof(long);
+
+		//メンバ
+		*(long *)(buffer+i2)=(int)pobj_c->dynamicMembers.size();
+		i2+=sizeof(long);
+		foreach( CMember *member, pobj_c->dynamicMembers ){
+			// 名前
+			lstrcpy(buffer+i2,member->GetName().c_str());
+			i2+=lstrlen(buffer+i2)+1;
+
+			// 型
+			*(long *)(buffer+i2)=member->GetType().GetBasicType();
+			i2+=sizeof(long);
+
+			// 型の拡張情報
+			SetLpIndex_DebugFile(buffer,&i2,member->GetType());
+
+			// アクセシビリティ
+			*(Prototype::Accessibility *)(buffer+i2)=member->GetAccessibility();
+			i2+=sizeof(Prototype::Accessibility);
+
+			memcpy(buffer+i2,member->SubScripts,sizeof(int)*MAX_ARRAYDIM);
+			i2+=sizeof(int)*MAX_ARRAYDIM;
+
+			//バッファが足りない場合は再確保
+			if(BufferSize<i2+32768){
+				BufferSize+=32768;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+			}
+		}
+
+		//メソッド
+		*(long *)(buffer+i2)=(long)pobj_c->methods.size();
+		i2+=sizeof(long);
+		foreach( const CMethod *pMethod, pobj_c->methods ){
+			*(Prototype::Accessibility *)(buffer+i2)=pMethod->GetAccessibility();
+			i2+=sizeof(Prototype::Accessibility);
+			if( pMethod->GetInheritsClassPtr() ){
+				lstrcpy(buffer+i2,pMethod->GetInheritsClassPtr()->GetName().c_str());
+				i2+=lstrlen(buffer+i2)+1;
+			}
+			else{
+				lstrcpy(buffer+i2,"");
+				i2+=lstrlen(buffer+i2)+1;
+			}
+			lstrcpy(buffer+i2,pMethod->pUserProc->GetName().c_str());
+			i2+=lstrlen(buffer+i2)+1;
+		}
+
+		//静的メンバ
+		*(long *)(buffer+i2)=(long)pobj_c->staticMembers.size();
+		i2+=sizeof(long);
+		foreach( CMember *member, pobj_c->staticMembers ){
+			// 名前
+			lstrcpy(buffer+i2,member->GetName().c_str());
+			i2+=lstrlen(buffer+i2)+1;
+
+			// 型
+			*(long *)(buffer+i2)=member->GetType().GetBasicType();
+			i2+=sizeof(long);
+
+			// 型の拡張情報
+			SetLpIndex_DebugFile(buffer,&i2,member->GetType());
+
+			// アクセシビリティ
+			*(Prototype::Accessibility *)(buffer+i2)=member->GetAccessibility();
+			i2+=sizeof(Prototype::Accessibility);
+
+			memcpy(buffer+i2,member->SubScripts,sizeof(int)*MAX_ARRAYDIM);
+			i2+=sizeof(int)*MAX_ARRAYDIM;
+
+			//バッファが足りない場合は再確保
+			if(BufferSize<i2+32768){
+				BufferSize+=32768;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+			}
+		}
+
+		//バッファが足りない場合は再確保
+		if(BufferSize<i2+32768){
+			BufferSize+=32768;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+		}
+	}
+
+	length=i2;
+}
+
+char *CDebugSection::MakeSingleStepCode(void){
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,SizeOf_CodeSection);
+
+	memcpy(buffer,OpBuffer,SizeOf_CodeSection);
+
+	int i2;
+	for(i2=0;i2<MaxLineInfoNum;i2++){
+		if(!(
+			pLineInfo[i2].dwCodeType&CODETYPE_SYSTEMPROC||
+			pLineInfo[i2].dwCodeType&CODETYPE_DEBUGPROC
+			)){
+			//int 3
+			buffer[pLineInfo[i2].TopObp]=(char)0xCC;
+		}
+	}
+
+	return buffer;
+}
+BOOL CDebugSection::__load(void){
+	int i2,i3,i4,i5,num;
+	char temp2[MAX_PATH],*temp5;
+
+	pobj_CompilingClass = NULL;
+
+	i2=0;
+
+	//デバッグ用ファイルのバージョンをチェック
+	if(*(long *)(buffer+i2)<MDLFILE_VER){
+		HeapDefaultFree(buffer);
+		return 0;
+	}
+	i2+=sizeof(long);
+
+	//プラットフォームのビット数をチェック
+	if(*(long *)(buffer+i2)!=PLATFORM){
+		HeapDefaultFree(buffer);
+		return 0;
+	}
+	i2+=sizeof(long);
+
+	//インクルード情報
+	IncludeFileInfo.FilesNum=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+	IncludeFileInfo.ppFileNames=(char **)HeapAlloc(hHeap,0,IncludeFileInfo.FilesNum*sizeof(char *));
+	for(i3=0;i3<IncludeFileInfo.FilesNum;i3++){
+		if(buffer[i2]=='\0') break;
+		IncludeFileInfo.ppFileNames[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(buffer+i2)+1);
+		lstrcpy(IncludeFileInfo.ppFileNames[i3],buffer+i2);
+		i2+=lstrlen(buffer+i2)+1;
+	}
+	for(i2++,i3=0;;i2++,i3++){
+		IncludeFileInfo.LineOfFile[i3]=(long)buffer[i2];
+		if(IncludeFileInfo.LineOfFile[i3]==-1) break;
+	}
+
+	//ソースコード
+	i2++;
+	source.SetBuffer( buffer + i2 );
+	i2+=lstrlen(buffer+i2)+1;
+
+	//コードと行番号の関係
+	MaxLineInfoNum=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+	pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,MaxLineInfoNum*sizeof(LINEINFO)+1);
+	memcpy(pLineInfo,buffer+i2,MaxLineInfoNum*sizeof(LINEINFO));
+	i2+=MaxLineInfoNum*sizeof(LINEINFO);
+
+
+	///////////////////////////////////////////
+	// クラス情報（名前のみ。詳細は後で取得）
+	///////////////////////////////////////////
+
+	this->pobj_DBClass=new CDBClass();
+
+	int iMaxClassCount;
+	iMaxClassCount=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+	for(i3=0;i3<iMaxClassCount;i3++){
+		//クラス名
+		// TODO: 名前空間が未完成
+		pobj_DBClass->AddClass(NamespaceScopes(),NamespaceScopesCollection(),buffer+i2,0);
+		i2+=lstrlen(buffer+i2)+1;
+	}
+
+	extern CDBClass *pobj_DBClass;
+	pobj_DBClass=this->pobj_DBClass;
+
+
+	//////////////////
+	// TypeDef情報
+	//////////////////
+
+	//初期化
+	Smoothie::Meta::typeDefs.clear();
+
+	//個数を取得
+	num=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+	for(i3=0;i3<num;i3++){
+		temp5=buffer+i2;
+		i2+=lstrlen(buffer+i2)+1;
+
+		// 名前空間に未対応
+		Smoothie::Meta::typeDefs.push_back( TypeDef( NamespaceScopes(), temp5, buffer+i2 ) );
+
+		i2+=lstrlen(buffer+i2)+1;
+	}
+
+	//定数を取得
+	GetConstInfo();
+	extern CONSTINFO **ppConstHash;
+	this->ppConstHash=ppConstHash;
+
+
+	//グローバル変数情報
+	globalVars.clear();
+	int maxGlobalVars=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+	for(i3=0;i3<maxGlobalVars;i3++){
+
+		//変数名
+		char *name = buffer+i2;
+		i2+=lstrlen(buffer+i2)+1;
+
+		int basicType = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		Type type( basicType );
+		GetLpIndex_DebugFile(buffer,&i2,type);
+
+		bool isRef = (buffer[i2++]) ? true:false;
+
+		bool isArray = (buffer[i2++]) ? true:false;
+
+		Variable *pVar = new Variable( name, type, false, isRef );
+
+		if(isArray){
+			int SubScripts[MAX_ARRAYDIM];
+			for(i4=0;;i4++){
+				SubScripts[i4]=*(long *)(buffer+i2);
+				i2+=sizeof(long);
+
+				if(SubScripts[i4]==-1) break;
+			}
+
+			pVar->SetArray( SubScripts );
+		}
+
+		//レキシカルスコープ情報
+		pVar->ScopeStartAddress=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+		pVar->ScopeEndAddress=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+		pVar->ScopeLevel=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		//メモリ位置
+		pVar->offset=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		//変数を追加
+		globalVars.push_back( pVar );
+	}
+
+	//グローバル実行領域のサイズ
+	GlobalOpBufferSize=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+
+	//プロシージャ情報
+	GlobalProc *pUserProc;
+	SubNum=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+	ppSubHash=(GlobalProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(GlobalProc *));
+	for(int i6=0;i6<SubNum;i6++){
+		char szParentClassName[VN_SIZE];
+		lstrcpy(szParentClassName,buffer+i2);
+		i2+=lstrlen(buffer+i2)+1;
+
+		const CClass *pClass = NULL;
+		if(szParentClassName[0]){
+			pClass=pobj_DBClass->Find(szParentClassName);
+		}
+
+		//ID
+		int id=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		//名前
+		char *name = buffer+i2;
+		i2+=lstrlen(buffer+i2)+1;
+
+		// オブジェクトを生成
+		// TODO: 名前空間が未完成
+		pUserProc = new GlobalProc( NamespaceScopes(), NamespaceScopesCollection(), name, Procedure::Function, false, false, false );
+		pUserProc->pNextData=0;
+		pUserProc->id=id;
+		pUserProc->SetParentClass( pClass );
+
+		pUserProc->beginOpAddress=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+		pUserProc->endOpAddress=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		pUserProc->CompleteCompile();
+
+		//ローカル変数情報
+		pUserProc->localVars.clear();
+		int maxLocalVar=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+		for(i3=0;i3<maxLocalVar;i3++){
+			//変数名
+			char *name = buffer+i2;
+			i2+=lstrlen(buffer+i2)+1;
+
+			int basicType = *(long *)(buffer+i2);
+			i2+=sizeof(long);
+
+			Type type( basicType );
+			GetLpIndex_DebugFile(buffer,&i2,type);
+
+			bool isRef = (buffer[i2++]) ? true:false;
+
+			bool isArray = (buffer[i2++]) ? true:false;
+
+			Variable *pVar = new Variable( name, type, false, isRef );
+
+			if(isArray){
+				int SubScripts[MAX_ARRAYDIM];
+				for(i4=0;;i4++){
+					SubScripts[i4]=*(long *)(buffer+i2);
+					i2+=sizeof(long);
+
+					if(SubScripts[i4]==-1) break;
+				}
+
+				pVar->SetArray( SubScripts );
+			}
+
+			//レキシカルスコープ情報
+			pVar->ScopeStartAddress=*(long *)(buffer+i2);
+			i2+=sizeof(long);
+			pVar->ScopeEndAddress=*(long *)(buffer+i2);
+			i2+=sizeof(long);
+			pVar->ScopeLevel=*(long *)(buffer+i2);
+			i2+=sizeof(long);
+
+			//メモリ位置
+			pVar->offset=*(long *)(buffer+i2);
+			i2+=sizeof(long);
+
+			//変数を追加
+			pUserProc->localVars.push_back( pVar );
+		}
+
+
+		/////////////////////////////////
+		// 格納位置を計算してpUserProcをセット
+		/////////////////////////////////
+
+		i4=hash_default(pUserProc->GetName().c_str());
+
+		GlobalProc *psi2;
+		if(ppSubHash[i4]){
+			psi2=ppSubHash[i4];
+			while(1){
+				if(psi2->pNextData==0){
+					psi2->pNextData=pUserProc;
+					break;
+				}
+				psi2=psi2->pNextData;
+			}
+		}
+		else{
+			ppSubHash[i4]=pUserProc;
+		}
+	}
+
+	//クラス情報
+	CClass *pobj_c;
+	for(i3=0;i3<iMaxClassCount;i3++){
+		//クラス名
+		char szClassName[VN_SIZE];
+		lstrcpy(szClassName,buffer+i2);
+		i2+=lstrlen(buffer+i2)+1;
+
+		pobj_c =  const_cast<CClass *>( pobj_DBClass->Find(szClassName) );
+
+		//仮想関数の数
+		pobj_c->SetVtblNum( *(long *)(buffer+i2) );
+		i2+=sizeof(long);
+
+		//アラインメント
+		pobj_c->iAlign=*(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		//静的メンバ
+		int nDynamicMember = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+		for( i4=0; i4<nDynamicMember; i4++ ){
+			// 名前
+			string name = (char *)(buffer+i2);
+			i2+=lstrlen(buffer+i2)+1;
+
+			// 型
+			Type type( *(long *)(buffer+i2) );
+			i2+=sizeof(long);
+
+			// 型の拡張情報
+			GetLpIndex_DebugFile(buffer,&i2,type);
+
+			// アクセシビリティ
+			Prototype::Accessibility accessibility = *(Prototype::Accessibility *)(buffer+i2);
+			i2+=sizeof(Prototype::Accessibility);
+
+			CMember *member=new CMember( accessibility, name, type, false );
+
+			memcpy(member->SubScripts,buffer+i2,sizeof(int)*MAX_ARRAYDIM);
+			i2+=sizeof(int)*MAX_ARRAYDIM;
+
+			pobj_c->dynamicMembers.push_back( member );
+		}
+
+		//メソッド
+		int nMethod = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+		for( i4=0; i4<nMethod; i4++ ){
+
+			Prototype::Accessibility accessibility=*(Prototype::Accessibility *)(buffer+i2);
+			i2+=sizeof(Prototype::Accessibility);
+
+			char szInherits[VN_SIZE];
+			lstrcpy(szInherits,buffer+i2);
+			i2+=lstrlen(buffer+i2)+1;
+
+			const CClass *pobj_InheritsClass = NULL;
+			if(szInherits[0]){
+				pobj_InheritsClass=pobj_DBClass->Find(szInherits);
+			}
+
+			lstrcpy(temp2,buffer+i2);
+			i2+=lstrlen(buffer+i2)+1;
+
+			const CClass *pobj_temp_c;
+			pobj_temp_c=pobj_InheritsClass;
+			if(pobj_temp_c==0) pobj_temp_c=pobj_c;
+			i5=hash_default(temp2);
+			pUserProc=ppSubHash[i5];
+			while(1){
+				if( pUserProc->GetName() == temp2 &&pUserProc->GetParentClassPtr()==pobj_temp_c) break;
+				pUserProc=pUserProc->pNextData;
+			}
+
+			CMethod *pMethod = new DynamicMethod( pUserProc, accessibility, 0,0,false, pobj_InheritsClass);
+
+			pobj_c->methods.push_back( pMethod );
+		}
+
+		//静的メンバ
+		int nStaticMember = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+		for( i4=0; i4<nStaticMember; i4++ ){
+			// 名前
+			string name = (char *)(buffer+i2);
+			i2+=lstrlen(buffer+i2)+1;
+
+			// 型
+			Type type( *(long *)(buffer+i2) );
+			i2+=sizeof(long);
+
+			// 型の拡張情報
+			GetLpIndex_DebugFile(buffer,&i2,type);
+
+			// アクセシビリティ
+			Prototype::Accessibility accessibility = *(Prototype::Accessibility *)(buffer+i2);
+			i2+=sizeof(Prototype::Accessibility);
+
+			CMember *member=new CMember( accessibility, name, type, false );
+
+			memcpy(member->SubScripts,buffer+i2,sizeof(int)*MAX_ARRAYDIM);
+			i2+=sizeof(int)*MAX_ARRAYDIM;
+
+			pobj_c->staticMembers.push_back( member );
+		}
+	}
+
+	HeapDefaultFree(buffer);
+	buffer=0;
+
+
+
+
+	extern GlobalProc **ppSubHash;
+	ppSubHash=this->ppSubHash;
+	pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc");
+
+
+	SingleStepCodeBuffer=MakeSingleStepCode();
+
+
+	/////////////////////////////
+	// ブレークポイントを適用
+	/////////////////////////////
+
+	//インクルード情報
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	IncludeFileInfo=this->IncludeFileInfo;
+
+	//コードと行番号の関係
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+	MaxLineInfoNum=this->MaxLineInfoNum;
+	pLineInfo=this->pLineInfo;
+
+	BreakStepCodeBuffer=pobj_DBBreakPoint->update(OpBuffer,SizeOf_CodeSection);
+
+	//プロセスメモリにコピー
+	extern HANDLE hDebugProcess;
+	SIZE_T accessBytes;
+	WriteProcessMemory(hDebugProcess,(void *)(ULONG_PTR)(dwImageBase+dwRVA_CodeSection),
+		BreakStepCodeBuffer,
+		SizeOf_CodeSection,&accessBytes);
+
+
+	return 1;
+}
+
+BOOL CDebugSection::load(HMODULE hModule){
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+
+
+	extern HANDLE hDebugProcess;
+	SIZE_T accessBytes;
+	IMAGE_DOS_HEADER ImageDosHeader;
+	ReadProcessMemory(hDebugProcess,hModule,&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),&accessBytes);
+
+	int pe_size;
+#ifdef _AMD64_
+	IMAGE_NT_HEADERS64 pe_hdr;
+	pe_size=sizeof(IMAGE_NT_HEADERS64);
+#else
+	IMAGE_NT_HEADERS pe_hdr;
+	pe_size=sizeof(IMAGE_NT_HEADERS);
+#endif
+	ReadProcessMemory(hDebugProcess,(void *)(((ULONG_PTR)hModule)+ImageDosHeader.e_lfanew),&pe_hdr,pe_size,&accessBytes);
+
+	IMAGE_SECTION_HEADER *pSectionHdr;
+	pSectionHdr=(IMAGE_SECTION_HEADER *)HeapAlloc(hHeap,0,pe_hdr.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
+	ReadProcessMemory(hDebugProcess,
+		(void *)(((ULONG_PTR)hModule)+ImageDosHeader.e_lfanew+pe_size),
+		pSectionHdr,
+		pe_hdr.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER),
+		&accessBytes);
+
+	int i;
+	for(i=0;i<pe_hdr.FileHeader.NumberOfSections;i++){
+
+		//リライタブルセクション内の情報
+		if(lstrcmp((char *)pSectionHdr[i].Name,".data")==0){
+			dwRVA_RWSection=pSectionHdr[i].VirtualAddress;
+		}
+
+		//コードセクション内の情報
+		if(lstrcmp((char *)pSectionHdr[i].Name,".text")==0){
+			dwRVA_CodeSection=pSectionHdr[i].VirtualAddress;
+			SizeOf_CodeSection=pSectionHdr[i].SizeOfRawData;
+		}
+
+		//デバッグセクション内の情報
+		if(lstrcmp((char *)pSectionHdr[i].Name,".debug")==0){
+			length=pSectionHdr[i].Misc.VirtualSize;
+			buffer=(char *)HeapAlloc(hHeap,0,length+1);
+
+			ReadProcessMemory(hDebugProcess,
+				(void *)(((ULONG_PTR)hModule)+pSectionHdr[i].VirtualAddress),
+				buffer,
+				length,
+				&accessBytes);
+			buffer[length]=0;
+		}
+
+	}
+	HeapDefaultFree(pSectionHdr);
+
+	if(!buffer) return 0;
+
+
+	dwImageBase=(DWORD)(ULONG_PTR)hModule;
+
+
+
+	if(OpBuffer) HeapDefaultFree(OpBuffer);
+	OpBuffer=(char *)HeapAlloc(hHeap,0,SizeOf_CodeSection);
+
+	ReadProcessMemory(hDebugProcess,
+		(void *)(ULONG_PTR)(dwImageBase+dwRVA_CodeSection),OpBuffer,
+		SizeOf_CodeSection,&accessBytes);
+
+
+	return __load();
+}
+
+void CDebugSection::choice(void){
+	//イメージベース
+	extern DWORD ImageBase;
+	ImageBase=this->dwImageBase;
+
+	//リライタブルセクションのRVA
+	extern int MemPos_RWSection;
+	MemPos_RWSection=this->dwRVA_RWSection;
+
+	//コードセクションのRVAとサイズ
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+	MemPos_CodeSection=this->dwRVA_CodeSection;
+	FileSize_CodeSection=this->SizeOf_CodeSection;
+
+	//インクルード情報
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	IncludeFileInfo=this->IncludeFileInfo;
+
+	//ソースコード
+	Smoothie::Lexical::source = source;
+
+	//コードと行番号の関係
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+	MaxLineInfoNum=this->MaxLineInfoNum;
+	pLineInfo=this->pLineInfo;
+
+	// クラス情報
+	extern CDBClass *pobj_DBClass;
+	pobj_DBClass=this->pobj_DBClass;
+
+	//定数を取得
+	extern CONSTINFO **ppConstHash;
+	ppConstHash=this->ppConstHash;
+
+	//グローバル実行領域のサイズ
+	extern int GlobalOpBufferSize;
+	GlobalOpBufferSize=this->GlobalOpBufferSize;
+
+	//プロシージャ
+	extern char **ppMacroNames;
+	ppMacroNames=0;
+	extern GlobalProc **ppSubHash;
+	extern int SubNum;
+	ppSubHash=this->ppSubHash;
+	SubNum=this->SubNum;
+
+	extern UserProc *pSub_DebugSys_EndProc;
+	pSub_DebugSys_EndProc=this->pSub_DebugSys_EndProc;
+
+	//ネイティブコードバッファ
+	extern char *OpBuffer;
+	OpBuffer=this->OpBuffer;
+}
+
+void CDebugSection::DeleteDebugInfo(void){
+	int i2;
+
+	//インクルード情報を解放
+	for(i2=0;i2<IncludeFileInfo.FilesNum;i2++)
+		HeapDefaultFree(IncludeFileInfo.ppFileNames[i2]);
+	HeapDefaultFree(IncludeFileInfo.ppFileNames);
+
+	//クラスに関するメモリを解放
+	delete pobj_DBClass;
+	pobj_DBClass=0;
+
+	//サブルーチン情報のメモリ解放
+	DeleteSubInfo(ppSubHash,0,0);
+
+	//定数に関する情報を解放
+	DeleteConstInfo(ppConstHash);
+
+	//コードと行番号の関係を解放
+	HeapDefaultFree(pLineInfo);
+
+	//コードバッファを解放
+	HeapDefaultFree(OpBuffer);
+	OpBuffer=0;
+
+	HeapDefaultFree(SingleStepCodeBuffer);
+	SingleStepCodeBuffer=0;
+
+	HeapDefaultFree(BreakStepCodeBuffer);
+	BreakStepCodeBuffer=0;
+}
+
+
+
+CDBDebugSection::CDBDebugSection(){
+	ppobj_ds=(CDebugSection **)HeapAlloc(hHeap,0,1);
+	num=0;
+}
+CDBDebugSection::~CDBDebugSection(){
+	int i;
+	for(i=0;i<num;i++){
+		delete ppobj_ds[i];
+	}
+	HeapDefaultFree(ppobj_ds);
+}
+
+BOOL CDBDebugSection::add(HMODULE hModule){
+	CDebugSection *pobj_d;
+	pobj_d=new CDebugSection();
+	if(!pobj_d->load(hModule)){
+		//デバッグ情報が存在しないとき
+		delete pobj_d;
+		return 0;
+	}
+
+	ppobj_ds=(CDebugSection **)HeapReAlloc(hHeap,0,ppobj_ds,(num+1)*sizeof(CDebugSection *));
+	ppobj_ds[num]=pobj_d;
+	num++;
+
+	return 1;
+}
+
+void CDBDebugSection::del(HMODULE hModule){
+	int i;
+	for(i=0;i<num;i++){
+		if((HMODULE)(ULONG_PTR)ppobj_ds[i]->dwImageBase==hModule){
+			delete ppobj_ds[i];
+
+			num--;
+			for(;i<num;i++){
+				ppobj_ds[i]=ppobj_ds[i+1];
+			}
+			break;
+		}
+	}
+}
+
+void CDBDebugSection::choice(int index){
+	pobj_now=ppobj_ds[index];
+	pobj_now->choice();
+}
+
+
+
+CDBDebugSection *pobj_DBDebugSection;
Index: /trunk/abdev/BasicCompiler_Common/DebugSection.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/DebugSection.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/DebugSection.h	(revision 147)
@@ -0,0 +1,94 @@
+
+class CDebugSection{
+public:
+	char szNowFilePath[MAX_PATH];
+
+	char *buffer;
+	int length;
+
+
+	////////////////////////////////////
+	// デバッグ用の固有情報
+
+	//イメージベース
+	DWORD dwImageBase;
+
+	//リライタブルセクションのRVA
+	DWORD dwRVA_RWSection;
+
+	//コードセクションのRAVとサイズ
+	DWORD dwRVA_CodeSection;
+	int SizeOf_CodeSection;
+
+	//インクルード情報
+	INCLUDEFILEINFO IncludeFileInfo;
+
+	//ソースコード
+	BasicSource source;
+
+	//コードと行番号の関係
+	int MaxLineInfoNum;
+	LINEINFO *pLineInfo;
+
+	// クラス情報
+	CDBClass *pobj_DBClass;
+
+	//定数を取得
+	CONSTINFO **ppConstHash;
+
+	//グローバル実行領域のサイズ
+	int GlobalOpBufferSize;
+
+	//プロシージャ
+	GlobalProc **ppSubHash;
+	int SubNum;
+
+	UserProc *pSub_DebugSys_EndProc;
+
+	//ネイティブコードバッファ
+	char *OpBuffer;
+
+	//シングルステップ用コードバッファ
+	char *SingleStepCodeBuffer;
+
+	//ブレークポイント用コードバッファ
+	char *BreakStepCodeBuffer;
+
+
+	////////////////////////////////////
+
+
+	CDebugSection();
+	~CDebugSection();
+
+	void make(void);
+private:
+	void UpdateBreakPoint(void);
+	char *MakeSingleStepCode(void);
+	BOOL __load(void);
+public:
+	BOOL load(HMODULE hModule);
+
+	void choice(void);
+
+	void DeleteDebugInfo(void);
+};
+
+class CDBDebugSection{
+public:
+	CDebugSection **ppobj_ds;
+	int num;
+
+	CDebugSection *pobj_now;
+
+	CDBDebugSection();
+	~CDBDebugSection();
+
+	BOOL add(HMODULE hModule);
+	void del(HMODULE hModule);
+
+	void choice(int index);
+
+};
+
+extern CDBDebugSection *pobj_DBDebugSection;
Index: /trunk/abdev/BasicCompiler_Common/Diagnose.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Diagnose.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Diagnose.cpp	(revision 147)
@@ -0,0 +1,136 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+
+void Diagnose(){
+	char temporary[8192];
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// グローバル / ローカル コード領域のサイズを調べる
+		///////////////////////////////////////////////////////////////////
+
+		extern int obp;
+		extern int GlobalOpBufferSize;
+		sprintf(temporary, "%d", GlobalOpBufferSize/1024 );
+		Smoothie::Logger::Put( (string)"グローバル領域のコードサイズ: " + temporary + "KB" );
+		sprintf(temporary, "%d", (obp-GlobalOpBufferSize)/1024 );
+		Smoothie::Logger::Put( (string)"ローカル領域のコードサイズ: " + temporary + "KB" );
+		sprintf(temporary, "%d", obp/1024 );
+		Smoothie::Logger::Put( (string)"コードサイズ総量: " + temporary + "KB" );
+	}
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// グローバル関数、クラスメソッドのサイズを調べる
+		///////////////////////////////////////////////////////////////////
+
+		int codeSizeOfGlobalProc = 0;
+		int codeSizeOfClassMethod = 0;
+		for(int i2=0;i2<MAX_HASH;i2++){
+			extern GlobalProc **ppSubHash;
+			GlobalProc *pUserProc = ppSubHash[i2];
+			while(pUserProc){
+				if( pUserProc->IsCompiled() ){
+					if( pUserProc->HasParentClass() ){
+						codeSizeOfClassMethod += pUserProc->GetCodeSize();
+					}
+					else{
+						codeSizeOfGlobalProc += pUserProc->GetCodeSize();
+					}
+				}
+
+				pUserProc=pUserProc->pNextData;
+			}
+		}
+
+		sprintf(temporary, "%d", codeSizeOfGlobalProc/1024 );
+		Smoothie::Logger::Put( (string)"グローバル関数のコードサイズ総量: " + temporary + "KB" );
+		sprintf(temporary, "%d", codeSizeOfClassMethod/1024 );
+		Smoothie::Logger::Put( (string)"クラスメソッドのコードサイズ総量: " + temporary + "KB" );
+	}
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// Enumに必要なのコードサイズを調べる
+		///////////////////////////////////////////////////////////////////
+		int codeSizeOfEnum = 0;
+
+		// イテレータをリセット
+		extern CDBClass *pobj_DBClass;
+		pobj_DBClass->Iterator_Reset();
+
+		while( pobj_DBClass->Iterator_HasNext() ){
+			int codeSizeOfClass = 0;
+
+			CClass &objClass = *pobj_DBClass->Iterator_GetNext();
+
+			if( !objClass.IsEnum() ){
+				// 列挙型以外は無視
+				continue;
+			}
+
+			// 動的メソッド
+			foreach( const CMethod *pMethod, objClass.GetMethods() ){
+				if( pMethod->pUserProc->IsCompiled() ){
+					codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
+				}
+			}
+
+			// 静的メソッド
+			foreach( const CMethod *pMethod, objClass.GetStaticMethods() ){
+					codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
+			}
+
+			codeSizeOfEnum += codeSizeOfClass;
+		}
+
+		sprintf(temporary, "%d", codeSizeOfEnum/1024 );
+		Smoothie::Logger::Put( (string)"Enumのコードサイズ総量: " + temporary + "KB" );
+	}
+
+	Smoothie::Logger::Put( "\n\n" );
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// クラスのサイズを調べる
+		///////////////////////////////////////////////////////////////////
+
+		// イテレータをリセット
+		extern CDBClass *pobj_DBClass;
+		pobj_DBClass->Iterator_Reset();
+
+		while( pobj_DBClass->Iterator_HasNext() ){
+			int codeSizeOfClass = 0;
+
+			CClass &objClass = *pobj_DBClass->Iterator_GetNext();
+
+			// 動的メソッド
+			foreach( const CMethod *pMethod, objClass.GetMethods() ){
+				if( pMethod->pUserProc->IsCompiled() ){
+					codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
+				}
+			}
+
+			// 静的メソッド
+			foreach( const CMethod *pMethod, objClass.GetStaticMethods() ){
+					codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
+			}
+
+			if( codeSizeOfClass ){
+				temporary[0]=0;
+				lstrcat( temporary, "------------------------------------------------------------------\n" );
+				sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.GetName().c_str() );
+				sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass );
+				lstrcat( temporary, "------------------------------------------------------------------\n" );
+				lstrcat( temporary, "\n" );
+				Smoothie::Logger::Put( temporary );
+			}
+		}
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/Enum.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Enum.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Enum.cpp	(revision 147)
@@ -0,0 +1,291 @@
+#include "common.h"
+
+CEnumParent **ppobj_EnumParent;
+int iEnumParentNum;
+
+CEnumMember::CEnumMember(char *name,int value){
+	m_name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
+	lstrcpy(m_name,name);
+
+	m_value=value;
+}
+CEnumMember::~CEnumMember(){
+	if(m_name) HeapDefaultFree(m_name);
+}
+
+
+CEnumParent::CEnumParent( const NamespaceScopes &namespaceScopes, const char *buffer,int nowLine)
+	: namespaceScopes( namespaceScopes )
+{
+	ppobj_EnumMember=(CEnumMember **)HeapAlloc(hHeap,0,1);
+	iEnumMemberNum=0;
+
+	int i=0,i2;
+
+	if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
+	i+=2;
+
+	//列挙体の名前を取得
+	char temporary[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(IsCommandDelimitation(buffer[i])){
+			temporary[i2]=0;
+			break;
+		}
+		if(!IsVariableChar(buffer[i])){
+			SetError(1,NULL,i);
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+	name = temporary;
+
+	if(buffer[i]=='\0'){
+		SetError(22,"Enum",nowLine);
+		return;
+	}
+
+	int NextValue=0;
+	while(1){
+		i++;
+
+		if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break;
+
+		for(i2=0;;i2++,i++){
+			if(IsCommandDelimitation(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			if(buffer[i]=='='){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+		if(temporary[0]=='\0'){
+			if(buffer[i]=='\0'){
+				SetError(22,"Enum",nowLine);
+				break;
+			}
+			continue;
+		}
+
+		if(buffer[i]!='='){
+			NextValue++;
+		}
+		else{
+			char temp2[VN_SIZE];
+			for(i++,i2=0;;i2++,i++){
+				if(IsCommandDelimitation(buffer[i])){
+					temp2[i2]=0;
+					break;
+				}
+				temp2[i2]=buffer[i];
+			}
+			NextValue=atoi(temp2);
+		}
+
+		//メンバを追加
+		ppobj_EnumMember=(CEnumMember **)HeapReAlloc(hHeap,0,ppobj_EnumMember,(iEnumMemberNum+1)*sizeof(CEnumMember *));
+		ppobj_EnumMember[iEnumMemberNum]=new CEnumMember(temporary,NextValue);
+		iEnumMemberNum++;
+	}
+}
+CEnumParent::~CEnumParent(){
+	int i;
+	for(i=0;i<iEnumMemberNum;i++){
+		delete ppobj_EnumMember[i];
+	}
+	HeapDefaultFree(ppobj_EnumMember);
+}
+
+
+
+void CEnumParent::InitEnum(void){
+	ppobj_EnumParent=(CEnumParent **)HeapAlloc(hHeap,0,1);
+	iEnumParentNum=0;
+
+	const char *source = Smoothie::Lexical::source.GetBuffer();
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	namespaceScopes.clear();
+
+	int i2;
+	char temporary[VN_SIZE];
+	for(int i=0;;i++){
+		if(source[i]=='\0') break;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				SetError(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+		if(source[i]==1&&source[i+1]==ESC_ENUM){
+			if(i>=2){
+				if(source[i-2]==1&&source[i-1]==ESC_CONST) continue;
+			}
+			ppobj_EnumParent=(CEnumParent **)HeapReAlloc(hHeap,0,ppobj_EnumParent,(iEnumParentNum+1)*sizeof(CEnumParent *));
+			ppobj_EnumParent[iEnumParentNum]=new CEnumParent( namespaceScopes, source+i,i);
+			iEnumParentNum++;
+		}
+	}
+}
+void CEnumParent::DestroyEnum(void){
+	int i;
+	for(i=0;i<iEnumParentNum;i++){
+		delete ppobj_EnumParent[i];
+	}
+	HeapDefaultFree(ppobj_EnumParent);
+}
+
+char *CEnumParent::GenerateCodes(void){
+	char *buffer;
+	int MaxSize,length;
+	MaxSize=65535;
+	buffer=(char *)HeapAlloc(hHeap,0,MaxSize+65535);
+	length=0;
+
+	buffer[0]=0;
+
+	for(int i=0;i<iEnumParentNum;i++){
+		CEnumParent *parent;
+		parent=ppobj_EnumParent[i];
+
+		BOOST_FOREACH( const string &namespaceStr, parent->GetNamespaceScopes() ){
+			sprintf(buffer+length,"Namespace %s\n",namespaceStr.c_str());
+			length+=lstrlen(buffer+length);
+		}
+
+		sprintf(buffer+length,"Class Enum %s\n",parent->GetName().c_str());
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tInherits EnumBase\n");
+		length+=lstrlen(buffer+length);
+		sprintf(buffer+length,"\tSub %s(value As Long,lpszName As LPSTR)\n",parent->GetName().c_str());
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\t\tEnumBase(value,lpszName)\n");
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tEnd Sub\n");
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"Public\n");
+		length+=lstrlen(buffer+length);
+		sprintf(buffer+length,"\tSub %s()\n",parent->GetName().c_str());
+		length+=lstrlen(buffer+length);
+		if(parent->iEnumMemberNum){
+			sprintf(buffer+length,"\t\tEnumBase(%d,\"%s\")\n",
+				parent->ppobj_EnumMember[0]->m_value,
+				parent->ppobj_EnumMember[0]->m_name);
+			length+=lstrlen(buffer+length);
+		}
+		lstrcpy(buffer+length,"\tEnd Sub\n");
+		length+=lstrlen(buffer+length);
+		sprintf(buffer+length,"\tSub ~%s()\n",parent->GetName().c_str());
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tEnd Sub\n");
+		length+=lstrlen(buffer+length);
+
+		for(int i2=0;i2<parent->iEnumMemberNum;i2++){
+			CEnumMember *member;
+			member=parent->ppobj_EnumMember[i2];
+
+			sprintf(buffer+length,"\tStatic %s As %s(%d,\"%s\")\n",
+				member->m_name,
+				parent->GetName().c_str(),
+				member->m_value,
+				member->m_name);
+			length+=lstrlen(buffer+length);
+		}
+
+		/*
+		sprintf(buffer+length,"\tOverride Function ToString() As String\n",parent->TypeName);
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\t\tSelect Case value\n");
+		length+=lstrlen(buffer+length);
+		for(i2=0;i2<parent->iEnumMemberNum;i2++){
+			CEnumMember *member;
+			member=parent->ppobj_EnumMember[i2];
+
+			sprintf(buffer+length,"\t\t\tCase %d\n",member->m_value);
+			length+=lstrlen(buffer+length);
+			sprintf(buffer+length,"\t\t\t\tReturn \"%s\"\n",member->m_name);
+			length+=lstrlen(buffer+length);
+		}
+		lstrcpy(buffer+length,"\t\tEnd Select\n");
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tEnd Function\n");
+		length+=lstrlen(buffer+length);
+
+		
+		sprintf(buffer+length,"\tSub Operator= (ByRef value As %s)\n",parent->TypeName);
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\t\tThis.Copy(ByVal VarPtr(value))\n");
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tEnd Sub\n");
+		length+=lstrlen(buffer+length);
+
+		sprintf(buffer+length,"\tSub Operator= (ByRef value As String)\n",parent->TypeName);
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\t\tSelect Case value\n");
+		length+=lstrlen(buffer+length);
+		for(i2=0;i2<parent->iEnumMemberNum;i2++){
+			CEnumMember *member;
+			member=parent->ppobj_EnumMember[i2];
+
+			sprintf(buffer+length,"\t\t\tCase \"%s\"\n",member->m_name);
+			length+=lstrlen(buffer+length);
+			sprintf(buffer+length,"\t\t\t\tThis=%s.%s\n",parent->TypeName,member->m_name);
+			length+=lstrlen(buffer+length);
+		}
+		lstrcpy(buffer+length,"\t\tEnd Select\n");
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tEnd Sub\n");
+		length+=lstrlen(buffer+length);
+
+		sprintf(buffer+length,"\tSub Operator= (value As Long)\n",parent->TypeName);
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\t\tm_Value=value\n");
+		length+=lstrlen(buffer+length);
+		lstrcpy(buffer+length,"\tEnd Sub\n");
+		length+=lstrlen(buffer+length);*/
+
+		lstrcpy(buffer+length,"End Class\n");
+		length+=lstrlen(buffer+length);
+
+		BOOST_FOREACH( const string &namespaceStr, parent->GetNamespaceScopes() ){
+			lstrcpy( buffer+length, "End Namespace\n" );
+			length+=lstrlen(buffer+length);
+		}
+
+
+		//バッファ領域が足りなくなった場合はバッファを増量する
+		if(length>MaxSize){
+			MaxSize+=65535;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,MaxSize+65535);
+		}
+	}
+
+	// ログを生成
+	Smoothie::Logger::PutFile( "enum_generated.log", buffer );
+
+	return buffer;
+}
Index: /trunk/abdev/BasicCompiler_Common/Enum.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Enum.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Enum.h	(revision 147)
@@ -0,0 +1,40 @@
+
+
+class CEnumMember{
+public:
+	char *m_name;
+	int m_value;
+	CEnumMember(char *name,int value);
+	~CEnumMember();
+};
+
+class CEnumParent{
+	NamespaceScopes namespaceScopes;
+	string name;
+
+	BOOL bConst;
+
+	CEnumMember **ppobj_EnumMember;
+	int iEnumMemberNum;
+public:
+
+	CEnumParent( const NamespaceScopes &namespaceScopes, const char *buffer,int nowLine);
+	~CEnumParent();
+
+	const NamespaceScopes &GetNamespaceScopes() const
+	{
+		return namespaceScopes;
+	}
+	const string &GetName() const
+	{
+		return name;
+	}
+
+public:
+	static void InitEnum(void);
+	static void DestroyEnum(void);
+
+	static char *GenerateCodes(void);
+};
+extern CEnumParent **ppobj_EnumParent;
+extern int iEnumParentNum;
Index: /trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 147)
@@ -0,0 +1,1211 @@
+#include "../BasicCompiler_Common/common.h"
+
+void ChangeReturnCode(char *buffer){
+
+#ifdef _DEBUG
+	//改行コードの整合性チェック
+	for( int i=0; ; i++ ){
+		if( buffer[i] == '\0' ){
+			break;
+		}
+		if( buffer[i]!='\r' && buffer[i+1]=='\n'
+			||  buffer[i]=='\r' && buffer[i+1]!='\n' ){
+				char temporary[255];
+				strncpy( temporary, buffer + i-100, 130 );
+				temporary[130] = 0;
+				for(int i2=0; ;i2++){
+					if(temporary[i2]=='\r') temporary[i2]='A';
+					if(temporary[i2]=='\n') temporary[i2]='B';
+					if(temporary[i2]=='\0') break;
+				}
+				MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION );
+		}
+	}
+#endif
+
+	//改行コードのCRLFをLFに変換
+	for(int i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
+		buffer[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+}
+void DeleteComment(char *buffer){	//注釈「'」の取り除き
+	int i,i2,i3,IsStr;
+	char *temporary;
+	temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
+	for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+
+			if(i3){
+				//複数行に渡る注釈文の中に改行が存在するとき
+				memset(temporary+i2,'\n',i3);
+				i2+=i3;
+				i3=0;
+			}
+		}
+		if(buffer[i]=='\''&&IsStr==0){
+			//注釈文
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+			while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
+		}
+		if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
+			//注釈文（複数行）
+			i+=2;
+			i3=0;
+			while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
+				if(buffer[i]=='\n') i3++;
+				if(buffer[i]=='\0') break;
+				i++;
+			}
+			if(buffer[i]){
+				i+=2;
+			}
+			i--;
+			i2--;
+			continue;
+		}
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	lstrcpy(buffer,temporary);
+	GlobalFree(temporary);
+}
+void CheckParenthesis(char *buffer){
+	int i,IsStr,PareNum,sw;
+	_int8 bracket[1024];
+
+	for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
+		if(buffer[i]=='\"'){
+			IsStr^=1;
+			continue;
+		}
+
+		else if(buffer[i]=='('&&IsStr==0){
+			bracket[PareNum]=0;
+			PareNum++;
+		}
+		else if(buffer[i]=='['&&IsStr==0){
+			bracket[PareNum]=1;
+			PareNum++;
+		}
+
+		else if(buffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=0||PareNum<0){
+				//"カッコ \'( )\'"
+				SetError(4,STRING_PARENTHESIS,i);
+				return;
+			}
+		}
+		else if(buffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=1||PareNum<0){
+				//"カッコ \'( )\'"
+				SetError(4,STRING_PARENTHESIS,i);
+				return;
+			}
+		}
+
+		else if(buffer[i]=='\n'||buffer[i]=='\0'){
+
+			//"カッコ \'( )\'"
+			if(PareNum!=0) SetError(4,STRING_PARENTHESIS,i);
+
+			if(IsStr!=0) SetError(5,NULL,i);
+			if(buffer[i]=='\0') break;
+			PareNum=0;
+			IsStr=0;
+
+			sw=0;
+		}
+
+		else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
+			//不正な文字コード
+			if(sw==0){
+				//全角スペース
+				if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40)
+					SetError(20,NULL,i);
+
+				//その他の全角文字
+				else SetError(8,NULL,i);
+				sw=1;
+			}
+		}
+	}
+}
+BOOL CheckParenthesis2(char *buffer){
+	int i,IsStr,PareNum,sw;
+	_int8 bracket[1024];
+
+	for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
+		if(buffer[i]=='\"'){
+			IsStr^=1;
+			continue;
+		}
+
+		else if(buffer[i]=='('&&IsStr==0){
+			bracket[PareNum]=0;
+			PareNum++;
+		}
+		else if(buffer[i]=='['&&IsStr==0){
+			bracket[PareNum]=1;
+			PareNum++;
+		}
+
+		else if(buffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=0||PareNum<0){
+				//"カッコ \'( )\'"
+				return 0;
+			}
+		}
+		else if(buffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=1||PareNum<0){
+				//"カッコ \'( )\'"
+				return 0;
+			}
+		}
+
+		else if(buffer[i]=='\n'||buffer[i]=='\0'){
+
+			//"カッコ \'( )\'"
+			if(PareNum!=0){
+				return 0;
+			}
+
+			if(IsStr!=0){
+				return 0;
+			}
+			if(buffer[i]=='\0') break;
+			PareNum=0;
+			IsStr=0;
+
+			sw=0;
+		}
+
+		else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
+			//不正な文字コード
+			if(sw==0){
+				//全角スペース
+				if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40){
+					return 0;
+				}
+
+				//その他の全角文字
+				else return 0;
+				sw=1;
+			}
+		}
+	}
+	return 1;
+}
+void DirectiveCheck(void){
+	extern char *basbuf;
+	extern char BasicCurDir[MAX_PATH];
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+
+	extern BOOL bStrict;
+	bStrict=1;
+
+	for(i=0;;i++){
+		if(basbuf[i]=='\0') break;
+		if(((basbuf[i-2]==0&&basbuf[i-1]==-1)||basbuf[i-1]=='\n')&&
+			basbuf[i]=='#'){
+			for(i2=i+1,i3=0;;i2++,i3++){
+				if(!IsVariableChar(basbuf[i2])){
+					temporary[i3]=0;
+					break;
+				}
+				temporary[i3]=basbuf[i2];
+			}
+			if(lstrcmpi(temporary,"noprompt")==0){
+				//#noprompt
+				//旧機能なので、無視
+				for(;;i2++){
+					if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
+				}
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if(lstrcmpi(temporary,"strict")==0){
+				//#strict
+				//旧機能なので、無視
+				for(;;i2++){
+					if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
+				}
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if(lstrcmpi(temporary,"struct")==0){
+				//#struct code
+				//旧機能なので、無視
+				for(;;i2++){
+					if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
+				}
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if( lstrcmpi( temporary, "_fullcompile" ) == 0 ){
+				// すべての関数・メソッドをコンパイルする（デバッグ用）
+				for(;;i2++){
+					if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
+				}
+				SlideString(basbuf+i2,i-i2);
+
+				Smoothie::isFullCompile = true;
+			}
+			else if(lstrcmpi(temporary,"resource")==0){
+				//#resource
+				while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++;
+				if(basbuf[i2]!='\"'){
+					SetError(1,NULL,i2);
+					return;
+				}
+				for(i3=0,i2++;;i2++,i3++){
+					if(basbuf[i2]=='\"'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=basbuf[i2];
+				}
+				GetFullPath(temporary,BasicCurDir);
+
+				extern char ResourceFileName[MAX_PATH];
+				lstrcpy(ResourceFileName,temporary);
+
+				for(;;i2++){
+					if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
+				}
+				SlideString(basbuf+i2,i-i2);
+			}
+		}
+	}
+}
+void NextCommandFormat(char *buffer){
+	int i,i2,i3;
+	char temporary[255];
+
+	//Next命令語のフォーマット
+	for(i=0;;i++){
+		if(buffer[i]=='\n'||buffer[i]==':'||i==0){
+			if(buffer[i]=='\n'||buffer[i]==':') i++;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			while(buffer[i]>='0'&&buffer[i]<='9') i++;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			if((buffer[i]=='n'||buffer[i]=='N')&&(buffer[i+1]=='e'||buffer[i+1]=='E')&&(buffer[i+2]=='x'||buffer[i+2]=='X')&&(buffer[i+3]=='t'||buffer[i+3]=='T')&&
+				(buffer[i+4]==' '||buffer[i+4]=='\t')){
+				i2=i+5;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+				if(buffer[i2]!='\n'){
+					lstrcpy(temporary,"NEXT");
+					for(i3=0;;i2++){
+						if(buffer[i2]=='\n'||buffer[i2]==':'||buffer[i2]=='\0') break;
+						if(buffer[i2]==','){
+							lstrcat(temporary,":NEXT");
+							i3=1;
+						}
+					}
+					if(i3){
+						i3=lstrlen(temporary);
+						SlideString(buffer+i2,i-i2+i3);
+						memcpy(buffer+i,temporary,i3);
+					}
+				}
+			}
+		}
+		if(buffer[i]=='\0') break;
+	}
+}
+void SetEscapeSequenceFormat(char *buffer){
+	/*「MOD」「AND」「OR」
+		その他制御文字をエスケープシーケンスを使用した記号へ変換 */
+	int i,i2,i3,i4,i5,i6,sw1,IsStr;
+	char *temporary,temp2[VN_SIZE];
+
+	bool isBeforeCharDelimitation = false;
+	temporary=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,lstrlen(buffer)*2);
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='-'&&buffer[i+1]=='>'&&IsStr==0){
+			buffer[i]=1;
+			buffer[i+1]=ESC_PSMEM;
+		}
+
+		if( buffer[i] && IsCommandDelimitation( buffer[i] ) ){
+			isBeforeCharDelimitation = true;
+
+			temporary[i2]=buffer[i];
+			continue;
+		}
+
+		if(IsVariableChar(buffer[i])&&IsStr==0){
+
+			i3=i2;
+			for(;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+
+			bool isAfterCharBlank = false;
+			if( IsBlank( buffer[i] ) ){
+				isAfterCharBlank = true;
+			}
+
+			if(lstrcmpi(temporary+i3,"End")==0) i6=1;
+			else if(lstrcmpi(temporary+i3,"Exit")==0) i6=2;
+			else if(lstrcmpi(temporary+i3,"Select")==0) i6=3;
+			else if(lstrcmpi(temporary+i3,"Case")==0) i6=4;
+			else if(lstrcmpi(temporary+i3,"Else")==0) i6=5;
+			else i6=0;
+			if(i6){
+				i4=i;
+				while(buffer[i4]==' '||buffer[i4]=='\t') i4++;
+				for(i5=0;;i4++,i5++){
+					if(!IsVariableChar(buffer[i4])){
+						temp2[i5]=0;
+						break;
+					}
+					temp2[i5]=buffer[i4];
+				}
+				sw1=0;
+				if(i6==3){
+					//Select～
+					if(lstrcmpi(temp2,"Case")==0) sw1=1;
+				}
+				else if(i6==4){
+					//Case～
+					if(lstrcmpi(temp2,"Else")==0) sw1=1;
+				}
+				else if(i6==5){
+					//Else If
+					if(lstrcmpi(temp2,"If")==0) sw1=1;
+				}
+				else if(i6==1){
+					//End～
+					switch(temp2[0]){
+						case 'c':
+						case 'C':
+							if(lstrcmpi(temp2,"Class")==0) sw1=1;
+							break;
+						case 'e':
+						case 'E':
+							if(lstrcmpi(temp2,"Enum")==0) sw1=1;
+							break;
+						case 'i':
+						case 'I':
+							if(lstrcmpi(temp2,"If")==0) sw1=1;
+							else if(lstrcmpi(temp2,"Interface")==0) sw1=1;
+							break;
+						case 'f':
+						case 'F':
+							if(lstrcmpi(temp2,"Function")==0) sw1=1;
+							break;
+						case 'm':
+						case 'M':
+							if(lstrcmpi(temp2,"Macro")==0) sw1=1;
+							break;
+						case 'n':
+						case 'N':
+							if(lstrcmpi(temp2,"Namespace")==0) sw1=1;
+							break;
+						case 's':
+						case 'S':
+							if(lstrcmpi(temp2,"Sub")==0) sw1=1;
+							else if(lstrcmpi(temp2,"Select")==0) sw1=1;
+							break;
+						case 't':
+						case 'T':
+							if(lstrcmpi(temp2,"Type")==0) sw1=1;
+							break;
+						case 'w':
+						case 'W':
+							if(lstrcmpi(temp2,"With")==0) sw1=1;
+							break;
+					}
+				}
+				else if(i6==2){
+					//Exit～
+					if(
+						lstrcmpi(temp2,"For")==0||
+						lstrcmpi(temp2,"While")==0||
+						lstrcmpi(temp2,"Do")==0||
+						lstrcmpi(temp2,"Function")==0||
+						lstrcmpi(temp2,"Sub")==0||
+						lstrcmpi(temp2,"Macro")==0
+						) sw1=1;
+				}
+
+				if(sw1){
+					i=i4;
+					memcpy(temporary+i2,temp2,i5);
+					i2+=i5;
+					temporary[i2]=0;
+				}
+			}
+			i--;
+			i2--;
+
+			switch(temporary[i3]){
+				case '_':
+					if(lstrcmpi(temporary+i3,"_ClearNamespaceImported")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CLEARNAMESPACEIMPORTED;
+					}
+					break;
+				case 'a':
+				case 'A':
+					if(lstrcmpi(temporary+i3,"And")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_AND;
+					}
+					else if(lstrcmpi(temporary+i3,"Abstract")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ABSTRACT;
+					}
+					else if(lstrcmpi(temporary+i3,"As")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_AS;
+					}
+					break;
+				case 'b':
+				case 'B':
+					if(lstrcmpi(temporary+i3,"ByVal")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_BYVAL;
+					}
+					else if(lstrcmpi(temporary+i3,"ByRef")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_BYREF;
+					}
+					break;
+				case 'c':
+				case 'C':
+					if(lstrcmpi(temporary+i3,"Catch")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CATCH;
+					}
+					else if(lstrcmpi(temporary+i3,"Continue")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CONTINUE;
+					}
+					else if(lstrcmpi(temporary+i3,"cdecl")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CDECL;
+					}
+					else if(lstrcmpi(temporary+i3,"Case")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CASE;
+					}
+					else if(lstrcmpi(temporary+i3,"CaseElse")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CASEELSE;
+					}
+					else if(lstrcmpi(temporary+i3,"Const")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CONST;
+					}
+					else if(lstrcmpi(temporary+i3,"Class")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CLASS;
+					}
+					break;
+				case 'd':
+				case 'D':
+					if(lstrcmpi(temporary+i3,"Declare")==0){
+						i2=i3;
+						int i9=i2;
+						temporary[i2]=1;
+						temporary[++i2]=ESC_DECLARE;
+						i++;
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						// Sub/Function
+						for(i4=0;;i++,i4++){
+							if(!IsVariableChar(buffer[i])){
+								temp2[i4]=0;
+								break;
+							}
+							temp2[i4]=buffer[i];
+						}
+						if(lstrcmpi(temp2,"Sub")==0) temporary[++i2]=ESC_SUB;
+						else if(lstrcmpi(temp2,"Function")==0) temporary[++i2]=ESC_FUNCTION;
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						// 関数名
+						for(i2++;;i++,i2++){
+							if(!IsVariableChar(buffer[i])){
+								i2--;
+								break;
+							}
+							temporary[i2]=buffer[i];
+						}
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						for(i4=0;;i++,i4++){
+							if(!IsVariableChar(buffer[i])){
+								temp2[i4]=0;
+								break;
+							}
+							temp2[i4]=buffer[i];
+						}
+						if(lstrcmpi(temp2,"cdecl")==0){
+							temporary[++i2]=1;
+							temporary[++i2]=ESC_CDECL;
+
+							while(buffer[i]==' '||buffer[i]=='\t') i++;
+							for(i4=0;;i++,i4++){
+								if(!IsVariableChar(buffer[i])){
+									temp2[i4]=0;
+									break;
+								}
+								temp2[i4]=buffer[i];
+							}
+						}
+						if(lstrcmpi(temp2,"Lib")==0) temporary[++i2]=',';
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						if(buffer[i]=='\"'){
+							temporary[++i2]=buffer[i];
+							for(i++,i2++;;i++,i2++){
+								temporary[i2]=buffer[i];
+								if(buffer[i]=='\"'){
+									i++;
+									break;
+								}
+								if(buffer[i]=='\0') break;
+							}
+						}
+						else{
+							for(i2++;;i++,i2++){
+								if(!IsVariableChar(buffer[i])){
+									i2--;
+									break;
+								}
+								temporary[i2]=buffer[i];
+							}
+						}
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						temporary[++i2]=',';
+
+						if( memicmp( buffer + i, "Alias", 5 ) ==0 ){
+							i+=5;
+							for(i++,i2++;;i++,i2++){
+								temporary[i2]=buffer[i];
+								if(buffer[i]=='('){
+									i2--;
+									break;
+								}
+								if(buffer[i]=='\0') break;
+							}
+						}
+
+						temporary[++i2]=',';
+
+						i--;
+					}
+					else if(lstrcmpi(temporary+i3,"Def")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_DEF;
+					}
+					break;
+				case 'e':
+				case 'E':
+					if(lstrcmpi(temporary+i3,"ElseIf")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ELSEIF;
+					}
+					else if(lstrcmpi(temporary+i3,"Else")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ELSE;
+					}
+					else if(lstrcmpi(temporary+i3,"Export")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_EXPORT;
+					}
+					else if(lstrcmpi(temporary+i3,"Enum")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ENUM;
+					}
+
+					else if(temporary[i3+1]=='n'||temporary[i3+1]=='N'){
+						//終了記述
+						if(lstrcmpi(temporary+i3,"EndIf")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDIF;
+						}
+						else if(lstrcmpi(temporary+i3,"EndFunction")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDFUNCTION;
+						}
+						else if(lstrcmpi(temporary+i3,"EndSub")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDSUB;
+						}
+						else if(lstrcmpi(temporary+i3,"EndMacro")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDMACRO;
+						}
+						else if(lstrcmpi(temporary+i3,"EndNamespace")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDNAMESPACE;
+						}
+						else if(lstrcmpi(temporary+i3,"EndClass")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDCLASS;
+						}
+						else if(lstrcmpi(temporary+i3,"EndInterface")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDINTERFACE;
+						}
+						else if(lstrcmpi(temporary+i3,"EndTry")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDTRY;
+						}
+						else if(lstrcmpi(temporary+i3,"EndType")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDTYPE;
+						}
+						else if(lstrcmpi(temporary+i3,"EndEnum")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDENUM;
+						}
+						else if(lstrcmpi(temporary+i3,"EndSelect")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDSELECT;
+						}
+						else if(lstrcmpi(temporary+i3,"EndWith")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDWITH;
+						}
+					}
+					else if(temporary[i3+1]=='x'||temporary[i3+1]=='X'){
+						if(lstrcmpi(temporary+i3,"ExitFor")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITFOR;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitWhile")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITWHILE;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitDo")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITDO;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitFunction")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITFUNCTION;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitSub")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITSUB;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitMacro")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITMACRO;
+						}
+					}
+					break;
+				case 'f':
+				case 'F':
+					if(lstrcmpi(temporary+i3,"Finally")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_FINALLY;
+					}
+					else if(lstrcmpi(temporary+i3,"Function")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_FUNCTION;
+					}
+					break;
+				case 'i':
+				case 'I':
+					if(lstrcmpi(temporary+i3,"If")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_IF;
+					}
+					else if(lstrcmpi(temporary+i3,"Imports")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_IMPORTS;
+					}
+					else if(lstrcmpi(temporary+i3,"Inherits")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_INHERITS;
+					}
+					else if(lstrcmpi(temporary+i3,"Interface")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_INTERFACE;
+					}
+					break;
+				case 'm':
+				case 'M':
+					if(lstrcmpi(temporary+i3,"Mod")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_MOD;
+					}
+					else if(lstrcmpi(temporary+i3,"Macro")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_MACRO;
+					}
+					break;
+				case 'n':
+				case 'N':
+					if(isBeforeCharDelimitation
+						&& lstrcmpi(temporary+i3,"Namespace")==0
+						&& isAfterCharBlank ){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_NAMESPACE;
+					}
+					else if(lstrcmpi(temporary+i3,"New")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_NEW;
+					}
+					else if(lstrcmpi(temporary+i3,"Not")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_NOT;
+					}
+					break;
+				case 'o':
+				case 'O':
+					if(lstrcmpi(temporary+i3,"Or")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_OR;
+					}
+					else if(lstrcmpi(temporary+i3,"Override")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_OVERRIDE;
+					}
+					else if(lstrcmpi(temporary+i3,"Operator")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_OPERATOR;
+					}
+					break;
+				case 's':
+				case 'S':
+					if(lstrcmpi(temporary+i3,"Sub")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_SUB;
+					}
+					else if(lstrcmpi(temporary+i3,"SelectCase")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_SELECTCASE;
+					}
+					else if(lstrcmpi(temporary+i3,"Static")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_STATIC;
+					}
+					break;
+				case 't':
+				case 'T':
+					if(lstrcmpi(temporary+i3,"Then")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_THEN;
+					}
+					else if(lstrcmpi(temporary+i3,"Throw")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_THROW;
+					}
+					else if(lstrcmpi(temporary+i3,"Try")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_TRY;
+					}
+					else if(lstrcmpi(temporary+i3,"Type")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_TYPE;
+					}
+					else if(lstrcmpi(temporary+i3,"TypeDef")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_TYPEDEF;
+					}
+					break;
+				case 'u':
+				case 'U':
+					if(lstrcmpi(temporary+i3,"Using")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_USING;
+					}
+					break;
+				case 'v':
+				case 'V':
+					if(lstrcmpi(temporary+i3,"Virtual")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_VIRTUAL;
+					}
+					break;
+				case 'w':
+				case 'W':
+					if(lstrcmpi(temporary+i3,"With")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_WITH;
+					}
+					break;
+				case 'x':
+				case 'X':
+					if(lstrcmpi(temporary+i3,"Xor")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_XOR;
+					}
+					break;
+			}
+					
+			continue;
+		}
+
+		if( !IsBlank( buffer[i] ) ){
+			isBeforeCharDelimitation = false;
+		}
+
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	lstrcpy(buffer,temporary);
+	HeapDefaultFree(temporary);
+}
+void DefCommandFormat(char *buffer){
+	int i,i2,PareNum;
+	char temporary[255];
+
+	//Def命令語からFunction命令語へ
+	for(i=0;;i++){
+		if(buffer[i]==1&&buffer[i+1]==ESC_DEF){
+			buffer[i+1]=ESC_FUNCTION;
+			i+=2;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			if(buffer[i]!='('){
+				SetError(1,NULL,i);
+				return;
+			}
+			i++;
+			while(1){
+				while(buffer[i]==' '||buffer[i]=='\t') i++;
+				if(buffer[i]==')') break;
+				SlideString(buffer+i,2);
+				buffer[i]=1;
+				buffer[i+1]=ESC_BYVAL;
+				i+=2;
+				PareNum=0;
+				for(;;i++){
+					if(buffer[i]=='(') PareNum++;
+					if(buffer[i]==')'){
+						PareNum--;
+						if(PareNum<0) break;
+					}
+					if(buffer[i]==','&&PareNum==0) break;
+				}
+				if(buffer[i]==')') break;
+				i++;
+			}
+			i++;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			if(buffer[i]!='='){
+				SetError(1,NULL,i);
+				break;
+			}
+			i2=lstrlen(temporary);
+			SlideString(buffer+i,i2+1);
+			buffer[i]=':';
+			i++;
+			memcpy(buffer+i,temporary,i2);
+			i+=i2;
+			while(!IsCommandDelimitation(buffer[i])) i++;
+			SlideString(buffer+i,3);
+			buffer[i]=':';
+			buffer[i+1]=1;
+			buffer[i+2]=ESC_ENDFUNCTION;
+		}
+		if(buffer[i]=='\0') break;
+	}
+}
+
+void ChangeOneIf(char *write,int &wp,char *read,int &rp){
+	int IsStr,sw;
+
+	//ブロック形式でないときはThenの後に区切り文字を入れる
+	for(IsStr=0,sw=0;;wp++,rp++){
+		if(read[rp]=='\"') IsStr^=1;
+
+		write[wp]=read[rp];
+
+		if(IsCommandDelimitation(read[rp])&&IsStr==0) return;
+		if(read[rp]==1&&read[rp+1]==ESC_THEN&&
+			(read[rp+2]==' '||read[rp+2]=='\t')){
+				write[wp+1]=read[rp+1];
+				write[wp+2]=':';
+				rp+=3;
+				wp+=3;
+				while(read[rp]==' '||read[rp]=='\t') rp++;
+				if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
+					memcpy(write+wp,"Goto ",5);
+					wp+=5;
+				}
+				break;
+		}
+	}
+
+	//Elseの後に区切り文字を入れる
+	for(IsStr=0;;wp++,rp++){
+		if(read[rp]=='\"') IsStr^=1;
+
+		write[wp]=read[rp];
+
+		if(read[rp]=='\n'||read[rp]=='\0') break;
+		if(read[rp]==1&&read[rp+1]==ESC_IF){
+			write[wp+1]=read[rp+1];
+			wp+=2;
+			rp+=2;
+			ChangeOneIf(write,wp,read,rp);
+			wp--;
+			rp--;
+			continue;
+		}
+		if(read[rp]==1&&read[rp+1]==ESC_ELSE){
+			write[wp++]=':';
+
+			write[wp]=read[rp];
+			write[wp+1]=read[rp+1];
+			wp+=2;
+			rp+=2;
+
+			write[wp++]=':';
+
+			while(read[rp]==' '||read[rp]=='\t') rp++;
+			if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
+				memcpy(write+wp,"Goto ",5);
+				wp+=5;
+			}
+			break;
+		}
+	}
+
+	//"End If" を付加
+	for(;;rp++,wp++){
+		if(read[rp]=='\n'||read[rp]=='\0') break;
+
+		if(read[rp]==1&&read[rp+1]==ESC_IF){
+			write[wp+1]=read[rp+1];
+			wp+=2;
+			rp+=2;
+			ChangeOneIf(write,wp,read,rp);
+			wp--;
+			rp--;
+			continue;
+		}
+		if(read[rp]==1&&read[rp+1]==ESC_ELSE) break;
+
+		write[wp]=read[rp];
+	}
+	write[wp]=':';
+	write[wp+1]=1;
+	write[wp+2]=ESC_ENDIF;
+	wp+=3;
+}
+void OutsideIfFormat(char *write,int &wp,char *read,int &rp){
+	int ElseCount=1;
+
+	for(;;rp++,wp++){
+		if(read[rp]==1){
+			if(read[rp+1]==ESC_IF){
+				write[wp++]=read[rp++];
+				write[wp++]=read[rp++];
+				OutsideIfFormat(write,wp,read,rp);
+				wp--,rp--;
+				continue;
+			}
+			if(read[rp+1]==ESC_ENDIF){
+				for(;ElseCount>0;wp+=3,ElseCount--){
+					write[wp]=1;
+					write[wp+1]=ESC_ENDIF;
+					write[wp+2]=':';
+				}
+				rp+=2;
+				break;
+			}
+			if(read[rp+1]==ESC_ELSEIF){
+				write[wp]=1;
+				write[wp+1]=ESC_ELSE;
+				write[wp+2]=':';
+
+				write[wp+3]=1;
+				write[wp+4]=ESC_IF;
+
+				wp+=4;
+				rp++;
+
+				ElseCount++;
+				continue;
+			}
+		}
+
+		write[wp]=read[rp];
+		if(read[rp]=='\0') break;
+	}
+}
+void IfCommandFormat(char *buffer){
+	int i,i2;
+
+	char *temporary;
+	temporary=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)*2+1024);
+
+	//１行Ifをブロック形式にする
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]==1&&buffer[i+1]==ESC_IF){
+			temporary[i2++]=buffer[i++];
+			temporary[i2++]=buffer[i++];
+			ChangeOneIf(temporary,i2,buffer,i);
+			i2--,i--;
+			continue;
+		}
+
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+
+	//ElseIfを入れ子構造に変更する
+	for(i=0,i2=0;;i++,i2++){
+		if(temporary[i]==1&&temporary[i+1]==ESC_IF){
+			buffer[i2++]=temporary[i++];
+			buffer[i2++]=temporary[i++];
+			OutsideIfFormat(buffer,i2,temporary,i);
+			i2--,i--;
+			continue;
+		}
+
+		buffer[i2]=temporary[i];
+		if(temporary[i]=='\0') break;
+	}
+
+	HeapDefaultFree(temporary);
+}
+void CheckPareCommand(void){
+	extern char *basbuf;
+	int i2,i3;
+
+	int FuncNum=0;
+	int FuncType=0;
+	int FuncPtr=-1;
+	for(i2=0;;i2++){
+		if(basbuf[i2]=='\0') break;
+		if(IsCommandDelimitation(basbuf[i2])){
+			if(basbuf[i2+1]==1){
+				i2++;
+				switch(basbuf[i2+1]){
+					case ESC_FUNCTION:
+					case ESC_SUB:
+					case ESC_MACRO:
+						if(FuncNum!=0){
+							if(FuncType==ESC_FUNCTION)
+								SetError(54,"End Function",FuncPtr);
+							else if(FuncType==ESC_SUB)
+								SetError(54,"End Sub",FuncPtr);
+							else if(FuncType==ESC_MACRO)
+								SetError(54,"End Macro",FuncPtr);
+							return;
+						}
+						FuncType=basbuf[i2+1];
+						FuncNum++;
+						FuncPtr=i2;
+						break;
+					case ESC_ENDFUNCTION:
+					case ESC_ENDSUB:
+					case ESC_ENDMACRO:
+						if(basbuf[i2+1]==ESC_ENDFUNCTION)	i3=ESC_FUNCTION;
+						else if(basbuf[i2+1]==ESC_ENDSUB)	i3=ESC_SUB;
+						else if(basbuf[i2+1]==ESC_ENDMACRO)	i3=ESC_MACRO;
+
+						FuncNum--;
+
+						if(FuncNum!=0||i3!=FuncType){
+							if(basbuf[i2+1]==ESC_ENDFUNCTION)
+								SetError(12,"End Function",i2);
+							else if(basbuf[i2+1]==ESC_ENDSUB)
+								SetError(12,"End Sub",i2);
+							else if(basbuf[i2+1]==ESC_ENDMACRO)
+								SetError(12,"End Macro",i2);
+							return;
+						}
+						break;
+				}
+			}
+
+
+		}
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp	(revision 147)
@@ -0,0 +1,758 @@
+#include "../BasicCompiler_Common/common.h"
+
+CONSTINFO *GetNewConstHash(char *name){
+	extern int cp;
+	CONSTINFO *pci;
+
+	int key;
+	key=hash_default(name);
+
+	extern CONSTINFO **ppConstHash;
+	if(ppConstHash[key]){
+		pci=ppConstHash[key];
+		while(1){
+			if(lstrcmp(pci->name,name)==0){
+				//重複エラー
+				SetError(15,name,cp);
+				return 0;
+			}
+
+			if(pci->pNextData==0){
+				pci->pNextData=(CONSTINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(CONSTINFO));
+				break;
+			}
+			pci=pci->pNextData;
+		}
+		pci=pci->pNextData;
+	}
+	else{
+		ppConstHash[key]=(CONSTINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(CONSTINFO));
+		pci=ppConstHash[key];
+	}
+
+	return pci;
+}
+
+// マクロ定数を追加するための関数
+void AddConstData(char *Command){
+	extern HANDLE hHeap;
+	extern int cp;
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(Command[i]=='\0'){
+			SetError(10,"Const",cp);
+			return;
+		}
+		if(Command[i]=='=' ||  Command[i] == 1 && Command[i+1] == ESC_AS ){
+			//定数定義は新しいクラスモジュール（CDBConst）へ移行
+			// ※この関数はマクロ定数のみを扱う
+			return;
+		}
+		if(Command[i]=='('){
+			temporary[i]=0;
+			break;
+		}
+		temporary[i]=Command[i];
+	}
+
+
+	/////////////////////////////////
+	// 格納位置を計算してpciにセット
+	/////////////////////////////////
+
+	CONSTINFO *pci;
+	pci=GetNewConstHash(temporary);
+	if(!pci) return;
+
+
+
+	////////////////////
+	// 定数情報を取得
+	////////////////////
+
+	//定数名
+	pci->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+	lstrcpy(pci->name,temporary);
+
+	if(Command[i]=='('){
+		pci->ppParm=(char **)HeapAlloc(hHeap,0,1);
+		pci->ParmNum=0;
+		for(i++,i2=0;;i++,i2++){
+			if(Command[i]=='\0'){
+				SetError(1,NULL,cp);
+				return;
+			}
+			if(Command[i]==','||Command[i]==')'){
+				temporary[i2]=0;
+				pci->ppParm=(char **)HeapReAlloc(hHeap,0,pci->ppParm,(pci->ParmNum+1)*sizeof(char *));
+				pci->ppParm[pci->ParmNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+				lstrcpy(pci->ppParm[pci->ParmNum],temporary);
+				pci->ParmNum++;
+				if(Command[i]==')'){
+					i++;
+					if(Command[i]!='='){
+						SetError(1,NULL,cp);
+						return;
+					}
+					break;
+				}
+
+				i2=-1;
+				continue;
+			}
+			temporary[i2]=Command[i];
+		}
+	}
+	else pci->ParmNum=0;
+
+	//データ
+	lstrcpy(temporary,Command+i+1);
+	if(pci->ParmNum){
+		pci->StrValue=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(pci->StrValue,temporary);
+	}
+	else if(temporary[0]=='\"'){
+		//文字列定数
+		RemoveStringQuotes(temporary);
+		i2=lstrlen(temporary);
+
+		pci->StrValue=(char *)HeapAlloc(hHeap,0,i2+1);
+		memcpy(pci->StrValue,temporary,i2);
+		pci->StrValue[i2]=0;
+
+		pci->DblValue=(double)i2;
+
+		pci->type=DEF_STRING;
+		pci->lpIndex=-1;
+	}
+	else if((temporary[0]=='e'||temporary[0]=='E')&&
+		(temporary[1]=='x'||temporary[1]=='X')&&
+		temporary[2]=='\"'){
+		//文字列定数
+		RemoveStringQuotes(temporary+2);
+		i2=FormatString_EscapeSequence(temporary+2);
+		pci->StrValue=(char *)HeapAlloc(hHeap,0,i2+1);
+		memcpy(pci->StrValue,temporary+2,i2);
+		pci->StrValue[i2]=0;
+
+		pci->DblValue=(double)i2;
+
+		pci->type=DEF_STRING;
+		pci->lpIndex=-1;
+	}
+	else{
+		//数値定数
+		_int64 i64data;
+		Type resultType;
+		StaticCalculation(true, temporary,0,&i64data,resultType);
+		pci->type=resultType.GetBasicType();
+		if(IsRealNumberType(pci->type)){
+			//実数型
+			memcpy(&pci->DblValue,&i64data,sizeof(double));
+		}
+		else if(Is64Type(pci->type)){
+			//64ビット型
+			pci->i64Value=i64data;
+		}
+		else if(IsWholeNumberType(pci->type)){
+			//その他整数型
+			pci->DblValue=(double)i64data;
+		}
+
+		pci->StrValue=0;
+	}
+}
+void AddConstEnum( const NamespaceScopes &namespaceScopes, char *buffer){
+	extern int cp;
+	int i=0,i2;
+
+	if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
+	i+=2;
+
+	//列挙体の名前を取得
+	char temporary[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(IsCommandDelimitation(buffer[i])){
+			temporary[i2]=0;
+			break;
+		}
+		if(!IsVariableChar(buffer[i])){
+			SetError(1,NULL,i);
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+	if(buffer[i]=='\0'){
+		SetError(22,"Enum",cp);
+		return;
+	}
+
+	int NextValue=0;
+	while(1){
+		i++;
+
+		if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break;
+
+		for(i2=0;;i2++,i++){
+			if(IsCommandDelimitation(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			if(buffer[i]=='='){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+		if(temporary[0]=='\0'){
+			if(buffer[i]=='\0'){
+				SetError(22,"Enum",cp);
+				break;
+			}
+			continue;
+		}
+
+		if(buffer[i]!='='){
+			NextValue++;
+		}
+		else{
+			char temp2[VN_SIZE];
+			for(i++,i2=0;;i2++,i++){
+				if(IsCommandDelimitation(buffer[i])){
+					temp2[i2]=0;
+					break;
+				}
+				temp2[i2]=buffer[i];
+			}
+
+			_int64 i64data;
+			StaticCalculation(true, temp2,DEF_LONG,&i64data,Type());
+			NextValue=(int)i64data;
+		}
+
+		//定数を追加
+		CDBConst::obj.AddConst( namespaceScopes, temporary, NextValue);
+	}
+}
+bool GetConstInfo(void){
+	////////////////////////////////////////////
+	// Const命令の情報を取得
+	////////////////////////////////////////////
+
+	int i2;
+	char temporary[1024];
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	namespaceScopes.clear();
+
+	//定数に関する情報
+	extern CONSTINFO **ppConstHash;
+	ppConstHash=(CONSTINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(CONSTINFO *));
+
+	extern char *basbuf;
+	for(int 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 ){
+				SetError(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+		if( basbuf[i] == 1 ){
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CONST){
+				i+=2;
+
+				extern int cp;
+				cp=i;	//エラー用
+
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_ENUM){
+					AddConstEnum( namespaceScopes, basbuf+i);
+					continue;
+				}
+
+				for(i2=0;;i++,i2++){
+					if(basbuf[i]=='\"'){
+						temporary[i2]=basbuf[i];
+						for(i++,i2++;;i++,i2++){
+							temporary[i2]=basbuf[i];
+							if(basbuf[i]=='\"') break;
+						}
+						continue;
+					}
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+				CDBConst::obj.Add( namespaceScopes, temporary);
+				if(basbuf[i]=='\0') break;
+			}
+			else{
+				int result = JumpStatement( basbuf, i );
+				if( result == -1 ){
+					//エラー
+					return false;
+				}
+				else if( result == 1 ){
+					//ジャンプした場合
+					i--;
+				}
+			}
+		}
+	}
+	return true;
+}
+
+char ConstructorDestructorSchedule[MAX_PATH];
+void MakeConstructorAndDestructor(char *buffer,int nowLine,char *ClassName){
+	int i,i2;
+	char temporary[MAX_PATH],*pTemp;
+	BOOL bConstructor,bDestructor;
+
+	ConstructorDestructorSchedule[0]=0;
+	bConstructor=0;
+	bDestructor=0;
+
+	for(i=nowLine;;i++){
+		if(buffer[i]=='\0') break;
+		if(buffer[i]==1&&buffer[i+1]==ESC_ENDCLASS){
+			if((!bConstructor)||(!bDestructor)){
+				pTemp=ConstructorDestructorSchedule;
+
+				lstrcpy(pTemp,"Public:");
+
+				if(!bConstructor){
+					//コンストラクタが無いときは生成する
+					sprintf(pTemp+lstrlen(pTemp),"%c%c%s():%c%c:",
+						1,ESC_SUB,
+						ClassName,
+						1,ESC_ENDSUB);
+				}
+
+				if(!bDestructor){
+					//デストラクタが無いときは生成する
+					sprintf(pTemp+lstrlen(pTemp),"%c%c~%s():%c%c:",
+						1,ESC_SUB,
+						ClassName,
+						1,ESC_ENDSUB);
+				}
+			}
+			break;
+		}
+
+		if(buffer[i]==1&&(buffer[i+1]==ESC_SUB||buffer[i+1]==ESC_FUNCTION)){
+			i+=2;
+			while(IsBlank(buffer[i])) i++;
+			if(buffer[i]=='~'){
+				//デストラクタ
+				bDestructor=1;
+			}
+			else{
+				//コンストラクタかどうかをチェック
+				for(i2=0;;i++,i2++){
+					if(!IsVariableChar(buffer[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				if(lstrcmp(temporary,ClassName)==0) bConstructor=1;
+			}
+		}
+	}
+}
+void ChangeCommand(char *buffer,int nowLine,char *Command){
+	int i,i2,IsStr;
+	unsigned _int16 ComNum;
+	char com[8192],pam[8192];
+
+	static int nCountOfNonGlobalScope = 0;
+
+	if(Command[0]==1){
+		switch(Command[1]){
+			case ESC_SELECTCASE:
+			case ESC_CASE:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_WITH:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_TYPEDEF:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_DECLARE:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_IF:
+				KillStringSpaces(Command+2);
+				break;
+
+			case ESC_CLASS:
+				KillStringSpaces(Command+2);
+				i2 = 2;
+				if( Command[i2] == 1 && Command[i2+1] == ESC_ENUM ){
+					i2 += 2;
+				}
+				else if( memicmp( Command + i2, "Blittable(", 10 ) == 0 ){
+					i2 += 10;
+					i2 = JumpStringInPare(Command,i2)+1;
+				}
+
+				//コンストラクタ、デストラクタを暗黙的に生成
+				MakeConstructorAndDestructor(buffer,nowLine,Command + i2);
+				break;
+			case ESC_INTERFACE:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_ENDCLASS:
+				if(ConstructorDestructorSchedule[0]){
+					//生成されたコンストラクタ、デストラクタを挿入
+					sprintf(Command,"%s%c%c",ConstructorDestructorSchedule,1,ESC_ENDCLASS);
+				}
+				break;
+
+			case ESC_TYPE:
+				KillStringSpaces(Command+2);
+				break;
+
+			case ESC_CONST:
+				KillStringSpaces(Command+2);
+				if( Command[2] == 1 && Command[3] == ESC_ENUM ){
+					nCountOfNonGlobalScope++;
+				}
+				break;
+
+			case ESC_ENUM:
+				nCountOfNonGlobalScope++;
+				KillStringSpaces(Command+2);
+				break;
+
+			case ESC_ENDENUM:
+				nCountOfNonGlobalScope--;
+				break;
+
+			case ESC_INHERITS:
+			case ESC_VIRTUAL:
+			case ESC_OVERRIDE:
+			case ESC_ABSTRACT:
+			case ESC_SUB:
+			case ESC_FUNCTION:
+			case ESC_MACRO:
+			case ESC_STATIC:
+			case ESC_NAMESPACE:
+			case ESC_IMPORTS:
+				KillStringSpaces(Command+2);
+				break;
+		}
+		return;
+	}
+
+	bool isPare = false;
+	for(i=0;;i++){
+		if(Command[i]==' '||Command[i]=='\t'||Command[i]=='('||Command[i]=='\"'||Command[i]=='@'||Command[i]=='-'){
+			com[i]=0;
+			while(Command[i]==' '||Command[i]=='\t') i++;
+			if( Command[i] == '(' ) isPare = true;
+			break;
+		}
+		if(Command[i]=='='){
+			KillStringSpaces(Command);
+			return;
+		}
+		com[i]=Command[i];
+		if(Command[i]=='\0') break;
+	}
+
+	//マクロによるコマンド
+	i2=1;
+	if( nCountOfNonGlobalScope == 0 ){
+		//グローバル
+		if(lstrcmpi(com,"Open")==0) ComOpen(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"Close")==0) ComClose(Command+i,pam);
+		else if(lstrcmpi(com,"Field")==0||
+			lstrcmpi(com,"Get")==0||
+			lstrcmpi(com,"Put")==0) ComField(Command+i,pam);
+		else if(lstrcmpi(com,"Line")==0) ComLine(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"Circle")==0) ComCircle(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"PSet")==0) ComPSet(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"Paint")==0) ComPaint(Command+i,pam,nowLine);
+
+		else if(
+			lstrcmpi(com,"EXEC")==0||
+			lstrcmpi(com,"INPUT")==0||
+			lstrcmpi(com,"PRINT")==0||
+			lstrcmpi(com,"RANDOMIZE")==0||
+			( lstrcmpi(com,"WRITE")==0 && isPare == false )||
+			lstrcmpi(com,"MSGBOX")==0||
+			lstrcmpi(com,"WINDOW")==0||
+			lstrcmpi(com,"DELWND")==0||
+			lstrcmpi(com,"INSMENU")==0||
+			lstrcmpi(com,"CHDIR")==0||
+			lstrcmpi(com,"MKDIR")==0||
+			lstrcmpi(com,"KILL")==0||
+			lstrcmpi(com,"CLS")==0||
+			lstrcmpi(com,"COLOR")==0||
+			lstrcmpi(com,"LOCATE")==0
+			){
+			KillSpaces(Command+i,pam);
+
+			//大文字に変換
+			CharUpper(com);
+
+			sprintf(Command,"%s(%s)",com,pam);
+			return;
+		}
+
+		else i2=0;
+	}
+	else i2=0;
+	if(i2){
+		//大文字に変換
+		CharUpper(com);
+
+		sprintf(Command,"%s(%s)",com,pam);
+		return;
+	}
+
+
+
+	//コンパイラに搭載されるコマンド
+	if(lstrcmpi(com,"Do")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_DO;
+	}
+	else if(lstrcmpi(com,"goto")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_GOTO;
+	}
+	else if(lstrcmpi(com,"gosub")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_GOSUB;
+	}
+	else if(lstrcmpi(com,"Loop")==0){
+		if((Command[i]=='w'||Command[i]=='W')&&(Command[i+1]=='h'||Command[i+1]=='H')&&(Command[i+2]=='i'||Command[i+2]=='I')&&(Command[i+3]=='l'||Command[i+3]=='L')&&(Command[i+4]=='e'||Command[i+4]=='E')){
+			lstrcpy(pam,"0,");
+			KillSpaces(Command+i+5,pam+2);
+		}
+		else if((Command[i]=='u'||Command[i]=='U')&&(Command[i+1]=='n'||Command[i+1]=='N')&&(Command[i+2]=='t'||Command[i+2]=='T')&&(Command[i+3]=='i'||Command[i+3]=='I')&&(Command[i+4]=='l'||Command[i+4]=='L')){
+			lstrcpy(pam,"1,");
+			KillSpaces(Command+i+5,pam+2);
+		}
+		else pam[0]=0;
+		ComNum=COM_LOOP;
+	}
+	else if(lstrcmpi(com,"For")==0){
+		for(i2=0,IsStr=0;;i++,i2++){
+			while(Command[i]==' '||Command[i]=='\t') i++;
+			if(Command[i]=='\"') IsStr^=1;
+			if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='t'||Command[i]=='T')&&(Command[i+1]=='o'||Command[i+1]=='O')&&(Command[i+2]==' '||Command[i+2]=='\t')&&IsStr==0){
+				pam[i2]=',';
+				break;
+			}
+			pam[i2]=Command[i];
+			if(Command[i]=='\0') break;
+		}
+		if(Command[i]){
+			for(i+=3,i2++,IsStr=0;;i++,i2++){
+				while(Command[i]==' '||Command[i]=='\t') i++;
+				if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='s'||Command[i]=='S')&&(Command[i+1]=='t'||Command[i+1]=='T')&&(Command[i+2]=='e'||Command[i+2]=='E')&&(Command[i+3]=='p'||Command[i+3]=='P')&&(Command[i+4]==' '||Command[i+4]=='\t')){
+					pam[i2]=',';
+					i+=4;
+					continue;
+				}
+				pam[i2]=Command[i];
+				if(Command[i]=='\0') break;
+			}
+		}
+		ComNum=COM_FOR;
+	}
+	else if(lstrcmpi(com,"Next")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_NEXT;
+	}
+	else if(lstrcmpi(com,"Return")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_RETURN;
+	}
+	else if(lstrcmpi(com,"While")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_WHILE;
+	}
+	else if(lstrcmpi(com,"Wend")==0){
+		pam[0]=0;
+		ComNum=COM_WEND;
+	}
+
+	//変数、データ操作
+	else if(lstrcmpi(com,"dim")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_DIM;
+	}
+	else if(lstrcmpi(com,"Delete")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_DELETE;
+	}
+	else if( lstrcmpi( com, "_System_SweepingDelete" ) == 0 ){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SWEEPINGDELETE;
+	}
+
+	//その他
+	else if(lstrcmpi(com,"Debug")==0){
+		pam[0]=0;
+		ComNum=COM_DEBUG;
+	}
+	else if(lstrcmpi(com,"let")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_LET;
+	}
+	else if(lstrcmpi(com,"rem")==0){
+		Command[0]=0;
+		return;
+	}
+
+	//ポインタ
+	else if(lstrcmpi(com,"SetDouble")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETDOUBLE;
+	}
+	else if(lstrcmpi(com,"SetSingle")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETSINGLE;
+	}
+	else if(lstrcmpi(com,"SetQWord")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETQWORD;
+	}
+	else if(lstrcmpi(com,"SetDWord")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETDWORD;
+	}
+	else if(lstrcmpi(com,"SetWord")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETWORD;
+	}
+	else if(lstrcmpi(com,"SetByte")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETBYTE;
+	}
+
+	else{
+		//その他のコマンド（一般コード）
+		lstrcpy(com,Command);
+		KillSpaces(com,Command);
+		return;
+	}
+
+	i=lstrlen(pam);
+	while(pam[i-1]==' '||pam[i-1]=='\t') i--;
+	pam[i]=0;
+	if(pam[0]) sprintf(Command,"%c%c%s",HIBYTE(ComNum),LOBYTE(ComNum),pam);
+	else sprintf(Command,"%c%c",HIBYTE(ComNum),LOBYTE(ComNum));
+
+	return;
+}
+
+void ChangeCommandToCode(char *buffer){
+	extern HANDLE hHeap;
+	int i,i2,i3,IsStr,CommandBufferSize;
+	char *temporary,*tempBase,temp2[VN_SIZE],*lpCommand;
+
+	tempBase=(char *)HeapAlloc(hHeap,0,(lstrlen(buffer)+1)*2+8192);
+	temporary=tempBase+1;
+	temporary[0]=0;
+	i=0;
+	i3=0;
+
+	CommandBufferSize=512;
+	lpCommand=(char *)HeapAlloc(hHeap,0,CommandBufferSize);
+
+	while(1){
+		i2=0;
+		while(buffer[i]==' '||buffer[i]=='\t') i++;
+		while(buffer[i]>='0'&&buffer[i]<='9'){
+			temp2[i2]=buffer[i];
+			i++;
+			i2++;
+		}
+		temp2[i2]=0;
+		while(buffer[i]==' '||buffer[i]=='\t') i++;
+		for(i2=0,IsStr=0;;i++,i2++){
+			if(i2>=CommandBufferSize){	//バッファ領域が足りなくなった場合はバッファを増量する
+				CommandBufferSize+=512;
+				lpCommand=(char *)HeapReAlloc(hHeap,0,lpCommand,CommandBufferSize);
+			}
+			if(buffer[i]=='\"') IsStr^=1;
+			if(buffer[i]=='\n'||(buffer[i]==':'&&IsStr==0)||buffer[i]=='\0'){
+				lpCommand[i2]=0;
+
+				if(temp2[0]){
+					//行番号ラベル
+					sprintf(temporary+i3,"%c%c%s,",1,ESC_LINENUM,temp2);
+					i3+=lstrlen(temporary+i3);
+
+					temp2[0]=0;
+				}
+
+				//命令コードへ変換
+				if(i2){
+					//エラー用
+					extern int cp;
+					cp=i;
+
+					ChangeCommand(buffer,i,lpCommand);
+
+					lstrcpy(temporary+i3,lpCommand);
+					i3+=lstrlen(temporary+i3);
+				}
+
+				if(!(lpCommand[0]=='\0'&&buffer[i]==':')){
+					temporary[i3++]=buffer[i];
+					temporary[i3]=0;
+				}
+
+				if(buffer[i]=='\n'){
+					i++;
+					break;
+				}
+				else if(buffer[i]==':'){
+					while(buffer[i+1]==' '||buffer[i+1]=='\t') i++;
+				}
+				if(buffer[i]=='\0') break;
+				i2=-1;
+				continue;
+			}
+			lpCommand[i2]=buffer[i];
+		}
+		if(buffer[i]=='\0') break;
+	}
+	HeapDefaultFree(lpCommand);
+	lstrcpy(buffer,temporary);
+
+	HeapDefaultFree(tempBase);
+}
Index: /trunk/abdev/BasicCompiler_Common/LexicalScoping.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/LexicalScoping.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/LexicalScoping.cpp	(revision 147)
@@ -0,0 +1,236 @@
+#include "common.h"
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+
+CLexicalScopes obj_LexScopes;
+
+
+CScope::CScope( int level, int addr, SCOPE_TYPE TypeOfStatement ){
+	this->level = level;
+	this->StartAddress = addr;
+	this->TypeOfStatement = TypeOfStatement;
+
+	pBreakSchedule = (DWORD *)malloc( 1 );
+	nBreakSchedule = 0;
+}
+CScope::~CScope(){
+	free( pBreakSchedule );
+}
+
+int CScope::GetStartAddress(){
+	return StartAddress;
+}
+SCOPE_TYPE CScope::GetTypeOfStatement(){
+	return TypeOfStatement;
+}
+
+void CScope::Break(){
+	//未解放のローカルオブジェクトを解放する
+	obj_LexScopes.CallDestructorsOfReturn( level );
+
+	//jmp ...(Next addr)
+	OpBuffer[obp++]=(char)0xE9;
+
+	pBreakSchedule=(DWORD *)realloc( pBreakSchedule, ( nBreakSchedule + 1 ) * sizeof(DWORD) );
+	pBreakSchedule[nBreakSchedule]=obp;
+	nBreakSchedule++;
+
+	obp+=sizeof(long);
+}
+void CScope::RunScheduleOfBreak(){
+	for(int i=0;i<nBreakSchedule;i++){
+		*((long *)(OpBuffer+pBreakSchedule[i]))=obp-(pBreakSchedule[i]+sizeof(long));
+	}
+}
+
+
+CScope *CLexicalScopes::SearchScope( SCOPE_TYPE TypeOfStatement ){
+	for( int i = level; i>=0; i-- ){
+		if( ppScopes[i]->GetTypeOfStatement() == TypeOfStatement ){
+			return ppScopes[i];
+		}
+	}
+	return NULL;
+}
+
+CLexicalScopes::CLexicalScopes(){
+	ppScopes = (CScope **)malloc( 1 );
+	level=0;
+}
+CLexicalScopes::~CLexicalScopes(){
+	free( ppScopes );
+}
+void CLexicalScopes::Init(int addr){
+	// TODO: エラーチェック
+
+	level = -1;
+	Start( addr, SCOPE_TYPE_BASE );
+}
+void CLexicalScopes::Start( int addr, SCOPE_TYPE TypeOfStatement ){
+	level++;
+	ppScopes = (CScope **)realloc( ppScopes, ( level + 1 ) * sizeof( CScope * ) );
+	ppScopes[level] = new CScope( level, addr, TypeOfStatement );
+}
+void CLexicalScopes::End(){
+	if( level <= 0 ){
+		SetError(300,NULL,cp);
+		return;
+	}
+
+	//デストラクタを呼ぶ
+	CallDestructorsOfScopeEnd();
+
+	Variables &vars = UserProc::IsGlobalAreaCompiling()?
+		globalVars :
+		UserProc::CompilingUserProc().localVars;
+
+	//使用済みローカル変数の生存チェックを外す
+	foreach( Variable *pVar, vars ){
+		if(pVar->bLiving&&pVar->ScopeLevel==level){
+			pVar->bLiving=0;
+			extern int obp;
+			pVar->ScopeEndAddress=obp;
+		}
+	}
+
+
+	//スコープ抜け出しスケジュール
+	ppScopes[level]->RunScheduleOfBreak();
+
+
+	//スコープレベルを下げる
+	delete ppScopes[level];
+	level--;
+}
+
+void CLexicalScopes::ExitFor(){
+	CScope *pScope = SearchScope( SCOPE_TYPE_FOR );
+	if( !pScope ){
+		SetError(12,"Exit For",cp);
+		return;
+	}
+
+	pScope->Break();
+}
+void CLexicalScopes::ExitWhile(){
+	CScope *pScope = SearchScope( SCOPE_TYPE_WHILE );
+	if( !pScope ){
+		SetError(12,"Exit While",cp);
+		return;
+	}
+
+	pScope->Break();
+}
+void CLexicalScopes::ExitDo(){
+	CScope *pScope = SearchScope( SCOPE_TYPE_DO );
+	if( !pScope ){
+		SetError(12,"Exit Do",cp);
+		return;
+	}
+
+	pScope->Break();
+}
+
+int CLexicalScopes::GetNowLevel(){
+	return level;
+}
+void CLexicalScopes::SetNowLevel( int level ){
+	this->level = level;
+}
+int CLexicalScopes::GetStartAddress(){
+	return ppScopes[level]->GetStartAddress();
+}
+
+
+// スコープ終了時のデストラクタ呼び出し
+void CLexicalScopes::CallDestructorsOfScopeEnd(){
+
+	Variables &vars = UserProc::IsGlobalAreaCompiling()?
+		globalVars :
+		UserProc::CompilingUserProc().localVars;
+
+
+	int i3;
+	int indexSystemGC=-1;
+	for( i3 = (int)vars.size() - 1; i3 >= 0; i3-- ){		//確保したのと逆順序で解放するため、バックサーチにする
+
+		Variable *pVar = vars[i3];
+
+		if( UserProc::IsGlobalAreaCompiling() && GetNowLevel() == 0 ){
+			if( pVar->GetName() == "_System_GC" ){
+				indexSystemGC=i3;
+				continue;
+			}
+		}
+
+		//同一レベルのレキシカルスコープのみを検知
+		if(!pVar->bLiving) continue;
+		if( pVar->ScopeLevel != GetNowLevel() ) continue;
+
+		if( pVar->IsStruct() && pVar->IsParameter() ){
+			//構造体パラメータを持つとき
+
+			//メモリを解放する
+
+#ifdef _AMD64_
+			//x64ビットコード
+
+			//mov rcx,qword ptr[rsp+offset]
+			op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,
+				-pVar->offset,
+				MOD_BASE_DISP32);
+			obp-=sizeof(long);
+			AddLocalVarAddrSchedule();
+			obp+=sizeof(long);
+#else
+			//x86コード
+
+			//mov ecx,dword ptr[ebp+offset]
+			op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->offset,MOD_BASE_DISP32);
+			obp-=sizeof(long);
+			AddLocalVarAddrSchedule();
+			obp+=sizeof(long);
+
+			//push ecx
+			op_push(REG_ECX);
+#endif
+
+			//call free
+			extern UserProc *pSub_free;
+			op_call(pSub_free);
+
+
+			if( UserProc::IsGlobalAreaCompiling() ){
+				//ここには来ないハズ
+				SetError(300,NULL,cp);
+			}
+		}
+	}
+
+	if(indexSystemGC!=-1){
+		//_System_GCオブジェクトのデストラクタの呼び出し処理
+		const CMethod *method = vars[indexSystemGC]->GetClass().GetDestructorMethod();
+		if( method ){
+			Opcode_CallProc("",method->pUserProc,0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
+		}
+	}
+}
+
+// Returnステートメントで発行されるデストラクタを生成
+void CLexicalScopes::CallDestructorsOfReturn( int BaseLevel ){
+	//現在のスコープレベルを退避
+	int backupScopeLevel = GetNowLevel();
+
+	for( int i = GetNowLevel(); i >= BaseLevel; i-- ){
+		SetNowLevel( i );
+
+		CallDestructorsOfScopeEnd();
+	}
+
+	//現在のスコープレベルを復元
+	SetNowLevel( backupScopeLevel );
+}
Index: /trunk/abdev/BasicCompiler_Common/LexicalScoping.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/LexicalScoping.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/LexicalScoping.h	(revision 147)
@@ -0,0 +1,74 @@
+
+
+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;
Index: /trunk/abdev/BasicCompiler_Common/LoopRefCheck.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/LoopRefCheck.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/LoopRefCheck.cpp	(revision 147)
@@ -0,0 +1,58 @@
+#include "../BasicCompiler_Common/common.h"
+
+
+//////////////////////////////////////////////////////////////
+// 循環参照でないかをチェックするためのクラスモジュール
+//////////////////////////////////////////////////////////////
+
+extern HANDLE hHeap;
+
+
+void CLoopRefCheck::init(){
+	int i;
+	for(i=0;i<num;i++){
+		HeapDefaultFree(names[i]);
+	}
+	HeapDefaultFree(names);
+}
+
+CLoopRefCheck::CLoopRefCheck(){
+	names=(char **)HeapAlloc(hHeap,0,1);
+	num=0;
+}
+CLoopRefCheck::~CLoopRefCheck(){
+	init();
+}
+void CLoopRefCheck::add(const char *lpszInheritsClass){
+	names=(char **)HeapReAlloc(hHeap,0,names,(num+1)*sizeof(char *));
+	names[num]=(char *)HeapAlloc(hHeap,0,lstrlen(lpszInheritsClass)+1);
+	lstrcpy(names[num],lpszInheritsClass);
+	num++;
+}
+void CLoopRefCheck::del(const char *lpszInheritsClass){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmp(names[i],lpszInheritsClass)==0){
+			HeapDefaultFree(names[i]);
+			break;
+		}
+	}
+	if(i!=num){
+		num--;
+		for(;i<num;i++){
+			names[i]=names[i+1];
+		}
+	}
+}
+BOOL CLoopRefCheck::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;
Index: /trunk/abdev/BasicCompiler_Common/MakeExe.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/MakeExe.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/MakeExe.cpp	(revision 147)
@@ -0,0 +1,282 @@
+#include "common.h"
+
+void StepCompileProgress(void){
+	extern HWND hMainDlg;
+	PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_STEPIT,0,0);
+}
+
+void Delete_ci(CONSTINFO *pci){
+	int i;
+
+	HeapDefaultFree(pci->name);
+	if(pci->StrValue) HeapDefaultFree(pci->StrValue);
+	if(pci->ParmNum){
+		for(i=0;i<pci->ParmNum;i++)
+			HeapDefaultFree(pci->ppParm[i]);
+		HeapDefaultFree(pci->ppParm);
+	}
+
+	if(pci->pNextData){
+		Delete_ci(pci->pNextData);
+	}
+
+	HeapDefaultFree(pci);
+}
+void DeleteConstInfo(CONSTINFO **ppConstHash){
+	int i;
+
+	for(i=0;i<MAX_HASH;i++){
+		if(ppConstHash[i]){
+			Delete_ci(ppConstHash[i]);
+		}
+	}
+	HeapDefaultFree(ppConstHash);
+}
+
+void AddSourceCode(char *buffer){
+	char *temp;
+	temp=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)+8192);
+	lstrcpy(temp,buffer);
+
+	//エスケープシーケンス設定
+	SetEscapeSequenceFormat(temp);
+
+	//コマンド対応
+	ChangeCommandToCode(temp);
+
+	//最後尾に貼り付け
+	Smoothie::Lexical::source.Addition( temp );
+
+	HeapDefaultFree(temp);
+}
+
+void OutputExe(void){
+	extern HANDLE hHeap;
+	extern char *basbuf;
+	extern int ErrorNum;
+	extern BOOL bStopCompile;
+	extern HWND hMainDlg;
+	int i2,i3;
+	char temp2[MAX_PATH];
+
+	//ログ用バッファを初期化
+	Smoothie::Logger::Initialize();
+
+	//プログレスバーの設定
+	PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETRANGE,0,MAKELPARAM(0,6));
+	PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETSTEP,1,0);
+
+	//"中断"
+	SetDlgItemText(hMainDlg,IDOK,STRING_STOP);
+
+	//中断フラグを初期化
+	bStopCompile=0;
+
+	//サブシステムのタイプ
+	extern unsigned short TypeOfSubSystem;
+	TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_GUI;
+
+	//プログラムをファイルから読み込む
+	extern char SourceFileName[MAX_PATH];
+	if( !Smoothie::Lexical::source.ReadFile( SourceFileName ) ){
+		SetError(201,SourceFileName,-1);
+		goto EndCompile;
+	}
+
+	//イメージベースの設定
+	extern DWORD ImageBase;
+	extern BOOL bDll;
+	if(bDll) ImageBase=0x10000000;
+	else ImageBase=0x00400000;
+
+	extern BOOL bError;
+	if(bError||bStopCompile) goto EndCompile;
+
+
+	//////////////////////////
+	// 中間コードの生成を開始
+	extern BOOL bClipCompileView;
+
+	//"最適化中..."
+	CompileMessage(STRING_COMPILE_OPTIMIZING);
+
+	//カッコを相互チェック（ダブルクォートチェックチェックを含む）
+	CheckParenthesis(basbuf);
+
+	if(bError||bStopCompile) goto EndCompile;
+
+	//コンパイルダイアログのプログレスバーを上げる
+	StepCompileProgress();
+
+	//ディレクティブ
+	DirectiveCheck();
+
+	//Next命令語を正規表現に変換
+	//NextCommandFormat(basbuf);
+
+	//エスケープシーケンス設定
+	SetEscapeSequenceFormat(basbuf);
+
+	//Def命令語をFunction命令語に変換
+	DefCommandFormat(basbuf);
+
+	//すべてのIf命令語をブロック形式に変換
+	IfCommandFormat(basbuf);
+
+	//対になる命令語を相互チェック
+	//CheckPareCommand();
+
+	if(bError||bStopCompile) goto EndCompile;
+
+	/*未完成
+	//定数に関する情報
+	extern CONSTINFO **ppConstHash;
+	ppConstHash=(CONSTINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(CONSTINFO *));
+	*/
+
+	//コンパイルダイアログのプログレスバーを上げる
+	StepCompileProgress();
+
+	//重複エラー情報管理のメモリを確保
+	extern char **SynonymErrorWords;
+	extern int SynonymErrorNum;
+	SynonymErrorNum=0;
+	SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
+
+	ChangeCommandToCode(basbuf);
+
+	//重複エラー情報管理のメモリを解放
+	for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);
+	HeapDefaultFree(SynonymErrorWords);
+	SynonymErrorWords=0;
+
+	if(bError||bStopCompile){
+		//定数に関する情報を解放
+		goto EndCompile;
+	}
+
+	StepCompileProgress();
+
+
+	///////////////////////
+	// コンパイル開始
+
+	//"コンパイル中..."
+	CompileMessage(STRING_COMPILE_COMPILING);
+
+	//グローバル変数に関する情報
+	extern int AllGlobalVarSize;
+	extern int AllInitGlobalVarSize;
+	globalVars.clear();
+	AllGlobalVarSize=0;
+	AllInitGlobalVarSize=0;
+
+
+	/*
+	int t,t2;
+	t=GetTickCount();
+	Compile();
+	t2=GetTickCount();
+	t2-=t;
+	char s[100];
+	sprintf(s,"%d",t2);
+	MessageBox(0,s,"test",0);*/
+	Compile();
+
+	//リソース情報を解放
+	extern RESOURCEDATAINFO *pCursorResourceInfo;
+	extern RESOURCEDATAINFO *pIconResourceInfo;
+	extern RESOURCEDATAINFO *pBitmapResourceInfo;
+	HeapDefaultFree(pCursorResourceInfo);
+	HeapDefaultFree(pBitmapResourceInfo);
+	HeapDefaultFree(pIconResourceInfo);
+
+	//コードと行番号の関係情報を解放
+	extern LINEINFO *pLineInfo;
+	HeapDefaultFree(pLineInfo);
+
+	//サブルーチン（ユーザー定義）情報のメモリ解放
+	extern GlobalProc **ppSubHash;
+	extern char **ppMacroNames;
+	extern int MacroNum;
+	DeleteSubInfo(ppSubHash,ppMacroNames,MacroNum);
+
+	//Declare（DLL関数）情報のメモリ解放
+	DeleteDeclareInfo();
+
+	//関数ポインタ情報のメモリ解放
+	DeleteProcPtrInfo();
+
+	//定数に関する情報を解放
+	extern CONSTINFO **ppConstHash;
+	DeleteConstInfo(ppConstHash);
+
+	//コンパイルダイアログのプログレスバーを上げる
+	StepCompileProgress();
+
+
+	//////////////////////////
+	// 終了処理
+EndCompile:
+	if(bStopCompile){
+		PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETPOS,0,0);
+
+		//"コンパイルはユーザーにより中断されました。"
+		CompileMessage(STRING_COMPILE_STOP);
+	}
+	else{
+		extern int CompileMsgNum;
+		extern int WarningNum;
+		if(bError==0){
+			//"コンパイルは正常に完了しました（エラー:%d、警告:%d）"
+			sprintf(temp2,STRING_COMPILE_SUCCESS,ErrorNum-CompileMsgNum-WarningNum,WarningNum);
+		}
+		else{
+			//"コンパイルは中断されました（エラー:%d、警告:%d）"
+			sprintf(temp2,STRING_COMPILE_ERROR,ErrorNum-CompileMsgNum-WarningNum,WarningNum);
+		}
+
+		CompileMessage("");
+		CompileMessage("-----------------------------------------------------");
+		CompileMessage(temp2);
+	}
+
+	//"閉じる"
+	SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+#ifdef _DEBUG
+	// デバッグモードのときはダイアログが隠れている
+	ShowWindow(hMainDlg,SW_SHOW);
+#endif
+
+	//#include情報を解放
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	for(i2=0;i2<IncludeFileInfo.FilesNum;i2++)
+		HeapDefaultFree(IncludeFileInfo.ppFileNames[i2]);
+	HeapDefaultFree(IncludeFileInfo.ppFileNames);
+}
+int MainThread(DWORD dummy){
+	extern BOOL bDebugCompile;
+	extern BOOL bDebugRun;
+	extern int bError;
+
+	if(bDebugRun){
+		if(bDebugCompile){
+			bDebugRun=0;
+
+			//デバッグコンパイル
+			OutputExe();
+
+			bDebugRun=1;
+		}
+
+		//デバッグ実行
+		if(bError==0) DebugProgram();
+	}
+	else{
+		//リリースコンパイル
+		OutputExe();
+	}
+
+	return 0;
+}
Index: /trunk/abdev/BasicCompiler_Common/NonVolatile.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/NonVolatile.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/NonVolatile.cpp	(revision 147)
@@ -0,0 +1,295 @@
+#include "../BasicCompiler_Common/common.h"
+
+
+char *ReadBuffer_NonErrMsg(char *path){
+	extern HANDLE hHeap;
+	int i;
+	DWORD dw;
+	char *buffer;
+	HANDLE hFile;
+
+	hFile=CreateFile(path,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE) return 0;
+	i=GetFileSize(hFile,0);
+	buffer=(char *)HeapAlloc(hHeap,0,i+1);
+	ReadFile(hFile,buffer,i,&dw,0);
+	buffer[dw]=0;
+	CloseHandle(hFile);
+	return buffer;
+}
+_int8 WriteBuffer(char *path,char *buffer,int length){
+	extern HWND hOwnerEditor;
+	HANDLE hFile;
+	DWORD dw;
+	hFile=CreateFile(path,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		char temporary[MAX_PATH];
+
+		sprintf(temporary,"\"%s\" ファイルへの書き込みに失敗しました。",path);
+		MessageBox(hOwnerEditor,temporary,"エラー",MB_OK|MB_ICONEXCLAMATION);
+		return 0;
+	}
+	if(length) WriteFile(hFile,buffer,length,&dw,NULL);
+	CloseHandle(hFile);
+	return 1;
+}
+
+
+///////////////////////////
+// 不揮発性のデータ管理
+///////////////////////////
+
+BOOL CNonVolatile::GetDataLine(char *name,char *parms){
+	int i,i2,length;
+	length=lstrlen(name);
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+		if(i==0||buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
+			if(memcmp(buffer+i,name,length)==0&&buffer[i+length]=='='){
+				i+=length+1;
+				for(i2=0;;i++,i2++){
+					if(buffer[i]=='\r'&&buffer[i+1]=='\n'||buffer[i]=='\0'){
+						parms[i2]=0;
+						break;
+					}
+					parms[i2]=buffer[i];
+				}
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+
+BOOL CNonVolatile::GetWholeValue(char *name,int *pi32data){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	*pi32data=atoi(temporary);
+	return 1;
+}
+BOOL CNonVolatile::Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d",pd1,pd2,pd3);
+	return 1;
+}
+BOOL CNonVolatile::GetRGBValue(char *name,COLORREF *prgb){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%x",prgb);
+	return 1;
+}
+BOOL CNonVolatile::GetStringValue(char *name,char *str){
+	if(!GetDataLine(name,str)) return 0;
+	return 1;
+}
+BOOL CNonVolatile::GetRectValue(char *name,RECT *prc){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d,%d",&prc->left,&prc->top,&prc->right,&prc->bottom);
+	return 1;
+}
+BOOL CNonVolatile::GetPointValue(char *name,POINT *pos){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d",&pos->x,&pos->y);
+	return 1;
+}
+
+void CNonVolatile::load(){
+	extern HANDLE hHeap;
+	int i;
+	char temporary[MAX_PATH];
+
+	//開く
+	extern char BasicSystemDir[MAX_PATH];
+	sprintf(temporary,"%sUserSetting\\compiler.ini",BasicSystemDir);
+
+	buffer=ReadBuffer_NonErrMsg(temporary);
+	if(!buffer){
+		//レジストリを読み込む
+		OldLoad();
+		return;
+	}
+
+
+	if(!GetWholeValue("IsShow_DefaultSystem_Var",&bShow_DefaultSystem_Var)) bShow_DefaultSystem_Var=0;
+	if(!GetWholeValue("IsShow_Rad_Var",&bShow_Rad_Var)) bShow_Rad_Var=0;
+	if(!GetWholeValue("IsShow_GUID_Var",&bShow_GUID_Var)) bShow_Rad_Var=0;
+
+	extern int ScreenX,ScreenY;
+	if(!GetPointValue("MainDlgPos",&MainDlgPos)){
+		MainDlgPos.x=ScreenX/2-100;
+		MainDlgPos.y=ScreenX/2-250;
+	}
+
+	if(!GetRectValue("VarDlgRect",&VarDlgRect)){
+		VarDlgRect.left=ScreenX/2-390/2;
+		VarDlgRect.top=ScreenY/2-270/2;
+		VarDlgRect.right=ScreenX/2+390/2;
+		VarDlgRect.bottom=ScreenY/2+270/2;
+	}
+
+	//ウォッチリスト
+	if(!GetWholeValue("WatchNum",&WatchNum)) WatchNum=0;
+
+	ppWatchStr=(char **)HeapAlloc(hHeap,0,WatchNum*sizeof(char *)+1);
+	for(i=0;i<WatchNum;i++){
+		sprintf(temporary,"Watch%03d",i);
+
+		char temp2[VN_SIZE];
+		GetStringValue(temporary,temp2);
+		ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+		lstrcpy(ppWatchStr[i],temp2);
+	}
+
+
+	HeapDefaultFree(buffer);
+}
+void CNonVolatile::OldLoad(){
+	extern HANDLE hHeap;
+	extern int ScreenX,ScreenY;
+
+	int i;
+	HKEY hKey;
+	ULONG ulSize;
+	char temporary[MAX_PATH],temp2[VN_SIZE];
+
+	if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Discoversoft\\BasicCompiler",0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS){
+		bShow_DefaultSystem_Var=0;
+		bShow_Rad_Var=0;
+		bShow_GUID_Var=0;
+
+		MainDlgPos.x=ScreenX/2-100;
+		MainDlgPos.y=ScreenX/2-250;
+
+		VarDlgRect.left=ScreenX/2-390/2;
+		VarDlgRect.top=ScreenY/2-270/2;
+		VarDlgRect.right=ScreenX/2+390/2;
+		VarDlgRect.bottom=ScreenY/2+270/2;
+
+		WatchNum=0;
+		ppWatchStr=(char **)HeapAlloc(hHeap,0,1);
+	}
+	else{
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"bShow_DefaultSystem_Var",NULL,NULL,(BYTE *)&bShow_DefaultSystem_Var,&ulSize)!=ERROR_SUCCESS)
+			bShow_DefaultSystem_Var=0;
+
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"bShow_Rad_Var",NULL,NULL,(BYTE *)&bShow_Rad_Var,&ulSize)!=ERROR_SUCCESS)
+			bShow_Rad_Var=0;
+
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"bShow_GUID_Var",NULL,NULL,(BYTE *)&bShow_GUID_Var,&ulSize)!=ERROR_SUCCESS)
+			bShow_GUID_Var=0;
+
+		ulSize=1024;
+		if(RegQueryValueEx(hKey,"MainDlgPos",NULL,NULL,(unsigned char *)temporary,&ulSize)!=ERROR_SUCCESS){
+			MainDlgPos.x=ScreenX/2-100;
+			MainDlgPos.y=ScreenX/2-250;
+		}
+		else sscanf(temporary,"%d %d",
+			&MainDlgPos.x,
+			&MainDlgPos.y);
+
+		ulSize=1024;
+		if(RegQueryValueEx(hKey,"VarDlgRect",NULL,NULL,(unsigned char *)temporary,&ulSize)!=ERROR_SUCCESS){
+			VarDlgRect.left=ScreenX/2-390/2;
+			VarDlgRect.top=ScreenY/2-270/2;
+			VarDlgRect.right=ScreenX/2+390/2;
+			VarDlgRect.bottom=ScreenY/2+270/2;
+		}
+		else sscanf(temporary,"%d %d %d %d",
+			&VarDlgRect.left,
+			&VarDlgRect.top,
+			&VarDlgRect.right,
+			&VarDlgRect.bottom);
+
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"WatchNum",NULL,NULL,(BYTE *)&WatchNum,&ulSize)!=ERROR_SUCCESS)
+			WatchNum=0;
+		ppWatchStr=(char **)HeapAlloc(hHeap,0,WatchNum*sizeof(char *)+1);
+		for(i=0;i<WatchNum;i++){
+			sprintf(temporary,"WathNum%03d",i);
+			ulSize=VN_SIZE;
+			if(RegQueryValueEx(hKey,temporary,NULL,NULL,(unsigned char *)temp2,&ulSize)!=ERROR_SUCCESS){
+				WatchNum=i;
+				break;
+			}
+			ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+			lstrcpy(ppWatchStr[i],temp2);
+		}
+	}
+}
+
+void CNonVolatile::SetWholeValue(char *name,long i32data){
+	sprintf(buffer+lstrlen(buffer),"%s=%d\r\n",name,i32data);
+}
+void CNonVolatile::Set3WholeValue(char *name,long d1,long d2,long d3){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d\r\n",name,d1,d2,d3);
+}
+void CNonVolatile::SetRGBValue(char *name,COLORREF rgb){
+	sprintf(buffer+lstrlen(buffer),"%s=%x\r\n",name,rgb);
+}
+void CNonVolatile::SetStringValue(char *name,char *str){
+	sprintf(buffer+lstrlen(buffer),"%s=%s\r\n",name,str);
+}
+void CNonVolatile::SetRectValue(char *name,RECT *prc){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d,%d\r\n",name,prc->left,prc->top,prc->right,prc->bottom);
+}
+void CNonVolatile::SetPointValue(char *name,POINT *pos){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d\r\n",name,pos->x,pos->y);
+}
+
+void CNonVolatile::save(){
+	int i;
+	char temporary[MAX_PATH];
+
+	extern char BasicSystemDir[MAX_PATH];
+	sprintf(temporary,"%sUserSetting",BasicSystemDir);
+
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind==INVALID_HANDLE_VALUE){
+		//UserSettingディレクトリを作成
+		if(!CreateDirectory(temporary,NULL)){
+			extern HWND hOwnerEditor;
+			MessageBox(hOwnerEditor,"UserSettingディレクトリの作成に失敗","ActiveBasic",MB_OK|MB_ICONEXCLAMATION);
+			return;
+		}
+	}
+
+	extern HANDLE hHeap;
+	buffer=(char *)HeapAlloc(hHeap,0,65536);
+	buffer[0]=0;
+
+
+	SetWholeValue("IsShow_DefaultSystem_Var",bShow_DefaultSystem_Var);
+	SetWholeValue("IsShow_Rad_Var",bShow_Rad_Var);
+	SetWholeValue("IsShow_GUID_Var",bShow_GUID_Var);
+
+	SetPointValue("MainDlgPos",&MainDlgPos);
+
+	SetRectValue("VarDlgRect",&VarDlgRect);
+
+	//ウォッチリスト
+	SetWholeValue("WatchNum",WatchNum);
+	for(i=0;i<WatchNum;i++){
+		sprintf(temporary,"Watch%03d",i);
+		SetStringValue(temporary,ppWatchStr[i]);
+		HeapDefaultFree(ppWatchStr[i]);
+	}
+	HeapDefaultFree(ppWatchStr);
+
+
+	//保存
+	extern char BasicSystemDir[MAX_PATH];
+	sprintf(temporary,"%sUserSetting\\compiler.ini",BasicSystemDir);
+	WriteBuffer(temporary,buffer,lstrlen(buffer));
+
+
+	HeapDefaultFree(buffer);
+}
Index: /trunk/abdev/BasicCompiler_Common/NonVolatile.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/NonVolatile.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/NonVolatile.h	(revision 147)
@@ -0,0 +1,42 @@
+
+char *ReadBuffer_NonErrMsg(char *path);
+
+class CNonVolatile{
+	char *buffer;
+
+	void OldLoad();
+
+	BOOL GetDataLine(char *name,char *parms);
+
+	BOOL GetWholeValue(char *name,int *pi32data);
+	BOOL Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3);
+	BOOL GetRGBValue(char *name,COLORREF *prgb);
+	BOOL GetStringValue(char *name,char *str);
+	BOOL GetRectValue(char *name,RECT *prc);
+	BOOL GetPointValue(char *name,POINT *prc);
+
+	void SetWholeValue(char *name,long i32data);
+	void Set3WholeValue(char *name,long d1,long d2,long d3);
+	void SetRGBValue(char *name,COLORREF rgb);
+	void SetStringValue(char *name,char *str);
+	void SetRectValue(char *name,RECT *prc);
+	void SetPointValue(char *name,POINT *prc);
+public:
+	BOOL bShow_DefaultSystem_Var;
+	BOOL bShow_Rad_Var;
+	BOOL bShow_GUID_Var;
+
+	POINT MainDlgPos;
+	RECT VarDlgRect;
+
+	//デバッグのウォッチリスト
+	int WatchNum;
+	char **ppWatchStr;
+
+
+	CNonVolatile(){};
+	~CNonVolatile(){};
+	void load();
+	void save();
+};
+extern CNonVolatile *pobj_nv;
Index: /trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 147)
@@ -0,0 +1,924 @@
+#include "common.h"
+
+
+int MakeWholeType(int size,int bSigned){
+	switch(size){
+		case 1:
+			if(bSigned) return DEF_SBYTE;
+			else return DEF_BYTE;
+			break;
+		case 2:
+			if(bSigned) return DEF_INTEGER;
+			else return DEF_WORD;
+			break;
+		case 4:
+			if(bSigned) return DEF_LONG;
+			else return DEF_DWORD;
+			break;
+		case 8:
+			if(bSigned) return DEF_INT64;
+			else return DEF_QWORD;
+			break;
+	}
+	return 0;
+}
+
+int AutoBigCast(int BaseType,int CalcType){
+	int type;
+	type=CalcType;
+
+	if(BaseType==0||BaseType==-1){
+		//ベースタイプが未定のとき
+		return type;
+	}
+
+	if(!IsWholeNumberType(type)){
+		//整数型ではないときは暗黙の変換は必要なし
+		return type;
+	}
+
+	if(BaseType==DEF_OBJECT||BaseType==DEF_STRUCT){
+		//ベースタイプがオブジェクトのときは暗黙の変換は必要なし
+		return type;
+	}
+
+	int BaseTypeSize;
+	BaseTypeSize=GetTypeSize(BaseType,-1);
+
+	if(IsRealNumberType(BaseType)){
+		if(GetTypeSize(CalcType,-1)<4)
+			type=MakeWholeType(4,IsSignedType(CalcType));
+	}
+	else if(BaseTypeSize>GetTypeSize(CalcType,-1)){
+		//要求される型のほうがサイズが大きいとき
+		type=MakeWholeType(BaseTypeSize,IsSignedType(CalcType));
+	}
+
+	if(!type){
+		extern int cp;
+		SetError(300,NULL,cp);
+	}
+
+	return type;
+}
+
+BOOL CheckCalcType(int idCalc,int *type,int sp){
+	//演算子の右辺、左辺の型をチェック
+	extern int cp;
+
+	//演算子名を取得
+	char temporary[255];
+	GetCalcName(idCalc,temporary);
+
+	switch(idCalc){
+
+		/////////////////////////////////////
+		// 実数に対する論理演算はエラー
+		/////////////////////////////////////
+
+		case CALC_XOR:
+		case CALC_OR:
+		case CALC_AND:
+			if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+				//いずれかの項が実数のとき
+				SetError(45,temporary,cp);
+				return 0;
+			}
+
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				SetError(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_NOT:
+			if(IsRealNumberType(type[sp-1])){
+				//実数のとき
+				SetError(45,temporary,cp);
+				return 0;
+			}
+
+			//As以外の演算子に型名が指定されていないかをチェック
+			if(type[sp-1]&FLAG_CAST){
+				SetError(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+
+
+		/////////////////////////////////////
+		// 比較演算はチェック項目なし
+		/////////////////////////////////////
+
+		case CALC_PE:
+		case CALC_QE:
+		case CALC_NOTEQUAL:
+		case CALC_EQUAL:
+		case CALC_P:
+		case CALC_Q:
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				SetError(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+
+
+		/////////////////////////////////////
+		// 算術演算をチェック
+		/////////////////////////////////////
+
+		case CALC_ADDITION:
+		case CALC_SUBTRACTION:
+		case CALC_PRODUCT:
+		case CALC_QUOTIENT:
+		case CALC_POWER:
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				SetError(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_SHL:
+		case CALC_SHR:
+		case CALC_MOD:
+		case CALC_INTQUOTIENT:
+			if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+				//いずれかの項が実数のとき
+				SetError(45,temporary,cp);
+				return 0;
+			}
+
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				SetError(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_AS:
+			if((type[sp-1]&FLAG_CAST)==0){
+				//型名が指定されていないときはエラー
+				SetError(47,NULL,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_BYVAL:
+			if(type[sp-1]&FLAG_CAST){
+				//型名が指定されていないときはエラー
+				SetError(47,NULL,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_MINUSMARK:
+			//As以外の演算子に型名が指定されていないかをチェック
+			if(type[sp-1]&FLAG_CAST){
+				SetError(48,temporary,cp);
+				return 0;
+			}
+			break;
+	}
+	return 1;
+}
+
+int GetReturnType_OperatorProc(int idCalc,const Type &baseType,int *type,LONG_PTR *index_stack,int &sp){
+	//オーバーロードされたオペレータ関数の戻り値を取得
+	CClass *pobj_c;
+	pobj_c=(CClass *)index_stack[sp-2];
+
+	std::vector<UserProc *> subs;
+	pobj_c->GetMethods().Enum( idCalc, subs );
+	if( subs.size() == 0 ){
+		return 0;
+	}
+
+
+	//項の数
+	BOOL bTwoTerm=1;
+	if(idCalc==CALC_AS) bTwoTerm=0;
+
+
+
+	/////////////////////////////////////////////
+	// オーバーロード解決用のパラメータを設定
+	/////////////////////////////////////////////
+
+
+	//_System_LocalThis
+	Parameters params;
+
+	if(bTwoTerm){
+		params.push_back( new Parameter( "", Type( type[sp-1], index_stack[sp-1] ) ) );
+	}
+
+
+	//オーバーロードを解決
+	char temporary[255];
+	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
+	else GetCalcName(idCalc,temporary);
+	UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
+
+	if(bTwoTerm){
+		delete params[0];
+	}
+
+	if(!pUserProc){
+		return 0;
+	}
+	else{
+		//オーバーロードされていないが、パラメータ個数が一致しないとき
+		if(params.size()!=pUserProc->Params().size()){
+			return 0;
+		}
+	}
+
+	sp--;
+	type[sp-1]=pUserProc->ReturnType().GetBasicType();
+	index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
+
+	return 1;
+}
+
+bool Operator_New_GetType(const char *Parameter,const Type &baseType, Type &resultType ){
+	char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
+	int i,i2;
+
+	i=0;
+
+	if(Parameter[0]=='['){
+		i=GetStringInBracket(objectSizeStr,Parameter);
+
+		SlideString(objectSizeStr+1,-1);
+		objectSizeStr[i-2]=0;
+	}
+	else objectSizeStr[0]=0;
+
+	for(i2=0;;i++,i2++){
+		if(Parameter[i]=='('){
+			TypeName[i2]=0;
+
+			//コンストラクタに渡すパラメータを取得
+			i2=GetStringInPare(CreateParameter,Parameter+i);
+			RemoveStringPare(CreateParameter);
+			i+=i2;
+			if(Parameter[i]!='\0'){
+				SetError(42,NULL,cp);
+				return false;
+			}
+			break;
+		}
+		TypeName[i2]=Parameter[i];
+		if(Parameter[i]=='\0'){
+			CreateParameter[0]=0;
+			break;
+		}
+	}
+
+	if( !Type::StringToType( TypeName, resultType ) ){
+		return false;
+	}
+
+	if( baseType.IsObject() ){
+		resultType.SetBasicType( DEF_OBJECT );
+	}
+	else{
+		resultType.SetBasicType( DEF_PTR_OBJECT );
+	}
+	return true;
+}
+
+bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName ){
+	char parameter[VN_SIZE];
+
+	// Withを解決
+	char termFull[VN_SIZE];
+	if(term[0]=='.'){
+		GetWithName(termFull);
+		lstrcat(termFull,term);
+	}
+	else lstrcpy(termFull,term);
+
+	char termLeft[VN_SIZE];
+	lstrcpy(termLeft,termFull);
+
+	// パース
+	char member[VN_SIZE];
+	CClass::RefType refType;
+	if( SplitMemberName( termFull, termLeft, member, refType ) ){
+		///////////////////////////////////////////////////////////////////
+		// オブジェクトとメンバに分解できるとき
+		// termLeft.member
+		///////////////////////////////////////////////////////////////////
+
+		isLiteral = false;
+
+		// オブジェクト側の型を取得
+		bool isClassName = false;
+		Type leftType;
+		if( GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && Smoothie::Meta::blittableTypes.IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					Smoothie::Meta::blittableTypes.Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+
+				if( !GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+					goto globalArea;
+				}
+			}
+		}
+		else{
+			goto globalArea;
+		}
+
+		if( isClassName ){
+			// 静的メンバ/メソッドの場合
+			goto globalArea;
+		}
+
+		if( !leftType.HasMember() ){
+			// メンバを持たない型の場合
+			return false;
+		}
+
+		const CClass &objClass = leftType.GetClass();
+
+
+		///////////////////////////////////////////////////////////////////
+		// メンバを検索
+		///////////////////////////////////////////////////////////////////
+		if( GetMemberType( objClass, member, resultType, 0, false ) ){
+			// メンバが見つかったとき
+			return true;
+		}
+
+
+		///////////////////////////////////////////////////////////////////
+		// 動的メソッドを検索
+		///////////////////////////////////////////////////////////////////
+		vector<UserProc *> userProcs;
+
+		char methodName[VN_SIZE] ,lpPtrOffset[VN_SIZE];
+		lstrcpy( methodName, member );
+		GetVarFormatString(methodName,parameter,lpPtrOffset,member,refType);
+
+		objClass.GetMethods().Enum( methodName, userProcs );
+		UserProc *pUserProc;
+		if(userProcs.size()){
+			//オーバーロードを解決
+			pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
+
+			if( pUserProc ){
+				resultType = pUserProc->ReturnType();
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+
+	//////////////////////////////////////////////
+	// クラス名かどうかをチェック（静的メンバ用）
+	//////////////////////////////////////////////
+
+	if( pIsClassName ){
+		if( pobj_DBClass->Find( termFull ) ){
+			*pIsClassName = true;
+			return true;
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// グローバル属性
+	/////////////////////////////////////////////////////////////////
+globalArea:
+
+
+	if(lstrcmpi(termFull,"This")==0){
+		//Thisオブジェクト
+		resultType.SetType( DEF_OBJECT, pobj_CompilingClass );
+		isLiteral = false;
+		return true;
+	}
+
+
+	//////////////////////////////////////
+	// 関数（DLL、ユーザー定義、組み込み）
+	//////////////////////////////////////
+	char procName[VN_SIZE];
+	char temporary[8192];
+
+	int i2=GetCallProcName(termFull,procName);
+	if(termFull[i2]=='('){
+		int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
+
+		void *pProc;
+		int idProc=GetProc(procName,(void **)&pProc);
+
+		if(idProc){
+			//閉じカッコ")"に続く文字がNULLでないとき
+			if(termFull[i2+1+i4+1]!='\0'){
+				SetError(42,NULL,cp);
+			}
+
+
+			////////////////
+			// 呼び出し
+			////////////////
+
+			if( !CallProc(idProc,pProc,procName,parameter, resultType, false ) ){
+				return false;
+			}
+			if( resultType.IsNull() ){
+				//戻り値が存在しないとき
+				return false;
+			}
+
+			isLiteral = false;
+
+			return true;
+		}
+		else if(GetConstCalcBuffer(procName,parameter,temporary)){
+			/////////////////////////
+			// マクロ関数
+			/////////////////////////
+
+			//閉じカッコ")"に続く文字がNULLでないときはエラーにする
+			if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+			//マクロ関数の場合
+			if( !NumOpe_GetType(temporary,Type(),resultType) ){
+				return false;
+			}
+
+			if( !IS_LITERAL( resultType.GetIndex() ) ){
+				//リテラル値ではなかったとき
+				isLiteral = false;
+			}
+
+			return true;
+		}
+	}
+
+
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(termFull,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		GetVarType(VarName,resultType,false);
+		if( resultType.IsObject() ){
+			if( !GetReturnTypeOfIndexerGetterProc( resultType.GetClass(),resultType) ){
+				SetError(1,NULL,cp);
+				return false;
+			}
+
+			isLiteral = false;
+
+			return true;
+		}
+	}
+
+
+	////////////////////////////////
+	// 変数
+	////////////////////////////////
+
+	if( GetVarType( termFull, resultType, false ) ){
+		if( resultType.GetBasicType() & FLAG_PTR ){
+			//配列ポインタ
+			resultType.SetBasicType( GetPtrType( resultType.GetBasicType()^FLAG_PTR ) );
+		}
+
+		isLiteral = false;
+
+		return true;
+	}
+
+
+	/////////////////////////////////
+	// プロパティ用のメソッド
+	/////////////////////////////////
+
+	//配列要素を排除
+	GetArrayElement(termFull,VarName,ArrayElements);
+
+	if(GetSubHash(VarName,0)){
+		GetReturnTypeOfPropertyMethod(termFull,NULL,resultType);
+
+		isLiteral = false;
+
+		return true;
+	}
+
+
+	return false;
+}
+
+bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){
+	extern int cp;
+	int i,i3;
+
+	if(expression[0]=='\0'){
+		SetError(1,NULL,cp);
+		return false;
+	}
+
+	if(expression[0]==1&& expression[1]==ESC_NEW ){
+		//New演算子（オブジェクト生成）
+		return Operator_New_GetType(expression+2,baseType, resultType );
+	}
+
+	if( expression[0] == '[' ){
+		if( !baseType.IsPointer() ){
+			SetError(1,NULL,cp);
+			return false;
+		}
+
+		resultType = baseType;
+		return true;
+	}
+
+
+	/////////////////////////////////
+	// 式要素を逆ポーランド式で取得
+	/////////////////////////////////
+
+	char *values[255];
+	long calc[255];
+	long stack[255];
+	int pnum;
+	if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
+		for(i=0;i<pnum;i++){
+			if(values[i]) HeapDefaultFree(values[i]);
+		}
+		return false;
+	}
+
+
+
+	////////////////////////////////
+	// 演算部分のコード生成を開始
+	////////////////////////////////
+
+	BOOL bError;
+	bError=0;
+
+	//リテラル値のみの計算かどうかを判別するためのフラグ
+	BOOL bLiteralCalculation=1;
+
+	int sp;
+	int type_stack[255];
+	LONG_PTR index_stack[255];
+	bool isNothing_stack[255];
+	_int64 i64data;
+	int idCalc;
+	for(i=0,sp=0;i<pnum;i++){
+		idCalc=calc[i]%100;
+
+		if(idCalc){
+			if(type_stack[sp-2]==DEF_OBJECT){
+				if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& index_stack[sp-1] == index_stack[sp-2]
+					|| isNothing_stack[sp-2] ){
+						// 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
+				}
+				else if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
+					)){
+						// ダウンキャストを許可する
+				}
+				else if( idCalc == CALC_AS ){
+					// NumOpe_GetTypeではすべてのキャストを許可する
+				}
+				else{
+					//オーバーロードされたオペレータを呼び出す
+					if(!GetReturnType_OperatorProc(idCalc,baseType,type_stack,index_stack,sp)){
+						goto error;
+					}
+
+					continue;
+				}
+			}
+
+			if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
+		}
+
+		switch(idCalc){
+			//数値
+			case 0:
+				index_stack[sp]=-1;
+				isNothing_stack[sp] = false;
+
+				char *term;
+				term = values[i];
+
+				if( calc[i+1]%100 == CALC_AS ){
+					// As演算子の右辺値
+					//型名
+					if( Type::StringToType( term, resultType ) ){
+
+						if( resultType.IsObject() ){
+							if( resultType.GetClass().IsBlittableType() ){
+								// Blittable型のときは基本型として扱う
+								// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+								if( UserProc::IsLocalAreaCompiling()
+									&& UserProc::CompilingUserProc().HasParentClass()
+									&& UserProc::CompilingUserProc().GetParentClass().IsBlittableType() )
+								{
+									// コンパイル中のメソッドがBlittable型クラスに属している
+								}
+								else{
+									resultType = resultType.GetClass().GetBlittableType();
+								}
+							}
+						}
+
+						resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
+					}
+					else{
+						SetError(3, term, cp );
+						goto error;
+					}
+
+					type_stack[sp] = resultType.GetBasicType();
+					index_stack[sp] = resultType.GetIndex();
+					sp++;
+
+					break;
+				}
+
+				if(term[0]=='\"'){
+StrLiteral:
+
+					if( baseType.IsObject() || baseType.IsNull() ){
+						//要求タイプがオブジェクト、または未定のとき
+						type_stack[sp]=DEF_OBJECT;
+						index_stack[sp]=(LONG_PTR)pobj_DBClass->GetStringClassPtr();
+						bLiteralCalculation=0;
+
+						sp++;
+						break;
+					}
+
+					type_stack[sp]=typeOfPtrChar;
+					bLiteralCalculation=0;
+				}
+				else if((term[0]=='e'||term[0]=='E')&&
+					(term[1]=='x'||term[1]=='X')&&
+					term[2]=='\"'){
+					//拡張版リテラル文字列（エスケープシーケンス可能）
+					goto StrLiteral;
+				}
+				else if(IsVariableTopChar(term[0])||
+					term[0]=='*'||
+					(term[0]=='.'&&IsVariableTopChar(term[1]))){
+					//////////////////
+					// 何らかの識別子
+
+					bool isLiteral = true;
+					if( GetTermType( term, resultType, isLiteral ) ){
+						type_stack[sp] = resultType.GetBasicType();
+						index_stack[sp] = resultType.GetIndex();
+
+						if( !isLiteral ){
+							bLiteralCalculation=0;
+						}
+
+						sp++;
+						break;
+					}
+
+
+					// Nothing
+					if( lstrcmp( term, "Nothing" ) == 0 ){
+						isNothing_stack[sp] = true;
+
+						type_stack[sp] = DEF_OBJECT;
+						if( baseType.IsObject() ){
+							index_stack[sp] = baseType.GetIndex();
+						}
+						else{
+							index_stack[sp] = (LONG_PTR)pobj_DBClass->GetObjectClassPtr();
+						}
+						bLiteralCalculation = 0;
+						sp++;
+						break;
+					}
+
+
+					//////////////
+					// 定数の場合
+					//////////////
+
+					i3 = CDBConst::obj.GetBasicType(term);
+					if(i3){
+						if( CDBConst::obj.IsStringPtr( term ) ){
+							//リテラル文字列
+							goto StrLiteral;
+						}
+
+						type_stack[sp]=i3;
+						if(IsRealNumberType(i3)){
+							//実数
+							goto Literal;
+						}
+						else if(IsWholeNumberType(i3)){
+							//整数
+							goto Literal;
+						}
+						else if(Is64Type(i3)){
+							//64ビット整数値
+							goto Literal;
+						}
+						else{
+							SetError(1,NULL,0);
+							goto error;
+						}
+					}
+
+
+					/////////////////////////////////
+					// プロパティ用のメソッド
+					/////////////////////////////////
+
+					//配列要素を排除
+					char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+					GetArrayElement(term,VarName,ArrayElements);
+
+					if(GetSubHash(VarName,0)){
+						SetError();
+						Type tempType;
+						GetReturnTypeOfPropertyMethod(term,NULL,tempType);
+
+						//大きな型への暗黙の変換
+						type_stack[sp]=tempType.GetBasicType();
+
+						index_stack[sp]=tempType.GetIndex();
+						bLiteralCalculation=0;
+
+						sp++;
+						break;
+					}
+
+
+
+					//該当する識別子が見当たらないときはエラー扱いにする
+					bError=1;
+					SetError(3,term,cp);
+					type_stack[sp]=DEF_DOUBLE;
+				}
+				else{
+					//リテラル値
+					int base_type = 0;
+					if( !baseType.IsNull() ) base_type = baseType.GetBasicType();
+					type_stack[sp]=GetLiteralValue(term,&i64data,base_type);
+Literal:
+					if((long)i64data==0&&index_stack[sp]==-1) index_stack[sp]=LITERAL_NULL;
+				}
+
+				sp++;
+				break;
+
+			//論理演算子
+			case CALC_XOR:
+			case CALC_OR:
+			case CALC_AND:
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_NOT:
+				//values[sp-1]=Not values[sp-1]
+				//NOT演算子
+				break;
+
+			//比較演算子
+			case CALC_PE:		//values[sp-2] <= values[sp-1]
+			case CALC_QE:		//values[sp-2] >= values[sp-1]
+			case CALC_P:		//values[sp-2] <  values[sp-1]
+			case CALC_Q:		//values[sp-2] >  values[sp-1]
+			case CALC_NOTEQUAL:	//values[sp-2] <> values[sp-1]
+			case CALC_EQUAL:	//values[sp-2] =  values[sp-1]	
+				sp--;
+				type_stack[sp-1]=DEF_LONG;
+				break;
+
+			//ビットシフト
+			case CALC_SHL:	//values[sp-2] << values[sp-1]
+			case CALC_SHR:	//values[sp-2] >> values[sp-1]
+				sp--;
+				break;
+
+			//算術演算
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_PRODUCT:
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_MOD:
+				//values[sp-2]%=values[sp-1]
+				//剰余演算
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_QUOTIENT:
+				//values[sp-2]/=values[sp-1];
+				//除算
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_INTQUOTIENT:
+				//values[sp-2]/=values[sp-1]
+				//整数除算
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_MINUSMARK:
+				//values[sp-1]=-values[sp-1]
+				//符号反転
+				break;
+			case CALC_POWER:
+				//べき乗演算（浮動小数点演算のみ）
+				sp--;
+				//未完成
+				break;
+			case CALC_AS:
+				//キャスト
+				type_stack[sp-2]=type_stack[sp-1]&(~FLAG_CAST);
+				index_stack[sp-2]=index_stack[sp-1];
+
+				sp--;
+				break;
+
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					SetError( 3, NULL, cp );
+					goto error;
+				}
+
+				type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
+				break;
+		}
+	}
+
+	if(bError) goto error;
+
+	if(sp!=1){
+		SetError(1,NULL,cp);
+		goto error;
+	}
+
+	if(bLiteralCalculation){
+		//右辺値が数値の定数式の場合
+		int base_type = 0;
+		if( !baseType.IsNull() ) base_type = baseType.GetBasicType();
+		Type tempType;
+		StaticCalculation(true, expression,base_type,&i64data,tempType);
+
+		type_stack[0]=tempType.GetBasicType();
+		index_stack[0]=tempType.GetIndex();
+	}
+	else{
+		//右辺値が数値の定数式ではないとき
+		if(IS_LITERAL(index_stack[0])) index_stack[0]=-1;
+	}
+
+	resultType.SetType( type_stack[0], index_stack[0] );
+
+	bool isSuccessful = true;
+	goto finish;
+
+
+	//////////////////
+	// エラー処理
+	//////////////////
+
+error:
+	isSuccessful = false;
+	goto finish;
+
+
+finish:
+	for(i=0;i<pnum;i++){
+		if(values[i]) HeapDefaultFree(values[i]);
+	}
+	return isSuccessful;
+}
Index: /trunk/abdev/BasicCompiler_Common/Object.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Object.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Object.cpp	(revision 147)
@@ -0,0 +1,138 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+extern HANDLE hHeap;
+
+void CallConstructor( const char *ObjectName,const int *SubScripts,const Type &type,const char *Parameter){
+	if( !type.IsObject() ){
+		return;
+	}
+
+	/////////////////////////////////////
+	// クラスオブジェクトの場合
+	// ※コンストラクタの呼び出し
+	/////////////////////////////////////
+
+	UserProc *pUserProc;
+	pUserProc=GetMethodHash(ObjectName,type.GetClass().GetName().c_str(),Parameter);
+	if(!pUserProc){
+		if(Parameter[0]) SetError(113,type.GetClass().GetName().c_str(),cp);
+		return;
+	}
+
+
+	char temporary[VN_SIZE];
+
+	if(SubScripts[0]!=-1){
+		int ss[MAX_ARRAYDIM];
+		memset(ss,0,MAX_ARRAYDIM*sizeof(int));
+		while(1){
+			int i3;
+			for(i3=0;;i3++){
+				if(SubScripts[i3]==-1) break;
+
+				if(ss[i3]>SubScripts[i3]){
+					ss[i3]=0;
+					ss[i3+1]++;
+				}
+				else break;
+			}
+			if(SubScripts[i3]==-1) break;
+			sprintf(temporary,"%s[%d",ObjectName,ss[0]);
+			for(i3=1;;i3++){
+				if(SubScripts[i3]==-1) break;
+
+				sprintf(temporary+lstrlen(temporary),",%d",ss[i3]);
+			}
+			lstrcat(temporary,"]");
+
+			Type dummyType;
+			sprintf(temporary+lstrlen(temporary),".%s",type.GetClass().GetName().c_str());
+			CallProc( PROC_DEFAULT,
+				pUserProc,
+				temporary,
+				Parameter,
+				dummyType );
+
+			ss[0]++;
+
+
+			//ネイティブコードバッファの再確保
+			ReallocNativeCodeBuffer();
+		}
+	}
+	else{
+		Type dummyType;
+		sprintf(temporary,"%s.%s",ObjectName,type.GetClass().GetName().c_str());
+		CallProc( PROC_DEFAULT,
+			pUserProc,
+			temporary,
+			Parameter,
+			dummyType );
+	}
+}
+
+bool Operator_New( const char *expression, const Type &baseType, Type &resultType ){
+	char CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
+	int i,i2;
+
+	i=0;
+
+	if(expression[0]=='['){
+		i=GetStringInBracket(objectSizeStr,expression);
+
+		SlideString(objectSizeStr+1,-1);
+		objectSizeStr[i-2]=0;
+	}
+	else objectSizeStr[0]=0;
+
+	char typeName[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(expression[i]=='('){
+			typeName[i2]=0;
+
+			//コンストラクタに渡すパラメータを取得
+			i2=GetStringInPare(CreateParameter,expression+i);
+			RemoveStringPare(CreateParameter);
+			i+=i2;
+			if(expression[i]!='\0'){
+				SetError(42,NULL,cp);
+				return false;
+			}
+			break;
+		}
+		typeName[i2]=expression[i];
+		if(expression[i]=='\0'){
+			CreateParameter[0]=0;
+			break;
+		}
+	}
+
+	if( !Type::StringToType( typeName, resultType ) ){
+		SetError(3,typeName,cp);
+		return false;
+	}
+
+	if( !resultType.IsObject() ){
+		////////////////////////
+		// 通常のデータ型の場合
+		////////////////////////
+
+		SetError(121,NULL,cp);
+		return false;
+	}
+
+	Operator_New( resultType.GetClass(), objectSizeStr, CreateParameter, baseType );
+
+	if( !baseType.IsObject() ){
+		// オブジェクトポインタ向け
+		resultType.SetBasicType( DEF_PTR_OBJECT );
+	}
+
+	return true;
+}
Index: /trunk/abdev/BasicCompiler_Common/OldStatement.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/OldStatement.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/OldStatement.cpp	(revision 147)
@@ -0,0 +1,332 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+void Opcode_Input(const char *Parameter){
+	extern int cp;
+	int i2,i3,i4,i5;
+	BOOL bFile;
+	char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
+
+	if(Parameter[0]=='#'){
+		bFile=1;
+		for(i2=0,i3=1;;i2++,i3++){
+			buffer[i2]=Parameter[i3];
+			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+		}
+		buffer[i2+1]=0;
+		i2=i3+1;
+	}
+	else{
+		bFile=0;
+		i2=0;
+		buffer[0]=0;
+
+		//表示用文字列パラメータをセット
+		if(Parameter[0]=='\"'){
+			buffer[0]='\"';
+			for(i2=1;;i2++){
+				if(Parameter[i2]=='\"'){
+					buffer[i2]=0;
+					break;
+				}
+				buffer[i2]=Parameter[i2];
+			}
+			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+			else SetError(10,"Input",cp);
+			i2+=2;
+		}
+		else if((Parameter[0]=='e'||Parameter[0]=='E')&&
+			(Parameter[1]=='x'||Parameter[1]=='X')&&
+			Parameter[2]=='\"'){
+			memcpy(buffer,Parameter,3);
+			for(i2=3;;i2++){
+				if(Parameter[i2]=='\"'){
+					buffer[i2]=0;
+					break;
+				}
+				buffer[i2]=Parameter[i2];
+			}
+			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+			else SetError(10,"Input",cp);
+			i2+=2;
+		}
+		else{
+			lstrcpy(buffer,"\"? \"");
+			i2=0;
+		}
+	}
+
+	//変数ポインタ、変数のタイプをセット
+	i4=0;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(Parameter[i2]=='('){
+				i5=GetStringInPare(temporary+i3,Parameter+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+			}
+			if(Parameter[i2]=='['){
+				i5=GetStringInBracket(temporary+i3,Parameter+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+			}
+			if(Parameter[i2]==','){
+				temporary[i3]=0;
+				i2++;
+				break;
+			}
+			temporary[i3]=Parameter[i2];
+			if(Parameter[i2]=='\0') break;
+		}
+		if(temporary[0]=='\0'){
+			SetError(10,"Input",cp);
+			return;
+		}
+
+		Type varType;
+		if( !GetVarType(temporary, varType, 1) ){
+			return;
+		}
+
+		sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
+		OpcodeCalc(temp2);
+
+		if(varType.IsLong()) varType.SetBasicType( DEF_DWORD );
+		else if(varType.IsInteger()) varType.SetBasicType( DEF_WORD );
+		else if(varType.IsObject()){
+			varType.SetBasicType( DEF_OBJECT );
+			if( varType.IsStringClass() ){
+				varType.SetBasicType( DEF_STRING );
+			}
+		}
+		sprintf(temp2,"_System_InputDataType[%d]=%d",i4,varType.GetBasicType());
+		OpcodeCalc(temp2);
+
+		i4++;
+		if(Parameter[i2]=='\0') break;
+	}
+	sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
+	OpcodeCalc(temp2);
+
+	UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
+	else pUserProc=GetSubHash("INPUT_FromPrompt");
+	if(!pUserProc){
+		SetError(3,"Input",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"",0);
+}
+void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
+	extern int cp;
+	int i2,i3,i4,i5;
+	char temporary[VN_SIZE],temp2[8192];
+	BOOL bReturnLine;
+
+	char parms[8192];
+	lstrcpy( parms, Parameter );
+
+	i2=lstrlen(parms);
+	if(parms[i2-1]==';'){
+		bReturnLine=0;
+		parms[i2-1]=0;
+	}
+	else bReturnLine=1;
+
+	i3=lstrlen(buffer);
+	for(i2=0;;i2++,i3++){
+		if(parms[i2]==';'){
+			buffer[i3]=0;
+			break;
+		}
+		buffer[i3]=parms[i2];
+		if(parms[i2]=='\0') break;
+	}
+	if(parms[i2]==';') i2++;
+
+	if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+	//データポインタ、データのタイプをセット
+	i4=0;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(parms[i2]=='\"'){
+				temporary[i3]=parms[i2];
+				for(i2++,i3++;;i2++,i3++){
+					temporary[i3]=parms[i2];
+					if(parms[i2]=='\"') break;
+				}
+				continue;
+			}
+			if(parms[i2]=='('){
+				i5=GetStringInPare(temporary+i3,parms+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+				continue;
+			}
+			if(parms[i2]=='['){
+				i5=GetStringInBracket(temporary+i3,parms+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+				continue;
+			}
+			if(parms[i2]==','){
+				temporary[i3]=0;
+				i2++;
+				break;
+			}
+			temporary[i3]=parms[i2];
+			if(parms[i2]=='\0') break;
+		}
+		if(temporary[0]=='\0'){
+			SetError(10,"Print",cp);
+			return;
+		}
+
+		int iResult;
+		iResult=IsStrCalculation(temporary);
+
+		if(iResult==1){
+			//文字列
+			sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
+			OpcodeCalc(temp2);
+
+			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
+			OpcodeCalc(temp2);
+		}
+		else if(iResult==0){
+			//数値
+			sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
+			OpcodeCalc(temp2);
+
+			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
+			OpcodeCalc(temp2);
+		}
+		//else if(iResult==-1) エラー
+
+		i4++;
+		if(parms[i2]=='\0') break;
+	}
+	sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
+	OpcodeCalc(temp2);
+
+	UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
+	else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
+	if(!pUserProc){
+		SetError(3,"Print",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"",0);
+}
+void Opcode_Print(const char *Parameter,BOOL bWrite){
+	int i2,i3,i4,sw;
+	char temporary[VN_SIZE],buffer[VN_SIZE];
+	BOOL bFile;
+
+	if(Parameter[0]=='#'){
+		bFile=1;
+		for(i2=0,i3=1;;i2++,i3++){
+			buffer[i2]=Parameter[i3];
+			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+		}
+		buffer[i2+1]=0;
+		if(Parameter[i3]==',') i3++;
+		i2=i3;
+	}
+	else{
+		bFile=0;
+		i2=0;
+		buffer[0]=0;
+	}
+	if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
+		Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
+		return;
+	}
+
+	lstrcat(buffer,"_System_DummyStr+");
+
+	sw=1;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(Parameter[i2]=='\"'){
+				temporary[i3]=Parameter[i2];
+				for(i2++,i3++;;i2++,i3++){
+					temporary[i3]=Parameter[i2];
+					if(Parameter[i2]=='\"') break;
+				}
+				continue;
+			}
+			if(Parameter[i2]=='('){
+				i4=GetStringInPare(temporary+i3,Parameter+i2);
+				i2+=i4-1;
+				i3+=i4-1;
+				continue;
+			}
+			if(Parameter[i2]=='['){
+				i4=GetStringInBracket(temporary+i3,Parameter+i2);
+				i2+=i4-1;
+				i3+=i4-1;
+				continue;
+			}
+			if(Parameter[i2]==','||Parameter[i2]==';'){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3]=Parameter[i2];
+			if(Parameter[i2]=='\0') break;
+		}
+
+		if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
+		else{
+			int iResult;
+			iResult=IsStrCalculation(temporary);
+			if(iResult==-1){
+				//エラー
+				lstrcat(buffer,"\"\"");
+			}
+			else if(iResult){
+				//文字列
+				lstrcat(buffer,temporary);
+			}
+			else{
+				//数値
+				sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
+			}
+		}
+
+		if(Parameter[i2]==','){
+			if(bWrite) lstrcat(buffer,"+\",\"+");
+			else lstrcat(buffer,"+\"\t\"+");
+		}
+		else if(Parameter[i2]==';'){
+			if(Parameter[i2+1]=='\0'){
+				sw=0;
+				break;
+			}
+			if(bWrite) lstrcat(buffer,"+\",\"+");
+			else lstrcat(buffer,"+\" \"+");
+		}
+		else if(Parameter[i2]=='\0') break;
+
+		i2++;
+	}
+
+	if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+	UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
+	else pUserProc=GetSubHash("PRINT_ToPrompt");
+	if(!pUserProc){
+		SetError(3,"Print",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"",0);
+}
Index: /trunk/abdev/BasicCompiler_Common/Overload.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Overload.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Overload.cpp	(revision 147)
@@ -0,0 +1,74 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+UserProc *OverloadSolutionWithStrParam(
+	const char *name,
+	std::vector<UserProc *> &subs,
+	const char *Parameter,
+	const char *ObjectName){
+
+		// オーバーロードの解決
+
+		//オーバーロードされていないとき
+		if( subs.size() == 1 ) return subs[0];
+
+
+		////////////////////////
+		// パラメータをセット
+		////////////////////////
+
+		ParamImpl *pobj_parameter=0;
+
+		char MethodName[VN_SIZE];
+		if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name );
+/*
+		//メソッドの場合は静的かどうかを調べる
+		bool isStatic = false;
+		CClass *pClass = subs[0]->GetParentClassPtr();
+		if( pClass ){
+			isStatic = pClass->IsExistStaticMethod( MethodName );
+		}
+*/
+		//パラメータオブジェクトを生成
+		pobj_parameter=new ParamImpl(Parameter);
+
+
+		UserProc *pUserProc;
+		pUserProc=pobj_parameter->OverloadSolution(name,subs);
+
+
+		//パラメータオブジェクトを破棄
+		delete pobj_parameter;
+		pobj_parameter=0;
+
+		return pUserProc;
+}
+UserProc *OverloadSolution(
+	const char *name,
+	std::vector<UserProc *> &subs,
+	const Parameters &params,
+	const Type &returnType ){
+
+		// オーバーロードの解決
+
+		//オーバーロードされていないとき
+		if( subs.size() == 1 ) return subs[0];
+
+
+		ParamImpl *pobj_Parameter=new ParamImpl( params );
+		if( !returnType.IsNull() ){
+			pobj_Parameter->SetReturnType( returnType );
+		}
+
+		UserProc *pUserProc;
+		pUserProc=pobj_Parameter->OverloadSolution(name,subs);
+
+		delete pobj_Parameter;
+
+		return pUserProc;
+}
Index: /trunk/abdev/BasicCompiler_Common/PESchedule.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/PESchedule.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/PESchedule.cpp	(revision 147)
@@ -0,0 +1,286 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+extern HANDLE hHeap;
+
+/////////////////////////////////////////////
+// 再配置スケジュール
+//
+// メモリの再配置は.textセクション、または.dataセクションに行われることが予想される。
+//        .textセクション … セクションデータへのポインタ
+//        .dataセクション … vtblの再配置
+/////////////////////////////////////////////
+
+CReloc *pobj_Reloc;
+
+CReloc::CReloc(){
+	buffer=0;
+	length=0;
+	NowPageRVAToReloc=0;
+
+	pdwData_CodeSection=(DWORD *)HeapAlloc(hHeap,0,1);
+	iNum_CodeSection=0;
+	pdwData_DataSection=(DWORD *)HeapAlloc(hHeap,0,1);
+	iNum_DataSection=0;
+}
+CReloc::~CReloc(){
+	AllFree();
+}
+void CReloc::AllFree(void){
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+
+	HeapDefaultFree(pdwData_CodeSection);
+	HeapDefaultFree(pdwData_DataSection);
+}
+void CReloc::copy(CReloc *por){
+	AllFree();
+
+	if(por->buffer){
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,por->length);
+		memcpy(buffer,por->buffer,por->length);
+	}
+	else buffer=0;
+
+	length=por->length;
+
+	NowPageRVAToReloc=por->NowPageRVAToReloc;
+	NowCountAddrToReloc=por->NowCountAddrToReloc;
+
+	iNum_CodeSection=por->iNum_CodeSection;
+	pdwData_CodeSection=(DWORD *)HeapAlloc(hHeap,0,iNum_CodeSection*sizeof(DWORD));
+	memcpy(pdwData_CodeSection,por->pdwData_CodeSection,iNum_CodeSection*sizeof(DWORD));
+
+	iNum_DataSection=por->iNum_DataSection;
+	pdwData_DataSection=(DWORD *)HeapAlloc(hHeap,0,iNum_DataSection*sizeof(DWORD));
+	memcpy(pdwData_DataSection,por->pdwData_DataSection,iNum_DataSection*sizeof(DWORD));
+}
+
+void CReloc::AddSchedule_CodeSection(DWORD addr){
+	extern BOOL bDll;
+	if(!bDll) return;
+
+	pdwData_CodeSection=(DWORD *)HeapReAlloc(hHeap,0,pdwData_CodeSection,(iNum_CodeSection+1)*sizeof(DWORD));
+	pdwData_CodeSection[iNum_CodeSection]=addr;
+	iNum_CodeSection++;
+}
+void CReloc::AddSchedule_DataSection(DWORD addr){
+	extern BOOL bDll;
+	if(!bDll) return;
+
+	pdwData_DataSection=(DWORD *)HeapReAlloc(hHeap,0,pdwData_DataSection,(iNum_DataSection+1)*sizeof(DWORD));
+	pdwData_DataSection[iNum_DataSection]=addr;
+	iNum_DataSection++;
+}
+
+void CReloc::__add(DWORD addr){
+	extern BOOL bDll;
+	if(!bDll) return;
+
+	BOOL sw;
+	sw=0;
+	while((addr-(addr%MEM_ALIGNMENT))>NowPageRVAToReloc){
+		NowPageRVAToReloc+=MEM_ALIGNMENT;
+		sw=1;
+	}
+
+	if(sw){
+		//ページを増やす
+		while(length%4){
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
+			(*(WORD *)(buffer+length))=0;
+			length+=2;
+
+			(*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
+		}
+
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,
+			length+
+			sizeof(DWORD)+
+			sizeof(DWORD));
+
+		//Page RVA
+		*(DWORD *)(buffer+length)=NowPageRVAToReloc;
+		length+=sizeof(DWORD);
+
+		NowCountAddrToReloc=length;
+
+		//Block size
+		*(DWORD *)(buffer+length)=sizeof(DWORD)*2;
+		length+=sizeof(DWORD);
+	}
+
+	//リロケーション情報の追加
+	buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
+	buffer[length]=0;
+	buffer[length+1]=0x30;	//=IMAGE_REL_BASED_HIGHLOW
+	(*(WORD *)(buffer+length))|=addr&0x0FFF;
+	length+=2;
+
+	(*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
+}
+void CReloc::ResetRelocBuffer(void){
+	if(buffer) HeapDefaultFree(buffer);
+
+	buffer=(char *)HeapAlloc(hHeap,0,1);
+	length=0;
+	NowPageRVAToReloc=0;
+
+	int i;
+	for(i=0;i<iNum_CodeSection;i++){
+		extern int MemPos_CodeSection;
+		__add(MemPos_CodeSection + pdwData_CodeSection[i]);
+	}
+
+	for(i=0;i<iNum_DataSection;i++){
+		extern int MemPos_DataSection;
+		__add(MemPos_DataSection + pdwData_DataSection[i]);
+	}
+}
+
+
+
+
+//////////////////////////
+// 一般スケジュール
+//////////////////////////
+
+CSchedule::CSchedule(){
+	pObpValues=(int *)HeapAlloc(hHeap,0,1);
+	num=0;
+
+	this->flag=0;
+}
+CSchedule::~CSchedule(){
+	HeapDefaultFree(pObpValues);
+}
+void CSchedule::SetFlag(int flag){
+	this->flag=flag;
+}
+void CSchedule::add(){
+	pObpValues=(int *)HeapReAlloc(hHeap,0,pObpValues,(num+1)*sizeof(int));
+	pObpValues[num]=obp;
+	num++;
+
+	if(flag&SCHEDULE_FLAG_RELOC){
+		//リロケーション情報を追加する
+		pobj_Reloc->AddSchedule_CodeSection(obp);
+	}
+}
+void CSchedule::move(int iStartPos,int iSize,int offset){
+	int i;
+	for(i=0;i<num;i++){
+		if(iStartPos<=pObpValues[i] && pObpValues[i]<iStartPos+iSize){
+			pObpValues[i]+=offset;
+		}
+	}
+}
+
+//データテーブルスケジュール
+CSchedule *pobj_DataTableSchedule;
+
+//グローバル変数アドレススケジュール
+CSchedule *pobj_GlobalVarSchedule;
+
+
+
+/////////////////////////////////////////
+// インポート アドレス スケジューリング
+/////////////////////////////////////////
+
+CImportAddrSchedule::CImportAddrSchedule(){
+	ppdi=(DllProc **)HeapAlloc(hHeap,0,1);
+}
+CImportAddrSchedule::~CImportAddrSchedule(){
+	HeapDefaultFree(ppdi);
+}
+
+void CImportAddrSchedule::add(DllProc *pDllProc){
+	ppdi=(DllProc **)HeapReAlloc(hHeap,0,ppdi,(num+1)*sizeof(DllProc *));
+	ppdi[num]=pDllProc;
+
+	CSchedule::add();
+}
+
+CImportAddrSchedule *pobj_ImportAddrSchedule;
+
+
+
+
+/////////////////////////////////////////
+// プロシージャ アドレス スケジューリング
+/////////////////////////////////////////
+
+CSubAddrSchedule::CSubAddrSchedule(){
+	ppsi=(UserProc **)HeapAlloc(hHeap,0,1);
+	pbCall=(BOOL *)HeapAlloc(hHeap,0,1);
+}
+CSubAddrSchedule::~CSubAddrSchedule(){
+	HeapDefaultFree(ppsi);
+	HeapDefaultFree(pbCall);
+}
+
+void CSubAddrSchedule::add(UserProc *pUserProc,BOOL bCall){
+	if(!pUserProc) return;
+
+	ppsi=(UserProc **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(UserProc *));
+	ppsi[num]=pUserProc;
+	pbCall=(BOOL *)HeapReAlloc(hHeap,0,pbCall,(num+1)*sizeof(BOOL));
+	pbCall[num]=bCall;
+
+	CSchedule::add();
+
+	if(!bCall){
+		//リロケーション情報を追加する
+		pobj_Reloc->AddSchedule_CodeSection(obp);
+	}
+}
+
+CSubAddrSchedule *pobj_SubAddrSchedule;
+
+
+
+
+/////////////////////////////////////////
+// 一時スケジューリングポインタ
+/////////////////////////////////////////
+CTempSchedule::CTempSchedule(){
+	ppObpValues=(int **)HeapAlloc(hHeap,0,1);
+	num=0;
+}
+CTempSchedule::~CTempSchedule(){
+	HeapDefaultFree(ppObpValues);
+}
+void CTempSchedule::lock(int *pobp){
+	ppObpValues=(int **)HeapReAlloc(hHeap,0,ppObpValues,(num+1)*sizeof(int *));
+	ppObpValues[num]=pobp;
+	num++;
+}
+void CTempSchedule::unlock(){
+	if( num <= 0 ){
+		//エラー
+		SetError(300,NULL,cp);
+	}
+	num--;
+}
+void CTempSchedule::move(int iStartPos,int iSize,int offset){
+	int i;
+	for(i=0;i<num;i++){
+		if(iStartPos<=*ppObpValues[i] && *ppObpValues[i]<iStartPos+iSize){
+			(*ppObpValues[i])+=offset;
+		}
+	}
+}
+
+CTempSchedule *pobj_TempSchedule;
+
+
+
+
Index: /trunk/abdev/BasicCompiler_Common/PESchedule.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/PESchedule.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/PESchedule.h	(revision 147)
@@ -0,0 +1,110 @@
+
+
+///////////////////////
+// リロケーション情報
+///////////////////////
+class CReloc{
+public:
+	char *buffer;
+	int length;
+	DWORD NowPageRVAToReloc;
+	DWORD NowCountAddrToReloc;
+
+	CReloc();
+	~CReloc();
+	void AllFree(void);
+	void copy(CReloc *por);
+
+private:
+	DWORD *pdwData_CodeSection;
+	int iNum_CodeSection;
+public:
+	void AddSchedule_CodeSection(DWORD addr);
+
+private:
+	DWORD *pdwData_DataSection;
+	int iNum_DataSection;
+public:
+	void AddSchedule_DataSection(DWORD addr);
+
+private:
+	void __add(DWORD addr);
+public:
+	void ResetRelocBuffer(void);
+};
+extern CReloc *pobj_Reloc;
+
+
+//////////////////////////
+// 一般スケジューリング
+//////////////////////////
+#define SCHEDULE_FLAG_RELOC 1
+class CSchedule{
+	int flag;
+public:
+	int *pObpValues;
+	int num;
+
+	CSchedule();
+	~CSchedule();
+	void SetFlag(int flag);
+
+	void add();
+	void move(int iStartPos,int iSize,int offset);
+};
+extern CSchedule *pobj_DataTableSchedule;
+extern CSchedule *pobj_GlobalVarSchedule;
+
+
+
+/////////////////////////////////////////
+// インポート アドレス スケジューリング
+/////////////////////////////////////////
+class CImportAddrSchedule:public CSchedule{
+public:
+	DllProc **ppdi;
+
+	CImportAddrSchedule();
+	~CImportAddrSchedule();
+
+	void add(DllProc *pDllProc);
+};
+extern CImportAddrSchedule *pobj_ImportAddrSchedule;
+
+
+
+/////////////////////////////////////////
+// プロシージャ アドレス スケジューリング
+/////////////////////////////////////////
+class CSubAddrSchedule:public CSchedule{
+public:
+	UserProc **ppsi;
+	BOOL *pbCall;
+
+	CSubAddrSchedule();
+	~CSubAddrSchedule();
+
+	void add(UserProc *pUserProc,BOOL bCall);
+};
+extern CSubAddrSchedule *pobj_SubAddrSchedule;
+
+
+
+/////////////////////////////////////
+// 一時スケジューリングポインタ
+/////////////////////////////////////
+class CTempSchedule{
+	int **ppObpValues;
+	int num;
+public:
+	CTempSchedule();
+	~CTempSchedule();
+
+	void lock(int *pobp);
+	void unlock();
+	void move(int iStartPos,int iSize,int offset);
+};
+extern CTempSchedule *pobj_TempSchedule;
+
+
+void NativeBuffer_StaticRelocation(int iStartPos,int iSize,int offset);
Index: /trunk/abdev/BasicCompiler_Common/ParamImpl.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/ParamImpl.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/ParamImpl.cpp	(revision 147)
@@ -0,0 +1,337 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+#define OVERLOAD_MIN_LEVEL 0
+#define OVERLOAD_MAX_LEVEL 6
+#define OVERLOAD_LEVEL0 0		// 型調整なし。厳密に等しい
+#define OVERLOAD_LEVEL1 1		// 型調整なし。レベル1以上はオブジェクトの場合は派生関係を考慮
+#define OVERLOAD_LEVEL2 2		// 型調整なし。整数型/実数型レベルでの同一性チェック（サイズ照合あり）
+#define OVERLOAD_LEVEL3 3		// 型調整なし。整数型/実数型レベルでの同一性チェック
+#define OVERLOAD_LEVEL4 4		// 型調整あり。厳密に等しい
+#define OVERLOAD_LEVEL5 5		// 型調整あり。整数型/実数型レベルでの同一性チェック
+#define OVERLOAD_LEVEL6 6		// 型調整あり。数値型/クラス型レベルでの同一性チェック
+
+ParamImpl::ParamImpl(const char *buffer):
+	returnType()
+{
+	///////////////////////////
+	// パラメータ文字列を整理
+	///////////////////////////
+
+	extern HANDLE hHeap;
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+
+	i=0;
+	ParmsNum=0;
+	while(1){
+		if(buffer[i]=='\0') break;
+
+		for(i2=0;;i2++,i++){
+			if(buffer[i]=='\"'){
+				temporary[i2]=buffer[i];
+				for(i++,i2++;;i++,i2++){
+					temporary[i2]=buffer[i];
+					if(buffer[i]=='\"') break;
+				}
+				continue;
+			}
+
+			if(buffer[i]=='('){
+				i3=GetStringInPare(temporary+i2,buffer+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(buffer[i]=='['){
+				i3=GetStringInBracket(temporary+i2,buffer+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+
+			if(buffer[i]==','||buffer[i]=='\0'){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+
+		Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(Parms[ParmsNum],temporary);
+		ParmsNum++;
+
+		types.push_back( Type() );
+
+		if(buffer[i]==',') i++;
+	}
+}
+ParamImpl::ParamImpl(const Parameters &params):
+	returnType()
+{
+	ParmsNum = 0;
+	foreach( Parameter *pParam, params ){
+		Parms[ParmsNum]=0;
+		ParmsNum++;
+
+		types.push_back( *pParam );
+	}
+}
+ParamImpl::~ParamImpl(){
+	int i2;
+
+	//パラメータ文字列を解放
+	for(i2=0;i2<ParmsNum;i2++){
+		if(Parms[i2]==(char *)-1) continue;
+
+		if(Parms[i2]) HeapDefaultFree(Parms[i2]);
+	}
+}
+
+void ParamImpl::SetReturnType( const Type &returnType ){
+	this->returnType = returnType;
+}
+
+bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType ){
+	//パラメータを識別してオーバーロードを解決
+
+	//パラメータの個数が不一致の場合
+	int max = (int)targetParms.size();
+
+	if( ParmsNum > max ){
+		// 実引数が駆り引数より多いとき
+		// ※無条件で不一致
+		return false;
+	}
+
+	Type argType;
+	for(int i=0;i<max;i++){
+		Parameter &param = *targetParms[i];
+
+		if( i >= ParmsNum ){
+			// 引数が多いとき
+			if( param.GetInitValue().size() > 0 ){
+				// 初期値が指定されているパラメータを考慮
+				return true;
+			}
+			else{
+				return false;
+			}
+		}
+
+		if(Parms[i]){
+			Type nullParam( DEF_NON );
+
+			NumOpe_GetType(Parms[i],
+				( level <= OVERLOAD_LEVEL3 )? nullParam : param,
+				argType);
+		}
+		else{
+			argType = types[i];
+		}
+
+		if(argType.GetBasicType()!=param.GetBasicType()){
+			if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL4 ){
+				return false;
+			}
+			else if( level == OVERLOAD_LEVEL2 ){
+				if( !(argType.IsWhole() && param.IsWhole() && argType.GetBasicSize() == param.GetBasicSize() ) ){
+					// サイズ違い
+					return false;
+				}
+			}
+			else if( level == OVERLOAD_LEVEL3 || level==OVERLOAD_LEVEL5){
+				if(!(
+					argType.IsWhole()&&param.IsWhole()||
+					argType.IsReal()&&param.IsReal()
+					)){
+						return false;
+				}
+				if( argType.IsPointer() || param.IsPointer() )
+				{
+					// ポインタ型の不整合は認めない
+					return false;
+				}
+			}
+			else if(level==OVERLOAD_LEVEL6){
+				if(argType.IsObject()||param.IsObject()) return false;
+			}
+		}
+		else{
+			//if(NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
+			if( NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
+				if(argType.GetIndex()!=param.GetIndex()){
+					return false;
+				}
+			}
+			else if( NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT ){
+				if( level == OVERLOAD_LEVEL0 ){
+					if( !param.GetClass().IsEquals( &argType.GetClass() ) ){
+						return false;
+					}
+				}
+				else{
+					if( !param.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
+						return false;
+					}
+				}
+			}
+		}
+	}
+
+	if( !targetResultType.IsNull() ){
+		//戻り値も比較対象にする
+		if( !returnType.Equals( targetResultType ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
+
+UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){
+	int sw=0;
+	UserProc *pUserProc;
+	pUserProc=0;
+
+	for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
+
+		foreach( UserProc *pTempUserProc, subs ){
+
+			if(EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type() )){
+				trace( "レベル" << level <<	" ○適合..." << pTempUserProc->_paramStr );
+
+				if(sw){
+					if( isEnabledReturnType ){
+						SetError(52,name,cp);
+
+						return 0;
+					}
+					else{
+						// 戻り値も比較するモードにして再びオーバーロード解決を試みる
+
+						trace( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" );
+
+						return OverloadSolution(name,subs, true);
+					}
+				}
+				sw=1;
+
+				pUserProc = pTempUserProc;
+			}
+			else
+			{
+				trace( "レベル" << level <<	" ×不適合..." << pTempUserProc->_paramStr );
+			}
+		}
+
+		if( sw ) break;
+	}
+
+	if(!sw){
+		foreach( UserProc *pTempUserProc, subs ){
+
+			//エラーチェック
+			if(pTempUserProc->Params().size()==this->ParmsNum){
+				if(sw){
+					sw=0;
+					break;
+				}
+				sw=1;
+
+				pUserProc=pTempUserProc;
+			}
+		}
+	}
+
+	if(!sw){
+		SetError(52,name,cp);
+
+		return 0;
+	}
+
+
+	return pUserProc;
+}
+UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){
+	trace( "" );
+	trace( "■■■■■■■■■■■■■■■■■■" );
+	trace( "■■■ オーバーロード解決(" << name << ")" );
+
+	UserProc *result = _OverloadSolution( name, subs, isEnabledReturnType );
+
+	trace( "■■■ ここまで" );
+	trace( "■■■■■■■■■■■■■■■■■■" );
+	trace( "" );
+
+	return result;
+}
+
+void ParamImpl::ApplyDefaultParameters( const Parameters &params ){
+	if( ParmsNum == (int)params.size() ){
+		// デフォルト引数の適用が不必要なとき
+		return;
+	}
+
+	while( ParmsNum < (int)params.size() ){
+		Parameter &param = *params[ParmsNum];
+
+		Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,param.GetInitValue().size() + 1 );
+		lstrcpy(Parms[ParmsNum],param.GetInitValue().c_str() );
+		ParmsNum++;
+	}
+}
+
+bool ParamImpl::ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
+	if(ParmsNum>(int)params.size() && params.size() != 0){
+		if(params[params.size()-1]->GetBasicType()!=DEF_ELLIPSE){
+			//パラメータが多すぎるとき
+			SetError(10,procName,cp);
+			return false;
+		}
+	}
+	else if(ParmsNum<(int)params.size()){
+		if(ParmsNum<SecondParmNum){
+			if(params[ParmsNum]->GetBasicType()==DEF_ELLIPSE){
+				return true;
+			}
+
+			//パラメータが少なすぎるとき
+			SetError(10,procName,cp);
+			return false;
+		}
+
+		//省略パラメータに "0" を指定する
+		for(;ParmsNum < (int)params.size();ParmsNum++){
+			extern HANDLE hHeap;
+			char temporary[64];
+			if(params[ParmsNum]->IsRef() == false) lstrcpy(temporary,"0");
+			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
+			Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(Parms[ParmsNum],temporary);
+		}
+	}
+
+	return true;
+}
+
+void ParamImpl::MacroParameterSupport( const Parameters &params ){
+	for(int i=0;i<ParmsNum;i++){
+		if(Parms[i][0]=='\0'){
+			extern HANDLE hHeap;
+			char temporary[64];
+			if( params[i]->IsRef() == false ) lstrcpy(temporary,"0");
+			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
+			HeapDefaultFree(Parms[i]);
+			Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(Parms[i],temporary);
+		}
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/Parameter.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Parameter.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Parameter.h	(revision 147)
@@ -0,0 +1,113 @@
+#pragma once
+
+#include "Type.h"
+
+class Parameter : public Type
+{
+	string varName;
+	bool isRef;
+	bool isArray;
+	int subScripts[MAX_ARRAYDIM];
+
+	const string initValue;
+
+public:
+	Parameter( const string &varName, const Type &type, bool isRef = false, const string initValue = "" ):
+		Type( type ),
+		varName( varName ),
+		isRef( isRef ),
+		isArray( false ),
+		initValue( initValue )
+	{
+		subScripts[0] = -1;
+	}
+	Parameter( const Parameter &param ):
+		Type( param ),
+		varName( param.varName ),
+		isRef( param.isRef ),
+		isArray( false ),
+		initValue( param.initValue )
+	{
+		subScripts[0] = -1;
+		if( param.isArray ){
+			SetArray( param.subScripts );
+		}
+	}
+	~Parameter(){}
+
+	void SetArray( const int *pSubScripts ){
+		isArray = true;
+		memcpy( this->subScripts, pSubScripts, sizeof(int) * MAX_ARRAYDIM );
+	}
+
+	const string &GetVarName() const
+	{
+		return varName;
+	}
+
+	bool IsRef() const
+	{
+		return isRef;
+	}
+	bool IsArray(){
+		return isArray;
+	}
+	int *GetSubScriptsPtr(){
+		return subScripts;
+	}
+
+	const string &GetInitValue() const
+	{
+		return initValue;
+	}
+
+	bool Equals( const Parameter &param ) const
+	{
+		if( Type::Equals( param ) ){
+			return true;
+		}
+		else{
+
+			if( this->isRef && this->GetBasicType() == DEF_ANY &&
+				param.isRef == false && param.IsPointer()
+				||
+				this->isRef == false && this->IsPointer() &&
+				param.isRef && param.GetBasicType() == DEF_ANY ){
+					/* ByRef var As Any
+							と
+						var As VoidPtr
+						は同等
+					*/
+					return true;
+			}
+		}
+
+		return false;
+	}
+};
+
+class Parameters : public vector<Parameter *>
+{
+public:
+
+	bool Equals( const Parameters &params ) const
+	{
+		if( this->size() != params.size() ){
+			return false;
+		}
+
+		int max = (int)this->size();
+		for( int i=0; i<max; i++ ){
+			if( !(*this)[i]->Equals( *params[i] ) ){
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	int GetMemorySize() const
+	{
+		return (int)this->size() * PTR_SIZE;
+	}
+};
Index: /trunk/abdev/BasicCompiler_Common/Procedure.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Procedure.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Procedure.cpp	(revision 147)
@@ -0,0 +1,955 @@
+#include "common.h"
+
+string UserProc::GetFullName() const
+{
+	if( HasParentClass() ){
+		return GetParentClass().GetName() + "." + GetName();
+	}
+
+	return GetName();
+}
+bool UserProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){
+	int i = 0;
+	int i2,i3,sw;
+	char temporary[8192],temp2[VN_SIZE];
+
+	//ソースコードの位置
+	this->codePos = nowLine;
+
+	//パラメータ
+	if(sourceOfParams[i]!='('){
+		SetError(1,NULL,nowLine);
+		return 0;
+	}
+	i++;
+	if(sourceOfParams[i]!=')'&& this->pParentClass ){
+		//クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
+		if(this->GetName()[0]=='~'){
+			SetError(114,NULL,nowLine);
+			i=JumpStringInPare(sourceOfParams,i);
+		}
+	}
+	while(1){
+		if(sourceOfParams[i]==')') break;
+
+		//ByRef
+		bool isRef;
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
+			isRef = false;
+			i+=2;
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
+			isRef = true;
+			i+=2;
+		}
+		else isRef = false;
+
+		//パラメータ名
+		bool isArray = false;
+		int subScripts[MAX_ARRAYDIM];
+		char name[VN_SIZE];
+		sw=0;
+		for(i2=0;;i++,i2++){
+			if(sourceOfParams[i]=='('){
+				if(!sw) sw=1;
+
+				i3=GetStringInPare(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(sourceOfParams[i]=='['){
+				if(!sw) sw=1;
+
+				i3=GetStringInBracket(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(!IsVariableChar(sourceOfParams[i])){
+				name[i2]=0;
+				break;
+			}
+			name[i2]=sourceOfParams[i];
+		}
+		if(sw){
+			//配列パラメータ
+			if( isRef == false ) SetError(29,NULL,nowLine);
+			isArray = true;
+
+			if((name[i2-2]=='('&&name[i2-1]==')')||
+				(name[i2-2]=='['&&name[i2-1]==']')){
+				subScripts[0]=LONG_MAX;
+				subScripts[1]=-1;
+
+				name[i2-2]=0;
+			}
+			else{
+				GetArrange(name,temp2,subScripts);
+				lstrcpy(name,temp2);
+			}
+
+			i2=lstrlen(name);
+		}
+
+		Type type( DEF_NON );
+		char initValue[8192] = "";
+		if( sourceOfParams[i] == '=' ){
+			i++;
+			i = GetOneParameter( sourceOfParams, i, initValue );
+
+			//エラー用
+			cp = nowLine;
+
+			NumOpe_GetType( initValue, Type::String(), type );
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
+			// As指定
+			i+=2;
+
+			i2=0;
+			while(sourceOfParams[i]=='*'){
+				temporary[i2]=sourceOfParams[i];
+				i++;
+				i2++;
+			}
+			for(;;i++,i2++){
+				if(!IsVariableChar(sourceOfParams[i])){
+					if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
+						temporary[i2++]=sourceOfParams[i++];
+						temporary[i2]=sourceOfParams[i];
+						continue;
+					}
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=sourceOfParams[i];
+			}
+
+			Type::StringToType( temporary, type );
+
+			if( type.IsNull() ){
+				SetError(3,temporary,nowLine);
+				type.SetBasicType( DEF_PTR_VOID );
+			}
+
+			if( type.IsObject() ){
+				if( type.GetClass().IsBlittableType() ){
+					// Blittable型のときは基本型として扱う
+					type = type.GetClass().GetBlittableType();
+				}
+			}
+		}
+		else{
+			type.SetBasicType( GetTypeFromSimpleName(temporary) );
+			SetError(-103,temporary,nowLine);
+		}
+
+		Parameter *pParam = new Parameter( name, type, isRef, initValue );
+		if( isArray ){
+			pParam->SetArray( subScripts );
+		}
+
+		//パラメータを追加
+		this->params.push_back( pParam );
+
+/*		if( type.IsObject() && type.GetClass().IsInterface() ){
+			// インターフェイスが引数だったとき
+			// vtblOffsetを引き渡すための引数も用意しておく
+			this->params.push_back( new Parameter( ((string)name + "_vtbl").c_str(), Type(DEF_LONG) ) );
+		}*/
+
+		if(sourceOfParams[i]==','){
+			i++;
+			continue;
+		}
+		else if(sourceOfParams[i]==')') continue;
+		else{
+			SetError(1,NULL,nowLine);
+			break;
+		}
+	}
+	this->secondParmNum = (int)this->params.size();
+	i++;
+	if(sourceOfParams[i]=='('){
+		i++;
+		while(1){
+			if(sourceOfParams[i]==')') break;
+
+			//ByRef
+			bool isRef;
+			if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
+				isRef = false;
+				i+=2;
+			}
+			else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
+				isRef = true;
+				i+=2;
+			}
+			else isRef = false;
+
+			//パラメータ名
+			bool isArray = false;
+			int subScripts[MAX_ARRAYDIM];
+			char name[VN_SIZE];
+			sw=0;
+			for(i2=0;;i++,i2++){
+				if(sourceOfParams[i]=='('){
+					if(!sw) sw=1;
+
+					i3=GetStringInPare(name+i2,sourceOfParams+i);
+					i2+=i3-1;
+					i+=i3-1;
+					continue;
+				}
+				if(sourceOfParams[i]=='['){
+					if(!sw) sw=1;
+
+					i3=GetStringInBracket(name+i2,sourceOfParams+i);
+					i2+=i3-1;
+					i+=i3-1;
+					continue;
+				}
+				if(!IsVariableChar(sourceOfParams[i])){
+					name[i2]=0;
+					break;
+				}
+				name[i2]=sourceOfParams[i];
+			}
+			if(sw){
+				//配列パラメータ
+				if( isRef == false ) SetError(29,NULL,nowLine);
+				isArray = true;
+
+				if((name[i2-2]=='('&&name[i2-1]==')')||
+					(name[i2-2]=='['&&name[i2-1]==']')){
+					subScripts[0]=LONG_MAX;
+					subScripts[1]=-1;
+
+					name[i2-2]=0;
+				}
+				else{
+					GetArrange(name,temp2,subScripts);
+					lstrcpy(name,temp2);
+				}
+
+				i2=lstrlen(name);
+			}
+
+			//型
+			Type type( DEF_NON );
+			if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
+				i+=2;
+
+				i2=0;
+				while(sourceOfParams[i]=='*'){
+					temporary[i2]=sourceOfParams[i];
+					i++;
+					i2++;
+				}
+				for(;;i++,i2++){
+					if(!IsVariableChar(sourceOfParams[i])){
+						if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
+							temporary[i2++]=sourceOfParams[i++];
+							temporary[i2]=sourceOfParams[i];
+							continue;
+						}
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=sourceOfParams[i];
+				}
+
+				Type::StringToType( temporary, type );
+
+				if( type.IsNull() ){
+					SetError(3,temporary,nowLine);
+					type.SetBasicType( DEF_PTR_VOID );
+				}
+			}
+			else{
+				type.SetBasicType( GetTypeFromSimpleName(temporary) );
+				SetError(-103,temporary,nowLine);
+			}
+
+			Parameter *pParam = new Parameter( name, type, isRef );
+			if( isArray ){
+				pParam->SetArray( subScripts );
+			}
+
+			//パラメータを追加
+			this->params.push_back( pParam );
+
+			if(sourceOfParams[i]==','){
+				i++;
+				continue;
+			}
+			else if(sourceOfParams[i]==')') continue;
+			else{
+				SetError(1,NULL,nowLine);
+				break;
+			}
+		}
+		i++;
+	}
+
+	if(sourceOfParams[i]){
+		///////////////////
+		// 戻り値を取得
+		///////////////////
+
+		if( !this->IsFunction() ){
+			// Sub/Macroの場合
+			SetError(38,this->GetName(),nowLine);
+		}
+
+		if( this->pParentClass ){
+			if( this->GetName() == this->pParentClass->GetName() ||
+				this->GetName()[0]=='~'){
+				//クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
+				SetError(115,NULL,nowLine);
+			}
+		}
+
+
+		i2=lstrlen(sourceOfParams)-2;
+
+		int sw_as=0;
+		for(;i2>0;i2--){
+			if(sourceOfParams[i2]==')') break;
+
+			if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
+				i2+=2;
+				i3=0;
+				while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
+				for(;;i2++,i3++){
+					if(!IsVariableChar(sourceOfParams[i2])){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=sourceOfParams[i2];
+				}
+				Type::StringToType( temporary, this->returnType );
+				if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
+
+				sw_as=1;
+				break;
+			}
+		}
+
+		if(!sw_as){
+			SetError(-104,this->GetName().c_str(),nowLine);
+
+			this->returnType.SetBasicType( DEF_DOUBLE );
+		}
+	}
+	else{
+		//戻り値なしのSub定義
+		this->returnType.SetNull();
+	}
+
+	//リアルパラメータ領域を取得（_System_LocalThisを考慮して2つだけ多く確保する場合がある）
+
+	if( this->pParentClass && isStatic == false ){
+		//オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
+		string name = "_System_LocalThis";
+		Type type( DEF_PTR_VOID );
+		this->realParams.push_back( new Parameter( name, type ) );
+	}
+
+	if( this->returnType.IsStruct() ){
+		//構造体を戻り値として持つ場合
+		//※第一パラメータ（Thisポインタありの場合は第二パラメータ）を戻り値用の参照宣言にする
+
+		string name = this->GetName();
+		if(name[0]==1&&name[1]==ESC_OPERATOR){
+			name="_System_ReturnValue";
+		}
+		Type type( DEF_STRUCT, this->returnType.GetIndex() );
+		this->realParams.push_back( new Parameter( name, type, true ) );
+	}
+
+	//パラメータをコピー
+	foreach( Parameter *pParam, params ){
+		this->realParams.push_back( new Parameter( *pParam ) );
+	}
+
+	return true;
+}
+bool UserProc::IsVirtual() const
+{
+	if( pMethod == NULL ){
+		return false;
+	}
+	return ( pMethod->IsVirtual() != 0 );
+}
+const NamespaceScopes &UserProc::GetNamespaceScopes() const
+{
+	if( !pParentClass ){
+		SetError();
+	}
+	return pParentClass->GetNamespaceScopes();
+}
+const NamespaceScopesCollection &UserProc::GetImportedNamespaces() const
+{
+	if( !pParentClass ){
+		SetError();
+	}
+	return pParentClass->GetImportedNamespaces();
+}
+bool UserProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	SetError();
+	return false;
+}
+
+/*
+GlobalProc *GlobalProc::Create( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ){
+	int i2;
+	char temporary[8192];
+
+	int i=1;
+
+	Procedure::Kind kind = Procedure::Sub;
+	bool isMacro = false;
+	if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
+	if(buffer[i]==ESC_MACRO){
+		isMacro = true;
+	}
+
+	i++;
+
+	bool isCdecl = false;
+	bool isExport = false;
+	while(1){
+		if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
+			isCdecl = true;
+
+			i+=2;
+		}
+		else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
+			isExport = true;
+
+			i+=2;
+		}
+		else break;
+	}
+
+	i2=0;
+	if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
+		SetError(126,NULL,nowLine);
+		return 0;
+	}
+	else{
+		for(;;i++,i2++){
+			if(!IsVariableChar(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+	}
+
+	if( isMacro ){
+		//大文字に変換
+		CharUpper(temporary);
+
+		//マクロ関数の場合は名前リストに追加
+		extern char **ppMacroNames;
+		extern int MacroNum;
+		ppMacroNames=(char **)HeapReAlloc(hHeap,0,ppMacroNames,(MacroNum+1)*sizeof(char *));
+		ppMacroNames[MacroNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(ppMacroNames[MacroNum],temporary);
+		MacroNum++;
+	}
+
+	//重複チェック
+	if(GetDeclareHash(temporary)){
+		SetError(15,temporary,nowLine);
+		return 0;
+	}
+
+	extern int SubNum;
+	SubNum++;
+
+	GlobalProc *pGlobalProc = new GlobalProc( namespaceScopes, temporary, kind, isMacro, isCdecl, isExport );
+
+	//ID
+	static int id_base=0;
+	pGlobalProc->id = (id_base++);
+
+	if(isExport){
+		pGlobalProc->Using();
+	}
+
+	// パラメータを解析
+	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
+	pGlobalProc->SetParamsAndReturnType( buffer + i, nowLine, true );
+
+
+	pGlobalProc->_paramStr = buffer + i;
+
+
+
+	return pGlobalProc;
+}
+bool GlobalProc::AddGlobalProc( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ){
+	GlobalProc *pGlobalProc = Create( namespaceScopes, buffer, nowLine );
+	if( pGlobalProc == NULL ){
+		return false;
+	}
+
+
+	/////////////////////////////////
+	// ハッシュデータに追加
+	/////////////////////////////////
+
+	int key;
+	key=hash_default(pGlobalProc->GetName().c_str());
+
+	extern GlobalProc **ppSubHash;
+	if(ppSubHash[key]){
+		GlobalProc *psi2;
+		psi2=ppSubHash[key];
+		while(1){
+			//重複エラーチェックを行う
+			if( pGlobalProc->GetName() == psi2->GetName() ){
+				if( Parameter::Equals( psi2->Params(), pGlobalProc->Params() ) ){
+					SetError(15,pGlobalProc->GetName().c_str(),nowLine);
+					return 0;
+				}
+			}
+
+			if(psi2->pNextData==0) break;
+			psi2=psi2->pNextData;
+		}
+		psi2->pNextData=pGlobalProc;
+	}
+	else{
+		ppSubHash[key]=pGlobalProc;
+	}
+
+	return true;
+}*/
+const NamespaceScopes &GlobalProc::GetNamespaceScopes() const
+{
+	if( HasParentClass() ){
+		return GetParentClassPtr()->GetNamespaceScopes();
+	}
+	return namespaceScopes;
+}
+bool GlobalProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	if( GetName() != name ){
+		return false;
+	}
+
+	return NamespaceScopes::IsSameArea( GetNamespaceScopes(), namespaceScopes );
+}
+bool GlobalProc::IsEqualSymbol( const GlobalProc &globalProc ) const
+{
+	return IsEqualSymbol( globalProc.GetNamespaceScopes(), globalProc.GetName() );
+}
+bool GlobalProc::IsEqualSymbol( const string &fullName ) const
+{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	return IsEqualSymbol( NamespaceScopes( AreaName ), NestName );
+}
+
+bool DllProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	if( GetName() != name ){
+		return false;
+	}
+	return NamespaceScopes::IsSameArea( this->namespaceScopes, namespaceScopes );
+}
+bool DllProc::IsEqualSymbol( const string &fullName ) const
+{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	if( IsEqualSymbol( NamespaceScopes( AreaName ), NestName ) ){
+		return true;
+	}
+
+	if( isNest ){
+		// 静的メンバを考慮
+
+		char AreaName2[VN_SIZE] = "";		//オブジェクト変数
+		char NestName2[VN_SIZE] = "";		//入れ子メンバ
+		bool isNest = SplitMemberName( AreaName, AreaName2, NestName2 );
+		lstrcat( NestName2, "." );
+		lstrcat( NestName2, NestName );
+
+		return IsEqualSymbol( NamespaceScopes( AreaName2 ), NestName2 );
+	}
+
+	return false;
+}
+
+
+bool DllProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
+	int i = 0;
+	int i2,i3,sw;
+	char temporary[8192],temp2[VN_SIZE];
+
+	//ソースコードの位置
+	this->codePos = nowLine;
+
+	//パラメータ
+	if(sourceOfParams[i]!='('){
+		SetError(1,NULL,nowLine);
+		return 0;
+	}
+	i++;
+
+	while(1){
+		if(sourceOfParams[i]==')') break;
+
+		//ByRef
+		bool isRef;
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
+			isRef = false;
+			i+=2;
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
+			isRef = true;
+			i+=2;
+		}
+		else isRef = false;
+
+		//パラメータ名
+		bool isArray = false;
+		int subScripts[MAX_ARRAYDIM];
+		char name[VN_SIZE];
+		sw=0;
+		for(i2=0;;i++,i2++){
+			if(sourceOfParams[i]=='('){
+				if(!sw) sw=1;
+
+				i3=GetStringInPare(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(sourceOfParams[i]=='['){
+				if(!sw) sw=1;
+
+				i3=GetStringInBracket(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(!IsVariableChar(sourceOfParams[i])){
+				name[i2]=0;
+				break;
+			}
+			name[i2]=sourceOfParams[i];
+		}
+		if(sw){
+			//配列パラメータ
+			if( isRef == false ) SetError(29,NULL,nowLine);
+			isArray = true;
+
+			if((name[i2-2]=='('&&name[i2-1]==')')||
+				(name[i2-2]=='['&&name[i2-1]==']')){
+				subScripts[0]=LONG_MAX;
+				subScripts[1]=-1;
+
+				name[i2-2]=0;
+			}
+			else{
+				GetArrange(name,temp2,subScripts);
+				lstrcpy(name,temp2);
+			}
+
+			i2=lstrlen(name);
+		}
+
+		//型
+		Type type( DEF_NON );
+		if(lstrcmp(name,"...")==0) type.SetBasicType( DEF_ELLIPSE );
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
+			i+=2;
+
+			i2=0;
+			while(sourceOfParams[i]=='*'){
+				temporary[i2]=sourceOfParams[i];
+				i++;
+				i2++;
+			}
+			for(;;i++,i2++){
+				if(!IsVariableChar(sourceOfParams[i])){
+					if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
+						temporary[i2++]=sourceOfParams[i++];
+						temporary[i2]=sourceOfParams[i];
+						continue;
+					}
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=sourceOfParams[i];
+			}
+
+			Type::StringToType( temporary, type );
+
+			if( type.IsNull() ){
+				SetError(3,temporary,nowLine);
+				type.SetBasicType( DEF_PTR_VOID );
+			}
+		}
+		else{
+			type.SetBasicType( GetTypeFromSimpleName(temporary) );
+			SetError(-103,temporary,nowLine);
+		}
+
+		Parameter *pParam = new Parameter( name, type, isRef );
+		if( isArray ){
+			pParam->SetArray( subScripts );
+		}
+
+		//パラメータを追加
+		this->params.push_back( pParam );
+
+		if(sourceOfParams[i]==','){
+			i++;
+			continue;
+		}
+		else if(sourceOfParams[i]==')') continue;
+		else{
+			SetError(1,NULL,nowLine);
+			break;
+		}
+	}
+	i++;
+
+	if(sourceOfParams[i]){
+		///////////////////
+		// 戻り値を取得
+		///////////////////
+
+		i2=lstrlen(sourceOfParams)-2;
+
+		int sw_as=0;
+		for(;i2>0;i2--){
+			if(sourceOfParams[i2]==')') break;
+
+			if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
+				i2+=2;
+				i3=0;
+				while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
+				for(;;i2++,i3++){
+					if(!IsVariableChar(sourceOfParams[i2])){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=sourceOfParams[i2];
+				}
+				Type::StringToType( temporary, this->returnType );
+				if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
+
+				sw_as=1;
+				break;
+			}
+		}
+	}
+	else{
+		//戻り値なしのSub定義
+		this->returnType.SetNull();
+	}
+
+	return true;
+}
+
+bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
+	int i = 0;
+	int i2,i3,sw;
+	char temporary[8192],temp2[VN_SIZE];
+
+	//ソースコードの位置
+	this->codePos = nowLine;
+
+	//パラメータ
+	if(sourceOfParams[i]!='('){
+		SetError(1,NULL,nowLine);
+		return 0;
+	}
+	i++;
+	while(1){
+		if(sourceOfParams[i]==')') break;
+
+		//ByRef
+		bool isRef;
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
+			isRef = false;
+			i+=2;
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
+			isRef = true;
+			i+=2;
+		}
+		else isRef = false;
+
+		//パラメータ名
+		bool isArray = false;
+		int subScripts[MAX_ARRAYDIM];
+		char name[VN_SIZE];
+		sw=0;
+		for(i2=0;;i++,i2++){
+			if(sourceOfParams[i]=='('){
+				if(!sw) sw=1;
+
+				i3=GetStringInPare(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(sourceOfParams[i]=='['){
+				if(!sw) sw=1;
+
+				i3=GetStringInBracket(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(!IsVariableChar(sourceOfParams[i])){
+				name[i2]=0;
+				break;
+			}
+			name[i2]=sourceOfParams[i];
+		}
+		if(sw){
+			//配列パラメータ
+			if( isRef == false ) SetError(29,NULL,nowLine);
+			isArray = true;
+
+			if((name[i2-2]=='('&&name[i2-1]==')')||
+				(name[i2-2]=='['&&name[i2-1]==']')){
+				subScripts[0]=LONG_MAX;
+				subScripts[1]=-1;
+
+				name[i2-2]=0;
+			}
+			else{
+				GetArrange(name,temp2,subScripts);
+				lstrcpy(name,temp2);
+			}
+
+			i2=lstrlen(name);
+		}
+
+		//型
+		Type type( DEF_NON );
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
+			i+=2;
+
+			i2=0;
+			while(sourceOfParams[i]=='*'){
+				temporary[i2]=sourceOfParams[i];
+				i++;
+				i2++;
+			}
+			for(;;i++,i2++){
+				if(!IsVariableChar(sourceOfParams[i])){
+					if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
+						temporary[i2++]=sourceOfParams[i++];
+						temporary[i2]=sourceOfParams[i];
+						continue;
+					}
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=sourceOfParams[i];
+			}
+
+			Type::StringToType( temporary, type );
+
+			if( type.IsNull() ){
+				SetError(3,temporary,nowLine);
+				type.SetBasicType( DEF_PTR_VOID );
+			}
+		}
+		else{
+			type.SetBasicType( GetTypeFromSimpleName(temporary) );
+			SetError(-103,temporary,nowLine);
+		}
+
+		Parameter *pParam = new Parameter( name, type, isRef );
+		if( isArray ){
+			pParam->SetArray( subScripts );
+		}
+
+		//パラメータを追加
+		this->params.push_back( pParam );
+
+		if(sourceOfParams[i]==','){
+			i++;
+			continue;
+		}
+		else if(sourceOfParams[i]==')') continue;
+		else{
+			SetError(1,NULL,nowLine);
+			break;
+		}
+	}
+	i++;
+
+	if(sourceOfParams[i]){
+		///////////////////
+		// 戻り値を取得
+		///////////////////
+
+		i2=lstrlen(sourceOfParams)-2;
+
+		int sw_as=0;
+		for(;i2>0;i2--){
+			if(sourceOfParams[i2]==')') break;
+
+			if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
+				i2+=2;
+				i3=0;
+				while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
+				for(;;i2++,i3++){
+					if(!IsVariableChar(sourceOfParams[i2])){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=sourceOfParams[i2];
+				}
+				Type::StringToType( temporary, this->returnType );
+				if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
+
+				sw_as=1;
+				break;
+			}
+		}
+	}
+	else{
+		//戻り値なしのSub定義
+		this->returnType.SetNull();
+	}
+
+	//戻り値のエラーチェック
+	if( IsFunction() ){
+		// Function定義
+
+		if( this->ReturnType().IsNull() ){
+			// 戻り値がない
+			SetError(26,this->GetName(),nowLine);
+		}
+	}
+	else{
+		if( !this->ReturnType().IsNull() ){
+			// Sub定義なのに、戻り値がある
+			SetError(38,this->GetName(),nowLine);
+		}
+	}
+
+	return true;
+}
+
+UserProc *UserProc::pCompilingUserProc = NULL;
Index: /trunk/abdev/BasicCompiler_Common/Procedure.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Procedure.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Procedure.h	(revision 147)
@@ -0,0 +1,347 @@
+#pragma once
+
+#include <Namespace.h>
+#include "Parameter.h"
+#include "Variable.h"
+
+class CClass;
+class CMethod;
+
+class Procedure{
+public:
+	// 種類
+	enum Kind{
+		Sub,
+		Function,
+	};
+
+private:
+	const string name;						// プロシージャ名
+
+	Kind kind;
+
+	bool isCdecl;
+	bool isUsing;
+
+protected:
+
+	// パラメータ
+	Parameters params;
+
+	// 戻り値の型
+	Type returnType;
+
+	// ソースコードの位置
+	int codePos;
+
+public:
+	Procedure( const string &name, Kind kind, bool isCdecl ):
+	  name( name ),
+	  kind( kind ),
+	  isCdecl( isCdecl ),
+	  isUsing( false ),
+	  codePos( -1 )
+	{}
+	~Procedure(){
+		foreach( Parameter *pParam, params ){
+			delete pParam;
+		}
+	}
+
+	const string &GetName() const
+	{
+		return name;
+	}
+
+	bool IsSub() const
+	{
+		return ( kind == Sub );
+	}
+	bool IsFunction() const
+	{
+		return ( kind == Function );
+	}
+
+	bool IsCdecl() const
+	{
+		return isCdecl;
+	}
+	void Using(){
+		isUsing = true;
+	}
+	bool IsUsing() const
+	{
+		return isUsing;
+	}
+
+	int GetCodePos() const
+	{
+		return codePos;
+	}
+
+	const Parameters &Params() const
+	{
+		return params;
+	}
+	const Type &ReturnType() const
+	{
+		return returnType;
+	}
+};
+
+class UserProc : public Procedure
+{
+public:
+	string _paramStr;
+
+private:
+	bool isMacro;
+
+	// パラメータの追加情報
+	int secondParmNum;
+	Parameters realParams;
+	int realSecondParmNum;
+
+	// 親クラスと対応するメソッド
+	const CClass *pParentClass;
+	CMethod *pMethod;
+
+	// 各種フラグ
+	bool isExport;
+	bool isSystem;
+	bool isAutoGeneration;
+	bool isCompiled;
+
+public:
+
+	UserProc( const string &name, Kind kind, bool isMacro, bool isCdecl, bool isExport ):
+	  Procedure( name, kind, isCdecl ),
+	  isMacro( isMacro ),
+	  pParentClass( NULL ),
+	  pMethod( NULL ),
+	  isExport( isExport ),
+	  isSystem( false ),
+	  isAutoGeneration( false ),
+	  isCompiled( false ),
+	  beginOpAddress( 0 ),
+	  endOpAddress( 0 )
+	{
+	}
+	~UserProc(){
+		foreach( Parameter *pParam, realParams ){
+			delete pParam;
+		}
+	}
+
+	string GetFullName() const;
+
+	bool IsMacro() const
+	{
+		return isMacro;
+	}
+
+	virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic );
+
+	int GetSecondParmNum() const
+	{
+		return secondParmNum;
+	}
+	const Parameters &RealParams() const
+	{
+		return realParams;
+	}
+	int GetRealSecondParmNum() const
+	{
+		return realSecondParmNum;
+	}
+
+	void SetParentClass( const CClass *pParentClass ){
+		this->pParentClass = pParentClass;
+	}
+	const CClass *GetParentClassPtr() const
+	{
+		return pParentClass;
+	}
+	const CClass &GetParentClass() const
+	{
+		return *pParentClass;
+	}
+	bool HasParentClass() const
+	{
+		return ( pParentClass != NULL );
+	}
+	void SetMethod( CMethod *pMethod ){
+		this->pMethod = pMethod;
+	}
+
+	void ExportOff(){
+		isExport = false;
+	}
+	bool IsExport() const
+	{
+		return isExport;
+	}
+	void ThisIsSystemProc(){
+		isSystem = true;
+	}
+	bool IsSystem() const
+	{
+		return isSystem;
+	}
+	void ThisIsAutoGenerationProc(){
+		isAutoGeneration = true;
+	}
+	bool IsAutoGeneration(){
+		return isAutoGeneration;
+	}
+	void CompleteCompile(){
+		isCompiled = true;
+	}
+	void KillCompileStatus(){
+		isCompiled = false;
+	}
+	bool IsCompiled() const
+	{
+		return isCompiled;
+	}
+	bool IsDestructor() const
+	{
+		return ( GetName()[0] == '~' );
+	}
+	bool IsVirtual() const;
+
+	// バイナリコードの位置
+	DWORD beginOpAddress;
+	DWORD endOpAddress;
+	int GetCodeSize() const
+	{
+		return endOpAddress - beginOpAddress;
+	}
+
+	virtual const NamespaceScopes &GetNamespaceScopes() const;
+	virtual const NamespaceScopesCollection &GetImportedNamespaces() const;
+	virtual bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
+
+	// ローカル変数
+	Variables localVars;
+
+	// TODO: 適切なコードへ直す
+	long id;
+
+
+	/////////////////////////////////////////////////////////////////
+	// コンパイル中の関数を管理
+	/////////////////////////////////////////////////////////////////
+private:
+	static UserProc *pCompilingUserProc;
+public:
+	static void CompileStartForGlobalArea(){
+		pCompilingUserProc = NULL;
+	}
+	static void CompileStartForUserProc( UserProc *pUserProc ){
+		pCompilingUserProc = pUserProc;
+	}
+	static bool IsGlobalAreaCompiling(){
+		return ( pCompilingUserProc == NULL );
+	}
+	static bool IsLocalAreaCompiling(){
+		return ( pCompilingUserProc != NULL );
+	}
+	static UserProc &CompilingUserProc(){
+		return *pCompilingUserProc;
+	}
+};
+
+class GlobalProc : public UserProc
+{
+	const NamespaceScopes namespaceScopes;
+	const NamespaceScopesCollection importedNamespaces;
+public:
+	// ハッシュリスト用
+	GlobalProc *pNextData;
+
+	GlobalProc( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name, Kind kind, bool isMacro, bool isCdecl, bool isExport ):
+	  UserProc( name, kind, isMacro, isCdecl, isExport ),
+	  namespaceScopes( namespaceScopes ),
+	  importedNamespaces( importedNamespaces ),
+	  pNextData( NULL )
+	{}
+	~GlobalProc(){}
+/*
+	GlobalProc *Create( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine );
+	bool AddGlobalProc( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine );
+*/
+	virtual const NamespaceScopes &GetNamespaceScopes() const;
+	virtual const NamespaceScopesCollection &GetImportedNamespaces() const
+	{
+		return importedNamespaces;
+	}
+
+	virtual bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
+	virtual bool IsEqualSymbol( const GlobalProc &globalProc ) const;
+	virtual bool IsEqualSymbol( const string &name ) const;
+};
+
+class DllProc : public Procedure
+{
+	const NamespaceScopes namespaceScopes;
+
+	const string dllFileName;
+	const string alias;
+	int lookupAddress;
+
+public:
+	// ハッシュリスト用
+	DllProc *pNextData;
+
+	DllProc( const NamespaceScopes &namespaceScopes, const string &name, Kind kind, bool isCdecl, const string &dllFileName, const string &alias ):
+	  Procedure( name, kind, isCdecl ),
+	  namespaceScopes( namespaceScopes ),
+	  dllFileName( dllFileName ),
+	  alias( alias ),
+	  lookupAddress( 0 ),
+	  pNextData( NULL )
+	{
+	}
+	~DllProc(){}
+
+	bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
+	bool IsEqualSymbol( const string &name ) const;
+
+	const NamespaceScopes &GetNamespaceScopes() const
+	{
+		return namespaceScopes;
+	}
+
+	virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine );
+
+	const string &GetDllFileName() const
+	{
+		return dllFileName;
+	}
+	const string &GetAlias() const
+	{
+		return alias;
+	}
+
+	void SetLookupAddress( int lookupAddress ){
+		this->lookupAddress = lookupAddress;
+	}
+	int GetLookupAddress() const
+	{
+		return lookupAddress;
+	}
+
+};
+
+class ProcPointer : public Procedure
+{
+public:
+	ProcPointer( Kind kind ):
+	  Procedure( "", kind, false )
+	{
+	}
+	~ProcPointer(){}
+
+	virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine );
+};
Index: /trunk/abdev/BasicCompiler_Common/Psapi.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Psapi.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Psapi.h	(revision 147)
@@ -0,0 +1,364 @@
+/*++ BUILD Version: 0001    // Increment this if a change has global effects
+
+Copyright (c) 1994-1999  Microsoft Corporation
+
+Module Name:
+
+    psapi.h
+
+Abstract:
+
+    Include file for APIs provided by PSAPI.DLL
+
+Author:
+
+    Richard Shupak   [richards]  06-Jan-1994
+
+Revision History:
+
+--*/
+
+#ifndef _PSAPI_H_
+#define _PSAPI_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOOL
+WINAPI
+EnumProcesses(
+    DWORD * lpidProcess,
+    DWORD   cb,
+    DWORD * cbNeeded
+    );
+
+BOOL
+WINAPI
+EnumProcessModules(
+    HANDLE hProcess,
+    HMODULE *lphModule,
+    DWORD cb,
+    LPDWORD lpcbNeeded
+    );
+
+DWORD
+WINAPI
+GetModuleBaseNameA(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPSTR lpBaseName,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetModuleBaseNameW(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPWSTR lpBaseName,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetModuleBaseName  GetModuleBaseNameW
+#else
+#define GetModuleBaseName  GetModuleBaseNameA
+#endif // !UNICODE
+
+
+DWORD
+WINAPI
+GetModuleFileNameExA(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPSTR lpFilename,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetModuleFileNameExW(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPWSTR lpFilename,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetModuleFileNameEx  GetModuleFileNameExW
+#else
+#define GetModuleFileNameEx  GetModuleFileNameExA
+#endif // !UNICODE
+
+
+typedef struct _MODULEINFO {
+    LPVOID lpBaseOfDll;
+    DWORD SizeOfImage;
+    LPVOID EntryPoint;
+} MODULEINFO, *LPMODULEINFO;
+
+
+BOOL
+WINAPI
+GetModuleInformation(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPMODULEINFO lpmodinfo,
+    DWORD cb
+    );
+
+
+BOOL
+WINAPI
+EmptyWorkingSet(
+    HANDLE hProcess
+    );
+
+
+BOOL
+WINAPI
+QueryWorkingSet(
+    HANDLE hProcess,
+    PVOID pv,
+    DWORD cb
+    );
+
+BOOL
+WINAPI
+QueryWorkingSetEx(
+    HANDLE hProcess,
+    PVOID pv,
+    DWORD cb
+    );
+
+BOOL
+WINAPI
+InitializeProcessForWsWatch(
+    HANDLE hProcess
+    );
+
+
+typedef struct _PSAPI_WS_WATCH_INFORMATION {
+    LPVOID FaultingPc;
+    LPVOID FaultingVa;
+} PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;
+
+BOOL
+WINAPI
+GetWsChanges(
+    HANDLE hProcess,
+    PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
+    DWORD cb
+    );
+
+DWORD
+WINAPI
+GetMappedFileNameW(
+    HANDLE hProcess,
+    LPVOID lpv,
+    LPWSTR lpFilename,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetMappedFileNameA(
+    HANDLE hProcess,
+    LPVOID lpv,
+    LPSTR lpFilename,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetMappedFileName  GetMappedFileNameW
+#else
+#define GetMappedFileName  GetMappedFileNameA
+#endif // !UNICODE
+
+BOOL
+WINAPI
+EnumDeviceDrivers(
+    LPVOID *lpImageBase,
+    DWORD cb,
+    LPDWORD lpcbNeeded
+    );
+
+
+DWORD
+WINAPI
+GetDeviceDriverBaseNameA(
+    LPVOID ImageBase,
+    LPSTR lpBaseName,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetDeviceDriverBaseNameW(
+    LPVOID ImageBase,
+    LPWSTR lpBaseName,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetDeviceDriverBaseName  GetDeviceDriverBaseNameW
+#else
+#define GetDeviceDriverBaseName  GetDeviceDriverBaseNameA
+#endif // !UNICODE
+
+
+DWORD
+WINAPI
+GetDeviceDriverFileNameA(
+    LPVOID ImageBase,
+    LPSTR lpFilename,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetDeviceDriverFileNameW(
+    LPVOID ImageBase,
+    LPWSTR lpFilename,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetDeviceDriverFileName  GetDeviceDriverFileNameW
+#else
+#define GetDeviceDriverFileName  GetDeviceDriverFileNameA
+#endif // !UNICODE
+
+// Structure for GetProcessMemoryInfo()
+
+typedef struct _PROCESS_MEMORY_COUNTERS {
+    DWORD cb;
+    DWORD PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+} PROCESS_MEMORY_COUNTERS;
+typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
+
+#if (_WIN32_WINNT >= 0x0501)
+
+typedef struct _PROCESS_MEMORY_COUNTERS_EX {
+    DWORD cb;
+    DWORD PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+    SIZE_T PrivateUsage;
+} PROCESS_MEMORY_COUNTERS_EX;
+typedef PROCESS_MEMORY_COUNTERS_EX *PPROCESS_MEMORY_COUNTERS_EX;
+
+#endif
+
+BOOL
+WINAPI
+GetProcessMemoryInfo(
+    HANDLE Process,
+    PPROCESS_MEMORY_COUNTERS ppsmemCounters,
+    DWORD cb
+    );
+
+typedef struct _PERFORMANCE_INFORMATION {
+    DWORD cb;
+    SIZE_T CommitTotal;
+    SIZE_T CommitLimit;
+    SIZE_T CommitPeak;
+    SIZE_T PhysicalTotal;
+    SIZE_T PhysicalAvailable;
+    SIZE_T SystemCache;
+    SIZE_T KernelTotal;
+    SIZE_T KernelPaged;
+    SIZE_T KernelNonpaged;
+    SIZE_T PageSize;
+    DWORD HandleCount;
+    DWORD ProcessCount;
+    DWORD ThreadCount;
+} PERFORMANCE_INFORMATION, *PPERFORMANCE_INFORMATION, PERFORMACE_INFORMATION, *PPERFORMACE_INFORMATION;
+
+BOOL
+WINAPI
+GetPerformanceInfo (
+    PPERFORMACE_INFORMATION pPerformanceInformation,
+    DWORD cb
+    );
+
+typedef struct _ENUM_PAGE_FILE_INFORMATION {
+    DWORD cb;
+    DWORD Reserved;
+    SIZE_T TotalSize;
+    SIZE_T TotalInUse;
+    SIZE_T PeakUsage;
+} ENUM_PAGE_FILE_INFORMATION, *PENUM_PAGE_FILE_INFORMATION;
+
+typedef BOOL (*PENUM_PAGE_FILE_CALLBACKW) (LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCWSTR lpFilename);
+
+typedef BOOL (*PENUM_PAGE_FILE_CALLBACKA) (LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCSTR lpFilename);
+
+BOOL
+WINAPI
+EnumPageFilesW (
+    PENUM_PAGE_FILE_CALLBACKW pCallBackRoutine,
+    LPVOID pContext
+    );
+
+BOOL
+WINAPI
+EnumPageFilesA (
+    PENUM_PAGE_FILE_CALLBACKA pCallBackRoutine,
+    LPVOID pContext
+    );
+
+#ifdef UNICODE
+#define PENUM_PAGE_FILE_CALLBACK PENUM_PAGE_FILE_CALLBACKW
+#define EnumPageFiles EnumPageFilesW
+#else
+#define PENUM_PAGE_FILE_CALLBACK PENUM_PAGE_FILE_CALLBACKA
+#define EnumPageFiles EnumPageFilesA
+#endif // !UNICODE
+
+DWORD
+WINAPI
+GetProcessImageFileNameA(
+    HANDLE hProcess,
+    LPSTR lpImageFileName,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetProcessImageFileNameW(
+    HANDLE hProcess,
+    LPWSTR lpImageFileName,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetProcessImageFileName  GetProcessImageFileNameW
+#else
+#define GetProcessImageFileName  GetProcessImageFileNameA
+#endif // !UNICODE
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /trunk/abdev/BasicCompiler_Common/RSrcSection.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/RSrcSection.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/RSrcSection.cpp	(revision 147)
@@ -0,0 +1,883 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifndef RT_MANIFEST
+#define RT_MANIFEST                        MAKEINTRESOURCE(24)
+#endif
+
+//リソースアドレススケジュール
+DWORD *lpdwRSrcAddrSchedule;
+int RSrcAddrScheduleNum;
+
+void AddRSrcAddrSchedule(DWORD pos){
+	extern HANDLE hHeap;
+
+	//グローバル変数アドレススケジュールに追加する
+	lpdwRSrcAddrSchedule=(DWORD *)HeapReAlloc(hHeap,0,lpdwRSrcAddrSchedule,(RSrcAddrScheduleNum+1)*sizeof(DWORD));
+	lpdwRSrcAddrSchedule[RSrcAddrScheduleNum]=pos;
+	RSrcAddrScheduleNum++;
+}
+
+char *PermutationString(char *buffer,char *lpszSearch,char *lpszRewrite){
+	//バッファ長
+	int length;
+	length=lstrlen(buffer);
+
+	//サーチ文字列の長さ
+	int search_length;
+	search_length=lstrlen(lpszSearch);
+
+	//置換文字列の長さ
+	int write_length;
+	write_length=lstrlen(lpszRewrite);
+
+	//置換時オフセット
+	int offset;
+	offset=lstrlen(lpszRewrite)-search_length;
+
+	int i;
+	for(i=0;i<length-search_length;i++){
+		if(memcmp(buffer+i,lpszSearch,search_length)==0){
+			if(offset>0){
+				length+=offset;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+1);
+			}
+
+			SlideString(buffer+i+search_length,offset);
+			memcpy(buffer+i,lpszRewrite,write_length);
+			i+=write_length-1;
+		}
+	}
+
+	return buffer;
+}
+
+char *GetRSrcSectionBuffer(int *pLen){
+	extern HANDLE hHeap;
+	char *buffer,*temporary;
+	int i2,i3,i4,i5,i6,i7,sw,BufSize,TypeNum,NextBase;
+	HANDLE hFile;
+
+	//カーソルリソース
+	extern RESOURCEDATAINFO *pCursorResourceInfo;
+	extern int CursorResourceNum;
+	int CursorNum;
+	CURSORDIR *pCursorDir;
+	CURSORDIRENTRY *pCursorDirEntry;
+	CURSORDIRENTRY_RES CursorDirEntry_Res;
+	CursorNum=0;
+
+	//ビットマップリソース
+	extern RESOURCEDATAINFO *pBitmapResourceInfo;
+	extern int BitmapResourceNum;
+
+	//アイコンリソース
+	extern RESOURCEDATAINFO *pIconResourceInfo;
+	extern int IconResourceNum;
+	int IconNum;
+	ICONDIR *pIconDir;
+	ICONDIRENTRY *pIconDirEntry;
+	ICONDIRENTRY_RES IconDirEntry_Res;
+	IconNum=0;
+
+	//XPManifestリソース
+	extern char szManifestPath[MAX_PATH];
+	extern int XPManiResourceNum;
+
+	BufSize=8192*2;
+	buffer=(char *)HeapAlloc(hHeap,0,BufSize);
+	i2=0;
+	NextBase=0;
+
+	//リソースアドレススケジュール
+	lpdwRSrcAddrSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+	RSrcAddrScheduleNum=0;
+
+	*pLen=0;
+
+	if(CursorResourceNum==0&&
+		BitmapResourceNum==0&&
+		IconResourceNum==0&&
+		XPManiResourceNum==0) return buffer;
+
+	sw=0;
+
+	//カーソルの枚数を計算（CursorNumに格納）
+	for(i3=0;i3<CursorResourceNum;i3++){
+		hFile=CreateFile(pCursorResourceInfo[i3].FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(23,pCursorResourceInfo[i3].FileName,-1);
+			sw=1;
+			continue;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pCursorDir=(CURSORDIR *)temporary;
+		CursorNum+=pCursorDir->idCount;
+
+		HeapDefaultFree(temporary);
+	}
+
+	//ビットマップのファイルの有無を確認
+	for(i3=0;i3<BitmapResourceNum;i3++){
+		hFile=CreateFile(pBitmapResourceInfo[i3].FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(23,pBitmapResourceInfo[i3].FileName,-1);
+			sw=1;
+			continue;
+		}
+		CloseHandle(hFile);
+	}
+
+	//アイコンの枚数を計算（IconNumに格納）
+	for(i3=0;i3<IconResourceNum;i3++){
+		hFile=CreateFile(pIconResourceInfo[i3].FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(23,pIconResourceInfo[i3].FileName,-1);
+			sw=1;
+			continue;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pIconDir=(ICONDIR *)temporary;
+		IconNum+=pIconDir->idCount;
+
+		HeapDefaultFree(temporary);
+	}
+
+	//ファイルの読み込みに失敗した場合
+	if(sw) return buffer;
+
+
+	/////////////////////////
+	// ディレクトリ エントリ
+	/////////////////////////
+	TypeNum=0;
+	if(CursorResourceNum) TypeNum+=2;
+	if(BitmapResourceNum) TypeNum++;
+	if(IconResourceNum) TypeNum+=2;
+	if(XPManiResourceNum) TypeNum++;
+
+	NextBase=sizeof(IMAGE_RESOURCE_DIRECTORY)+
+		sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*TypeNum;
+
+	//1階層
+	IMAGE_RESOURCE_DIRECTORY ImgResDir;
+	ImgResDir.Characteristics=0;
+	ImgResDir.TimeDateStamp=0;
+	ImgResDir.MajorVersion=0;
+	ImgResDir.MinorVersion=0;
+	ImgResDir.NumberOfNamedEntries=0;
+	ImgResDir.NumberOfIdEntries=TypeNum;
+	memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+	i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+	i6=0;
+	IMAGE_RESOURCE_DIRECTORY_ENTRY ImgDirEntry;
+	if(CursorNum){
+		//RT_CURSOR
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_CURSOR;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*CursorNum;
+	}
+	if(BitmapResourceNum){
+		//RT_BITMAP
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_BITMAP;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*BitmapResourceNum;
+	}
+	if(IconNum){
+		//RT_ICON
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_ICON;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*IconNum;
+	}
+	if(CursorResourceNum){
+		//RT_GROUP_CURSOR
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_GROUP_CURSOR;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*CursorNum;
+	}
+	if(IconResourceNum){
+		//RT_GROUP_ICON
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_GROUP_ICON;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*IconResourceNum;
+	}
+	if(XPManiResourceNum){
+		//RT_MANIFEST
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_MANIFEST;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*XPManiResourceNum;
+	}
+
+	NextBase+=i6;
+
+	//2階層
+	i6=0;
+	i7=0;
+	if(CursorNum){
+		//RT_CURSOR
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=CursorNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<CursorNum;i3++,i7++){
+			ImgDirEntry.Name=i7+1;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*CursorNum;
+	}
+	if(BitmapResourceNum){
+		//RT_BITMAP
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=BitmapResourceNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<BitmapResourceNum;i3++){
+			ImgDirEntry.Name=pBitmapResourceInfo[i3].dwId;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*BitmapResourceNum;
+	}
+	if(IconNum){
+		//RT_ICON
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=IconNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<IconNum;i3++,i7++){
+			ImgDirEntry.Name=i7+1;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*IconNum;
+	}
+	if(CursorResourceNum){
+		//RT_GROUP_CURSOR
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=CursorResourceNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<CursorResourceNum;i3++){
+			ImgDirEntry.Name=pCursorResourceInfo[i3].dwId;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*CursorResourceNum;
+	}
+	if(IconResourceNum){
+		//RT_GROUP_ICON
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=IconResourceNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<IconResourceNum;i3++){
+			ImgDirEntry.Name=pIconResourceInfo[i3].dwId;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*IconResourceNum;
+	}
+	if(XPManiResourceNum){
+		//RT_MANIFEST
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=XPManiResourceNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<XPManiResourceNum;i3++){
+			ImgDirEntry.Name=i3+1;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*XPManiResourceNum;
+	}
+
+
+	NextBase+=i6;
+
+	while(i2+8192>BufSize){
+		BufSize+=8192;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+	}
+
+	//3階層
+	i6=0;
+	if(CursorNum){
+		//RT_CURSOR
+		for(i3=0;i3<CursorNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*CursorNum;
+	}
+	if(BitmapResourceNum){
+		//RT_BITMAP
+		for(i3=0;i3<BitmapResourceNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*BitmapResourceNum;
+	}
+	if(IconNum){
+		//RT_ICON
+		for(i3=0;i3<IconNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*IconNum;
+	}
+	if(CursorResourceNum){
+		//RT_GROUP_CURSOR
+		for(i3=0;i3<CursorResourceNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*CursorResourceNum;
+	}
+	if(IconResourceNum){
+		//RT_GROUP_ICON
+		for(i3=0;i3<IconResourceNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*IconResourceNum;
+	}
+	if(XPManiResourceNum){
+		//RT_MANIFEST
+		for(i3=0;i3<XPManiResourceNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*XPManiResourceNum;
+	}
+
+	NextBase+=i6;
+
+	while(i2+8192>BufSize){
+		BufSize+=8192;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+	}
+
+
+
+	////////////////////////////////////////
+	// データ エントリ
+	////////////////////////////////////////
+
+	DWORD dwDataEntrySchedule[100];
+	int DataEntryScheduleNum;
+	int CursorEntryBase;
+	int CursorGroupEntryBase;
+	int BitmapEntryBase;
+	int IconEntryBase;
+	int IconGroupEntryBase;
+
+	DataEntryScheduleNum=0;
+
+	//空のデータエントリ領域を作成
+
+	//RT_CURSOR
+	CursorEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<CursorNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_BITMAP
+	BitmapEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<BitmapResourceNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_ICON
+	IconEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<IconNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_GROUP_CURSOR
+	CursorGroupEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<CursorResourceNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_GROUP_ICON
+	IconGroupEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<IconResourceNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_MANIFEST
+	int XPManiEntryBase;
+	XPManiEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<XPManiResourceNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	i4=i2%8;
+	if(i4){
+		memset(buffer+i2,0,8-i4);
+		i2+=8-i4;
+	}
+
+	while(i2+8192>BufSize){
+		BufSize+=8192;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+	}
+
+
+	///////////////////////////////////////
+	// バイナリ データ
+	// ※データエントリの内容も変更する
+	///////////////////////////////////////
+
+	IMAGE_RESOURCE_DATA_ENTRY *pImgDataEntry;
+
+	i7=0;
+
+	//カーソルリソース
+	for(i3=0,i6=0;i3<CursorResourceNum;i3++){
+		hFile=CreateFile(pCursorResourceInfo[i3].FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(23,pCursorResourceInfo[i3].FileName,-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pCursorDir=(CURSORDIR *)temporary;
+
+		for(i5=0;i5<pCursorDir->idCount;i5++,i6++){
+			pCursorDirEntry=(CURSORDIRENTRY *)(temporary+sizeof(CURSORDIR)+sizeof(CURSORDIRENTRY)*i5);
+
+			//データエントリ
+			pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[CursorEntryBase+i6]);
+			pImgDataEntry->OffsetToData=i2;
+			pImgDataEntry->Size=pCursorDirEntry->dwBytesInRes+sizeof(WORD)*2;
+			AddRSrcAddrSchedule(dwDataEntrySchedule[CursorEntryBase+i6]);
+
+			//RT_CURSOR バイナリ データ
+			*(WORD *)(buffer+i2)=0x001F;
+			i2+=sizeof(WORD);
+			*(WORD *)(buffer+i2)=0x001F;
+			i2+=sizeof(WORD);
+			memcpy(buffer+i2,temporary+pCursorDirEntry->dwImageOffset,pCursorDirEntry->dwBytesInRes);
+			i2+=pCursorDirEntry->dwBytesInRes;
+
+			i4=i2%8;
+			if(i4){
+				memset(buffer+i2,0,8-i4);
+				i2+=8-i4;
+			}
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[CursorGroupEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=sizeof(CURSORDIR)+0xE*pCursorDir->idCount;
+		AddRSrcAddrSchedule(dwDataEntrySchedule[CursorGroupEntryBase+i3]);
+
+		//RT_GROUP_CURSORヘッダデータ（CURSORDIR）
+		memcpy(buffer+i2,temporary,sizeof(CURSORDIR));
+		i2+=sizeof(CURSORDIR);
+
+		for(i5=0;i5<pCursorDir->idCount;i5++,i7++){
+			pCursorDirEntry=(CURSORDIRENTRY *)(temporary+sizeof(CURSORDIR)+sizeof(CURSORDIRENTRY)*i5);
+			CursorDirEntry_Res.wWidth=pCursorDirEntry->bWidth;
+			CursorDirEntry_Res.wHeight=CursorDirEntry_Res.wWidth*2;
+			CursorDirEntry_Res.wXHotspot=pCursorDirEntry->wXHotspot;
+			CursorDirEntry_Res.wYHotspot=pCursorDirEntry->wYHotspot;
+			CursorDirEntry_Res.dwBytesInRes=pCursorDirEntry->dwBytesInRes+sizeof(WORD)*2;
+			CursorDirEntry_Res.wCursorNum=i7+1;
+
+			//RT_GROUP_CURSORヘッダデータ（CURSORDIRENTRY_RES）
+			memcpy(buffer+i2,&CursorDirEntry_Res,0xE);
+			i2+=0xE;
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+		i4=i2%8;
+		if(i4){
+			memset(buffer+i2,0,8-i4);
+			i2+=8-i4;
+		}
+
+		HeapDefaultFree(temporary);
+	}
+
+	//ビットマップリソース
+	for(i3=0;i3<BitmapResourceNum;i3++){
+		hFile=CreateFile(pBitmapResourceInfo[i3].FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(23,pBitmapResourceInfo[i3].FileName,-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		BufSize+=i4;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[BitmapEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=i4-sizeof(BITMAPFILEHEADER);
+		AddRSrcAddrSchedule(dwDataEntrySchedule[BitmapEntryBase+i3]);
+
+		//RT_BITMAP バイナリ データ
+		memcpy(buffer+i2,temporary+sizeof(BITMAPFILEHEADER),i4-sizeof(BITMAPFILEHEADER));
+		i2+=i4-sizeof(BITMAPFILEHEADER);
+
+		HeapDefaultFree(temporary);
+	}
+
+	//アイコンリソース
+	for(i3=0,i6=0;i3<IconResourceNum;i3++){
+		hFile=CreateFile(pIconResourceInfo[i3].FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(23,pIconResourceInfo[i3].FileName,-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pIconDir=(ICONDIR *)temporary;
+
+		for(i5=0;i5<pIconDir->idCount;i5++,i6++){
+			pIconDirEntry=(ICONDIRENTRY *)(temporary+sizeof(ICONDIR)+sizeof(ICONDIRENTRY)*i5);
+
+			//データエントリ
+			pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[IconEntryBase+i6]);
+			pImgDataEntry->OffsetToData=i2;
+			pImgDataEntry->Size=pIconDirEntry->dwBytesInRes;
+			AddRSrcAddrSchedule(dwDataEntrySchedule[IconEntryBase+i6]);
+
+			//RT_ICON バイナリ データ
+			memcpy(buffer+i2,temporary+pIconDirEntry->dwImageOffset,pIconDirEntry->dwBytesInRes);
+			i2+=pIconDirEntry->dwBytesInRes;
+
+			i4=i2%8;
+			if(i4){
+				memset(buffer+i2,0,8-i4);
+				i2+=8-i4;
+			}
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[IconGroupEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=sizeof(ICONDIR)+0xE*pIconDir->idCount;
+		AddRSrcAddrSchedule(dwDataEntrySchedule[IconGroupEntryBase+i3]);
+
+		//RT_GROUP_ICONヘッダデータ（ICONDIR）
+		memcpy(buffer+i2,temporary,sizeof(ICONDIR));
+		i2+=sizeof(ICONDIR);
+
+		for(i5=0;i5<pIconDir->idCount;i5++,i7++){
+			pIconDirEntry=(ICONDIRENTRY *)(temporary+sizeof(ICONDIR)+sizeof(ICONDIRENTRY)*i5);
+			IconDirEntry_Res.bWidth=pIconDirEntry->bWidth;
+			IconDirEntry_Res.bHeight=pIconDirEntry->bHeight;
+			IconDirEntry_Res.bColorCount=pIconDirEntry->bColorCount;
+			IconDirEntry_Res.bReserved=0;
+			IconDirEntry_Res.wPlanes=1;
+			if(pIconDirEntry->bColorCount==16)
+				IconDirEntry_Res.wBitCount=4;
+			else if(pIconDirEntry->bColorCount==0)
+				IconDirEntry_Res.wBitCount=8;
+			IconDirEntry_Res.dwBytesInRes=pIconDirEntry->dwBytesInRes;
+			IconDirEntry_Res.wIconNum=i7+1;
+
+			//RT_GROUP_ICONヘッダデータ（ICONDIRENTRY_RES）
+			memcpy(buffer+i2,&IconDirEntry_Res,0xE);
+			i2+=0xE;
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+		i4=i2%8;
+		if(i4){
+			memset(buffer+i2,0,8-i4);
+			i2+=8-i4;
+		}
+
+		HeapDefaultFree(temporary);
+	}
+
+	//XPManifestリソース
+	for(i3=0;i3<XPManiResourceNum;i3++){
+		extern char BasicCurDir[MAX_PATH];
+		extern char szManifestPath[MAX_PATH];
+		char temp2[MAX_PATH];
+		lstrcpy(temp2,szManifestPath);
+		GetFullPath(temp2,BasicCurDir);
+		hFile=CreateFile(temp2,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			SetError(59,temp2,-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4+1);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		temporary[i4]=0;
+		CloseHandle(hFile);
+
+		//プラットフォームをセット
+#ifdef _AMD64_
+		temporary=PermutationString(temporary,"#PLATFORM#","amd64");
+#else
+		temporary=PermutationString(temporary,"#PLATFORM#","x86");
+#endif
+
+		//アプリケーション名をセット
+		extern char OutputFileName[MAX_PATH];
+		char szAppliName[MAX_PATH];
+		_splitpath(OutputFileName,NULL,NULL,szAppliName,temp2);
+		lstrcat(szAppliName,temp2);
+		temporary=PermutationString(temporary,"#APPLI_FILE_NAME#",szAppliName);
+
+		i4=lstrlen(temporary)+1;
+
+		BufSize+=i4;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[XPManiEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=i4-1;	//※NULL文字はサイズに含めない
+		AddRSrcAddrSchedule(dwDataEntrySchedule[XPManiEntryBase+i3]);
+
+		//XMLデータ
+		memcpy(buffer+i2,temporary,i4);
+		i2+=i4;
+
+		HeapDefaultFree(temporary);
+	}
+
+	*pLen=i2;
+
+	return buffer;
+}
Index: /trunk/abdev/BasicCompiler_Common/Resource.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Resource.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Resource.cpp	(revision 147)
@@ -0,0 +1,129 @@
+#include "common.h"
+
+void GetResourceData(char *FileName){
+	extern HANDLE hHeap;
+	extern char BasicCurDir[MAX_PATH];
+	int i2,i3;
+	char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
+	HANDLE hFile;
+	DWORD dwId;
+
+	extern RESOURCEDATAINFO *pCursorResourceInfo;
+	extern int CursorResourceNum;
+	extern RESOURCEDATAINFO *pBitmapResourceInfo;
+	extern int BitmapResourceNum;
+	extern RESOURCEDATAINFO *pIconResourceInfo;
+	extern int IconResourceNum;
+	pCursorResourceInfo=(RESOURCEDATAINFO *)HeapAlloc(hHeap,0,1);
+	CursorResourceNum=0;
+	pBitmapResourceInfo=(RESOURCEDATAINFO *)HeapAlloc(hHeap,0,1);
+	BitmapResourceNum=0;
+	pIconResourceInfo=(RESOURCEDATAINFO *)HeapAlloc(hHeap,0,1);
+	IconResourceNum=0;
+
+	extern char szManifestPath[MAX_PATH];
+	extern int XPManiResourceNum;
+	szManifestPath[0]=0;
+	XPManiResourceNum=0;
+
+	hFile=CreateFile(FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE) return;
+	i2=GetFileSize(hFile,NULL);
+	buffer=(char *)HeapAlloc(hHeap,0,i2+i2);
+	ReadFile(hFile,buffer,i2,(DWORD *)&i3,NULL);
+	CloseHandle(hFile);
+	buffer[i3]=0;
+	ChangeReturnCode(buffer);
+
+	i2=0;
+	while(1){
+		//ID
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		for(i3=0;;i2++,i3++){
+			if(!IsVariableChar(buffer[i2])){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3]=buffer[i2];
+		}
+		if(temporary[0]=='\0') break;
+
+		_int64 i64data;
+		Type resultType;
+		if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
+			return;
+		}
+		if(resultType.IsReal()){
+			SetError(9,temporary,0);
+			return;
+		}
+		dwId=(DWORD)i64data;
+
+		//Type
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		for(i3=0;;i2++,i3++){
+			if(!IsVariableChar(buffer[i2])){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3]=buffer[i2];
+		}
+
+		//FileName
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		if(buffer[i2]!='\"'){
+			//エラー
+			return;
+		}
+		for(i2++,i3=0;;i2++,i3++){
+			if(buffer[i2]=='\"'){
+				temp2[i3]=0;
+				break;
+			}
+			temp2[i3]=buffer[i2];
+		}
+		GetFullPath(temp2,BasicCurDir);
+
+		if(lstrcmpi(temporary,"CURSOR")==0){
+			pCursorResourceInfo=(RESOURCEDATAINFO *)HeapReAlloc(hHeap,0,pCursorResourceInfo,(CursorResourceNum+1)*sizeof(RESOURCEDATAINFO));
+			pCursorResourceInfo[CursorResourceNum].dwId=dwId;
+			lstrcpy(pCursorResourceInfo[CursorResourceNum].FileName,temp2);
+			CursorResourceNum++;
+		}
+		else if(lstrcmpi(temporary,"BITMAP")==0){
+			pBitmapResourceInfo=(RESOURCEDATAINFO *)HeapReAlloc(hHeap,0,pBitmapResourceInfo,(BitmapResourceNum+1)*sizeof(RESOURCEDATAINFO));
+			pBitmapResourceInfo[BitmapResourceNum].dwId=dwId;
+			lstrcpy(pBitmapResourceInfo[BitmapResourceNum].FileName,temp2);
+			BitmapResourceNum++;
+		}
+		else if(lstrcmpi(temporary,"ICON")==0){
+			pIconResourceInfo=(RESOURCEDATAINFO *)HeapReAlloc(hHeap,0,pIconResourceInfo,(IconResourceNum+1)*sizeof(RESOURCEDATAINFO));
+			pIconResourceInfo[IconResourceNum].dwId=dwId;
+			lstrcpy(pIconResourceInfo[IconResourceNum].FileName,temp2);
+			IconResourceNum++;
+		}
+		else if(lstrcmpi(temporary,"RT_MANIFEST")==0){
+			if(XPManiResourceNum) goto error;
+
+			lstrcpy(szManifestPath,temp2);
+
+			XPManiResourceNum++;
+		}
+		else{
+error:
+			SetError(17,NULL,0);
+			return;
+		}
+
+		i2++;
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		if(buffer[i2]=='\0') break;
+		else if(buffer[i2]!='\n'){
+			SetError(17,NULL,0);
+			return;
+		}
+		i2++;
+	}
+
+	HeapDefaultFree(buffer);
+}
Index: /trunk/abdev/BasicCompiler_Common/StrOperation.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/StrOperation.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/StrOperation.cpp	(revision 147)
@@ -0,0 +1,768 @@
+#include "../BasicCompiler_Common/common.h"
+
+void KillSpaces(char *str1,char *str2){
+	int i,i2,i3,IsStr;
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if((str1[i]==' '||str1[i]=='\t')&&IsStr==0){
+			i3=i+1;
+			while(str1[i3]==' '||str1[i3]=='\t') i3++;
+			if(i!=0){
+				if(i==1){
+					if(IsVariableChar(str1[i-1])&&
+						IsVariableChar(str1[i3])){
+						//識別子間にある省略すべきでない空白
+						str2[i2++]=' ';
+					}
+				}
+				else{
+					if(str1[i-2]!=1&&IsVariableChar(str1[i-1])&&
+						IsVariableChar(str1[i3])){
+						//識別子間にある省略すべきでない空白
+						str2[i2++]=' ';
+					}
+				}
+			}
+			i=i3;
+		}
+		if(str1[i]=='\"') IsStr^=1;
+		str2[i2]=str1[i];
+		if(str1[i]=='\0') break;
+	}
+}
+void KillStringSpaces(char *str){
+	char *s2;
+
+	extern HANDLE hHeap;
+	s2=(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
+	lstrcpy(s2,str);
+	KillSpaces(s2,str);
+	HeapDefaultFree(s2);
+	return;
+}
+BOOL RemoveStringQuotes(char *str){
+	int i;
+	if(str[0]!='\"') return 0;
+	for(i=0;;i++){
+		str[i]=str[i+1];
+		if(str[i]=='\"') break;
+	}
+	str[i]=0;
+	if(str[i+2]!='\0') return 0;
+	return 1;
+}
+void RemoveStringPare(char *str){
+	int i;
+	i=lstrlen(str);
+	if(str[0]!='('||str[i-1]!=')') return;
+	SlideString(str+1,-1);
+	str[i-2]=0;
+}
+void RemoveStringBracket(char *str){
+	int i;
+	i=lstrlen(str);
+	if(str[0]!='['||str[i-1]!=']') return;
+	SlideString(str+1,-1);
+	str[i-2]=0;
+}
+void SetStringQuotes(char *str){
+	int i;
+	if(str[0]=='\"') return;
+	i=lstrlen(str);
+	SlideString(str,1);
+	str[0]='\"';
+	str[i+1]='\"';
+	str[i+2]=0;
+}
+int FormatString_EscapeSequence(char *buffer){
+	int i2,i3,i4;
+
+	for(i2=0,i3=0;;i2++,i3++){
+		if(IsDBCSLeadByte(buffer[i3])){
+			buffer[i2++]=buffer[i3++];
+			buffer[i2]=buffer[i3];
+			if(buffer[i3]=='\0') break;
+			continue;
+		}
+		if(buffer[i3]=='\\'){
+			switch(buffer[i3+1]){
+				case '\\':
+					buffer[i2]='\\';
+					i3++;
+					break;
+				case '0':
+					buffer[i2]='\0';
+					i3++;
+					break;
+				case 'n':
+					buffer[i2]='\n';
+					i3++;
+					break;
+				case 'q':
+					buffer[i2]='\"';
+					i3++;
+					break;
+				case 'r':
+					buffer[i2]='\r';
+					i3++;
+					break;
+				case 't':
+					buffer[i2]='\t';
+					i3++;
+					break;
+				case 'x':
+					//16進表記
+					char temporary[8];
+					temporary[0]=buffer[i3+2];
+					temporary[1]=buffer[i3+3];
+					temporary[2]=0;
+					CharUpper(temporary);
+
+					i4=temporary[0]-0x30;
+					if(i4<0||9<i4){
+						i4=temporary[0]-0x41+10;
+						if(i4<0xA||0xF<i4){
+							buffer[i2]=buffer[i3];
+							break;
+						}
+					}
+					temporary[0]=i4;
+
+					i4=temporary[1]-0x30;
+					if(i4<0||9<i4){
+						i4=temporary[1]-0x41+10;
+						if(i4<0xA||0xF<i4){
+							buffer[i2]=buffer[i3];
+							break;
+						}
+					}
+					temporary[1]=i4;
+
+					buffer[i2]=temporary[0]*0x10+temporary[1];
+					i3+=3;
+					break;
+				default:
+					buffer[i2]=buffer[i3];
+					break;
+			}
+		}
+		else{
+			buffer[i2]=buffer[i3];
+			if(buffer[i3]=='\0') break;
+		}
+	}
+	return i2;
+}
+void SlideString(char *buffer, int slide){
+	char *temp;
+	temp=(char *)malloc(lstrlen(buffer)+1);
+	lstrcpy(temp,buffer);
+	lstrcpy(buffer+slide,temp);
+	free(temp);
+}
+void SlideBuffer(char *buffer,int length,int slide){
+	void *temp;
+	temp=malloc(length+1);
+	memcpy(temp,buffer,length);
+	memcpy(buffer+slide,temp,length);
+	free(temp);
+}
+_int8 IsCommandDelimitation(char c){
+	if(c=='\n'||c==':'||c=='\0') return 1;
+	return 0;
+}
+BOOL IsBlank(char c){
+	if(c==' '||c=='\t') return 1;
+	return 0;
+}
+int GetOneParameter(const char *Parameter,int pos,char *retAns){
+	int i,i2,i3,IsStr;
+	for(i=pos,i2=0,IsStr=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		else if(Parameter[i]=='('&&IsStr==0){
+			i3=GetStringInPare(retAns+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Parameter[i]=='['&&IsStr==0){
+			i3=GetStringInBracket(retAns+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Parameter[i]==','&&IsStr==0){
+			retAns[i2]=0;
+			i++;
+			break;
+		}
+
+		if(IsCommandDelimitation(Parameter[i])&&IsStr==0
+			|| Parameter[i] == ')' && IsStr == 0 ){
+				retAns[i2]=0;
+				break;
+		}
+
+		retAns[i2]=Parameter[i];
+	}
+	return i;
+}
+int JumpOneParameter(char *Parameter,int i){
+	int i2,IsStr;
+	for(i2=0,IsStr=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		else if(Parameter[i]=='('&&IsStr==0){
+			i=JumpStringInPare(Parameter,i+1);
+			continue;
+		}
+		else if(Parameter[i]=='['&&IsStr==0){
+			i=JumpStringInBracket(Parameter,i+1);
+			continue;
+		}
+		else if(Parameter[i]==','&&IsStr==0){
+			i++;
+			break;
+		}
+		if(IsCommandDelimitation(Parameter[i])) break;
+	}
+	return i;
+}
+int GetStringInQuotation(char *buffer,char *ReadBuffer){
+	int i;
+
+	if(ReadBuffer[0]=='\"'){
+		buffer[0]=ReadBuffer[0];
+		i=1;
+	}
+	else i=0;
+
+	for(;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"'){
+			i++;
+			buffer[i]=0;
+			break;
+		}
+		if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInPare(char *buffer,const char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInPare_RemovePare(char *buffer,char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=1;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInBracket(char *buffer,const char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int JumpStringInPare(const char *buffer,int pos){
+	int PareNum;
+	for(PareNum=1;;pos++){
+		if(buffer[pos]=='\"'){
+			for(pos++;;pos++){
+				if(buffer[pos]=='\"') break;
+			}
+			continue;
+		}
+		else if(buffer[pos]=='(') PareNum++;
+		else if(buffer[pos]==')'){
+			PareNum--;
+			if(PareNum==0) return pos;
+		}
+		else if(buffer[pos]=='\0') break;
+	}
+	return 0;
+}
+int JumpStringInBracket(const char *buffer,int pos){
+	int PareNum;
+	for(PareNum=1;;pos++){
+		if(buffer[pos]=='\"'){
+			for(pos++;;pos++){
+				if(buffer[pos]=='\"') break;
+			}
+			continue;
+		}
+		else if(buffer[pos]=='[') PareNum++;
+		else if(buffer[pos]==']'){
+			PareNum--;
+			if(PareNum==0) return pos;
+		}
+		else if(buffer[pos]=='\0') break;
+	}
+	return 0;
+}
+
+int GetCpFromLine(int LineNum){
+	extern char *basbuf;
+
+	int i,nCount=0;
+	for(i=0;;i++){
+		if(basbuf[i]=='\n'){
+			nCount++;
+			if(LineNum==nCount){
+				for(i++;;i++){
+					if(IsCommandDelimitation(basbuf[i])) break;
+				}
+				return i;
+			}
+		}
+	}
+}
+BOOL GetLineNum(int pos,int *pLine,char *FileName){
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	extern char *basbuf;
+	int i,i2,i3,i4,i5;
+
+	i=pos;
+	if(basbuf[i]=='\n') i--;
+	for(i3=0,i2=0;i3<i;i3++){
+		if(basbuf[i3]=='\n') i2++;
+		if(basbuf[i3]=='\0') return 0;
+	}
+	i4=0;
+	while(IncludeFileInfo.LineOfFile[i2]!=IncludeFileInfo.LineOfFile[i4]) i4++;
+	for(i3=0,i5=0;i5<i4;i3++){
+		if(basbuf[i3]=='\n') i5++;
+		if(basbuf[i3]=='\0') return 0;
+	}
+	for(i5=0;i4<i2;i3++){
+		if(basbuf[i3]=='\n'){
+			i4++;
+			i5++;
+			if(IncludeFileInfo.LineOfFile[i2]<IncludeFileInfo.LineOfFile[i4]){
+				for(;IncludeFileInfo.LineOfFile[i2]!=IncludeFileInfo.LineOfFile[i4];i3++){
+					if(basbuf[i3]=='\n') i4++;
+				}
+			}
+		}
+		if(basbuf[i3]=='\0') return 0;
+	}
+
+	if(IncludeFileInfo.LineOfFile[i2]==-1){
+		//ファイル・行番号を特定できなかった場合
+		*pLine=-1;
+		FileName[0]=0;
+	}
+	else{
+		//行番号をセット
+		*pLine=i5;
+
+		//ファイル名をセット
+		lstrcpy(FileName,IncludeFileInfo.ppFileNames[IncludeFileInfo.LineOfFile[i2]]);
+	}
+
+	return 1;
+}
+
+char GetEndXXXCommand(char es){
+	switch(es){
+		case ESC_SUB:
+			return ESC_ENDSUB;
+		case ESC_FUNCTION:
+			return ESC_ENDFUNCTION;
+		case ESC_MACRO:
+			return ESC_ENDMACRO;
+		case ESC_TYPE:
+			return ESC_ENDTYPE;
+		case ESC_CLASS:
+			return ESC_ENDCLASS;
+		case ESC_INTERFACE:
+			return ESC_ENDINTERFACE;
+		case ESC_ENUM:
+			return ESC_ENDENUM;
+	}
+	return 0;
+}
+void GetDefaultNameFromES(char es,char *name){
+	name[0]=0;
+	switch(es){
+		case ESC_PSMEM:
+			lstrcpy(name,"->");
+			break;
+		case ESC_MOD:
+			lstrcpy(name,"Mod");
+			break;
+		case ESC_AND:
+			lstrcpy(name,"And");
+			break;
+		case ESC_OR:
+			lstrcpy(name,"Or");
+			break;
+		case ESC_XOR:
+			lstrcpy(name,"Xor");
+			break;
+		case ESC_NOT:
+			lstrcpy(name,"Not");
+			break;
+		case ESC_AS:
+			lstrcpy(name,"As");
+			break;
+		case ESC_THEN:
+			lstrcpy(name,"Then");
+			break;
+		case ESC_ELSE:
+			lstrcpy(name,"Else");
+			break;
+		case ESC_IF:
+			lstrcpy(name,"If");
+			break;
+		case ESC_ELSEIF:
+			lstrcpy(name,"ElseIf");
+			break;
+		case ESC_ENDIF:
+			lstrcpy(name,"End If");
+			break;
+		case ESC_DEF:
+			lstrcpy(name,"Def");
+			break;
+		case ESC_DECLARE:
+			lstrcpy(name,"Declare");
+			break;
+		case ESC_ABSTRACT:
+			lstrcpy(name,"Abstract");
+			break;
+		case ESC_VIRTUAL:
+			lstrcpy(name,"Virtual");
+			break;
+		case ESC_OVERRIDE:
+			lstrcpy(name,"Override");
+			break;
+		case ESC_SUB:
+			lstrcpy(name,"Sub");
+			break;
+		case ESC_ENDSUB:
+			lstrcpy(name,"End Sub");
+			break;
+		case ESC_EXITSUB:
+			lstrcpy(name,"Exit Sub");
+			break;
+		case ESC_FUNCTION:
+			lstrcpy(name,"Function");
+			break;
+		case ESC_ENDFUNCTION:
+			lstrcpy(name,"End Function");
+			break;
+		case ESC_EXITFUNCTION:
+			lstrcpy(name,"Exit Function");
+			break;
+		case ESC_BYVAL:
+			lstrcpy(name,"ByVal ");
+			break;
+		case ESC_BYREF:
+			lstrcpy(name,"ByRef ");
+			break;
+		case ESC_TYPE:
+			lstrcpy(name,"Type");
+			break;
+		case ESC_ENDTYPE:
+			lstrcpy(name,"End Type");
+			break;
+		case ESC_EXITFOR:
+			lstrcpy(name,"Exit For");
+			break;
+		case ESC_EXITWHILE:
+			lstrcpy(name,"Exit While");
+			break;
+		case ESC_EXITDO:
+			lstrcpy(name,"Exit Do");
+			break;
+		case ESC_SELECTCASE:
+			lstrcpy(name,"Select Case");
+			break;
+		case ESC_CASE:
+			lstrcpy(name,"Case");
+			break;
+		case ESC_CASEELSE:
+			lstrcpy(name,"Case Else");
+			break;
+		case ESC_ENDSELECT:
+			lstrcpy(name,"End Select");
+			break;
+		case ESC_CONST:
+			lstrcpy(name,"Const");
+			break;
+		case ESC_TYPEDEF:
+			lstrcpy(name,"TypeDef");
+			break;
+		case ESC_WITH:
+			lstrcpy(name,"With");
+			break;
+		case ESC_ENDWITH:
+			lstrcpy(name,"End With");
+			break;
+		case ESC_CDECL:
+			lstrcpy(name,"cdecl");
+			break;
+		case ESC_MACRO:
+			lstrcpy(name,"Macro");
+			break;
+		case ESC_ENDMACRO:
+			lstrcpy(name,"End Macro");
+			break;
+		case ESC_EXITMACRO:
+			lstrcpy(name,"Exit Macro");
+			break;
+		case ESC_EXPORT:
+			lstrcpy(name,"Export");
+			break;
+		case ESC_CONTINUE:
+			lstrcpy(name,"Continue");
+			break;
+		case ESC_CLASS:
+			lstrcpy(name,"Class");
+			break;
+		case ESC_ENDCLASS:
+			lstrcpy(name,"End Class");
+			break;
+		case ESC_INTERFACE:
+			lstrcpy(name,"Interface");
+			break;
+		case ESC_ENDINTERFACE:
+			lstrcpy(name,"End Interface");
+			break;
+		case ESC_ENUM:
+			lstrcpy(name,"Enum");
+			break;
+		case ESC_ENDENUM:
+			lstrcpy(name,"End Enum");
+			break;
+	}
+}
+void GetCalcName(int idCalc,char *name){
+	switch(idCalc){
+		case CALC_XOR:
+			lstrcpy(name,"xor");
+			break;
+		case CALC_OR:
+			lstrcpy(name,"or");
+			break;
+		case CALC_AND:
+			lstrcpy(name,"and");
+			break;
+		case CALC_NOT:
+			lstrcpy(name,"Not");
+			break;
+
+		case CALC_PE:
+			lstrcpy(name,"<=");
+			break;
+		case CALC_QE:
+			lstrcpy(name,">=");
+			break;
+		case CALC_NOTEQUAL:
+			lstrcpy(name,"<>");
+			break;
+		case CALC_SUBSITUATION:
+		case CALC_EQUAL:
+			lstrcpy(name,"=");
+			break;
+		case CALC_P:
+			lstrcpy(name,"<");
+			break;
+		case CALC_Q:
+			lstrcpy(name,">");
+			break;
+
+		case CALC_SHL:
+			lstrcpy(name,"<<");
+			break;
+		case CALC_SHR:
+			lstrcpy(name,">>");
+			break;
+		case CALC_ADDITION:
+			lstrcpy(name,"+");
+			break;
+		case CALC_SUBTRACTION:
+			lstrcpy(name,"-");
+			break;
+		case CALC_MOD:
+			lstrcpy(name,"mod");
+			break;
+		case CALC_PRODUCT:
+			lstrcpy(name,"*");
+			break;
+		case CALC_QUOTIENT:
+			lstrcpy(name,"/");
+			break;
+		case CALC_INTQUOTIENT:
+			lstrcpy(name,"\\");
+			break;
+		case CALC_AS:
+			lstrcpy(name,"As");
+			break;
+		case CALC_BYVAL:
+			lstrcpy(name,"ByVal");
+			break;
+		case CALC_MINUSMARK:
+			lstrcpy(name,"-");
+			break;
+		case CALC_POWER:
+			lstrcpy(name,"^");
+			break;
+
+		case CALC_ARRAY_GET:
+			lstrcpy(name,"[]");
+			break;
+		case CALC_ARRAY_SET:
+			lstrcpy(name,"[]=");
+			break;
+	}
+}
+
+BOOL IsFile(char *path){
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind;
+
+	hFind=FindFirstFile(path,&wfd);
+	if(hFind==INVALID_HANDLE_VALUE){
+		return 0;
+	}
+	FindClose(hFind);
+
+	return 1;
+}
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle){
+	BROWSEINFO BrowseInfo;
+	LPITEMIDLIST pidlBrowse;
+	LPMALLOC g_pMalloc;
+	char temporary[MAX_PATH];
+
+	BrowseInfo.hwndOwner=hWnd;
+	BrowseInfo.pszDisplayName=temporary;
+	BrowseInfo.pidlRoot=NULL;
+	BrowseInfo.lpszTitle=OpenFolderTitle;
+	BrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
+	BrowseInfo.lpfn=NULL;
+	BrowseInfo.lParam=(LPARAM)0;
+	BrowseInfo.iImage=0;
+	pidlBrowse=SHBrowseForFolder(&BrowseInfo);
+	if(pidlBrowse){
+		if(SHGetMalloc(&g_pMalloc)!=0) return 0;
+		SHGetPathFromIDList(pidlBrowse,folder);
+		g_pMalloc->Free(pidlBrowse);
+		g_pMalloc->Release();
+		return 1;
+	}
+	return 0;
+}
+
+void ShortPathToLongPath(const char *ShortPath,char *LongPath){
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	int i;
+	char dummy[MAX_PATH];
+	for(i=0;i<MAX_PATH;i++){
+		LongPath[i]=ShortPath[i];
+		if((ShortPath[i-1]==':'&&ShortPath[i]=='\\')||(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\')){
+			LongPath[i+1]=0;
+			break;
+		}
+	}
+	if(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\'){
+		for(i++;i<MAX_PATH;i++){
+			if(IsDBCSLeadByte(ShortPath[i])){
+				i++;
+				continue;
+			}
+			LongPath[i]=ShortPath[i];
+			if(ShortPath[i]=='\\'){
+				LongPath[i+1]=0;
+				break;
+			}
+		}
+		for(i++;i<MAX_PATH;i++){
+			if(IsDBCSLeadByte(ShortPath[i])){
+				i++;
+				continue;
+			}
+			LongPath[i]=ShortPath[i];
+			if(ShortPath[i]=='\\'){
+				LongPath[i+1]=0;
+				break;
+			}
+		}
+	}
+	for(i++;i<MAX_PATH;i++){
+		if(IsDBCSLeadByte(ShortPath[i])){
+			i++;
+			continue;
+		}
+		if(ShortPath[i]=='\\'||ShortPath[i]=='\0'){
+			strncpy(dummy,ShortPath,i);
+			dummy[i]=0;
+			if((hFind=FindFirstFile(dummy,&wfd))!=INVALID_HANDLE_VALUE) FindClose(hFind);
+			lstrcat(LongPath,wfd.cFileName);
+
+			if(ShortPath[i]=='\0') break;
+			lstrcat(LongPath,"\\");
+
+			if(ShortPath[i]=='\\'&&ShortPath[i+1]=='\0'){
+				break;
+			}
+		}
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/Subroutine.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 147)
@@ -0,0 +1,898 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+int GetCallProcName(char *buffer,char *name){
+	int i2,i3,IsStr=0;
+
+	for(i2=0;;i2++){
+		if(buffer[i2]=='\"') IsStr^=1;
+		if(IsDBCSLeadByte(buffer[i2])){
+			name[i2]=buffer[i2];
+			i2++;
+			name[i2]=buffer[i2];
+			continue;
+		}
+		if(buffer[i2]=='['&&IsStr==0){
+			i3=GetStringInBracket(name+i2,buffer+i2);
+			i2+=i3-1;
+			continue;
+		}
+		if(buffer[i2]=='('&&IsStr==0){
+			name[i2]=0;
+			break;
+		}
+		if(buffer[i2]=='='&&IsStr==0){
+			name[i2]=0;
+			break;
+		}
+
+		name[i2]=buffer[i2];
+		if(buffer[i2]=='\0') break;
+	}
+	return i2;
+}
+
+int GetProc(char *name,void **ppInfo){
+
+	//ユーザー定義関数
+	*ppInfo=(void *)GetSubHash(name);
+	if(*ppInfo) return PROC_DEFAULT;
+
+	//DLL関数
+	*ppInfo=(void *)GetDeclareHash(name);
+	if(*ppInfo) return PROC_DLL;
+
+	//コンパイラ埋め込み型
+	*ppInfo=(void *)(_int64)GetFunctionFromName(name);
+	if(*ppInfo) return PROC_BUILTIN;
+
+	//関数ポインタ
+	Type type;
+	if( !GetVarType( name, type, false ) ){
+		return 0;
+	}
+	if( type.IsProcPtr() ){
+		return PROC_PTR;
+	}
+
+	return 0;
+}
+
+void SplitObjectName(const char *name,char *ObjectName,int *pRefType){
+	int i4;
+	for(i4=lstrlen(name)-1;i4>=0;i4--){
+		if(name[i4]=='.'||(name[i4]==1&&name[i4+1]==ESC_PSMEM))
+			break;
+	}
+	if(i4==-1) ObjectName[0]=0;
+	else{
+		//参照タイプを判別
+		if(name[i4]=='.') *pRefType=DEF_OBJECT;
+		else *pRefType=DEF_PTR_OBJECT;
+
+		if(i4==0) GetWithName(ObjectName);
+		else{
+			memcpy(ObjectName,name,i4);
+			ObjectName[i4]=0;
+		}
+	}
+}
+bool SplitMemberName( const char *desc, char *object, char *member, CClass::RefType &refType ){
+	int lastIndex = -1;
+	for( int i=0; desc[i]; i++ ){
+		if( desc[i] == '(' ){
+			i=JumpStringInPare(desc,i+1);
+			continue;
+		}
+		else if( desc[i] == '[' ){
+			i=JumpStringInBracket(desc,i+1);
+			continue;
+		}
+		else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
+			lastIndex = i;
+		}
+	}
+	if( lastIndex == -1 ){
+		lstrcpy( member, desc );
+		return false;
+	}
+
+	if(desc[lastIndex]=='.'){
+		lstrcpy(member,desc+lastIndex+1);
+		refType = CClass::Dot;
+	}
+	else{
+		lstrcpy(member,desc+lastIndex+2);
+		refType = CClass::Pointer;
+	}
+
+	if( object ){
+		lstrcpy( object, desc );
+		object[lastIndex]=0;
+	}
+
+	return true;
+}
+bool SplitMemberName( const char *desc, char *object, char *member ){
+	CClass::RefType dummyRefType;
+	return SplitMemberName( desc, object, member, dummyRefType );
+}
+
+bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn ){
+
+	//GetSubHash内でエラー提示が行われた場合
+	if(pProc==(Procedure *)-1){
+		return false;
+	}
+
+	if(kind==PROC_DEFAULT){
+		/////////////////////
+		// ユーザー定義関数
+		/////////////////////
+
+		UserProc *pUserProc = (UserProc *)pProc;
+
+		//オブジェクト名を取得
+		char ObjectName[VN_SIZE];
+		int RefType;
+		SplitObjectName(fullCallName,ObjectName,&RefType);
+
+
+		////////////////////////
+		// オーバーロードを解決
+		////////////////////////
+
+		std::vector<UserProc *> subs;
+		GetOverloadSubHash(fullCallName,subs);
+		if(subs.size()){
+			//オーバーロードを解決
+			pUserProc=OverloadSolutionWithStrParam(fullCallName,subs,lpszParms,ObjectName);
+
+			if(!pUserProc){
+				return false;
+			}
+		}
+
+		resultType = pUserProc->ReturnType();
+
+		if( isCallOn ){
+			if( !Opcode_CallProc(lpszParms,pUserProc,0,ObjectName,RefType) ){
+				return false;
+			}
+		}
+	}
+	else if(kind==PROC_DLL){
+		/////////////////////////
+		// DLL関数
+		/////////////////////////
+		DllProc *pDllProc = (DllProc *)pProc;
+
+		resultType = pDllProc->ReturnType();
+
+		if( isCallOn ){
+			if( !Opcode_CallDllProc(lpszParms,pDllProc) ){
+				return false;
+			}
+		}
+	}
+	else if(kind==PROC_BUILTIN){
+		/////////////////////////
+		// 組み込み関数
+		/////////////////////////
+		int FuncId = (int)(_int64)pProc;
+
+		if( !Opcode_CallFunc( lpszParms, FuncId, resultType, isCallOn ) ){
+			return false;
+		}
+	}
+	else if(kind==PROC_PTR){
+		/////////////////
+		// 関数ポインタ
+		/////////////////
+
+		Type type;
+		GetVarType(fullCallName,type,false);
+
+		ProcPointer *pProcPtr = Smoothie::Meta::procPointers[type.GetIndex()];
+		resultType = pProcPtr->ReturnType();
+
+		if( isCallOn ){
+			if( !Opcode_CallProcPtr(fullCallName,lpszParms,pProcPtr) ){
+				return false;
+			}
+		}
+	}
+	else{
+		return false;
+	}
+
+	return true;
+}
+bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType){
+	//プロパティ用のメソッドを呼び出す
+
+	//配列要素を取得
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(variable,VarName,ArrayElements);
+
+	//オブジェクト名を取得
+	char ObjectName[VN_SIZE];
+	int RefType;
+	SplitObjectName(VarName,ObjectName,&RefType);
+
+	//オーバーロード用の関数リストを作成
+	std::vector<UserProc *> subs;
+	GetOverloadSubHash(VarName,subs);
+	if(subs.size()==0){
+		return false;
+	}
+
+	//パラメータを整備
+	char *Parameter;
+	Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
+	lstrcpy(Parameter,ArrayElements);
+	if(rightSide){
+		if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
+		lstrcat(Parameter,rightSide);
+	}
+
+	//オーバーロードを解決
+	UserProc *pUserProc;
+	pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
+
+	if(pUserProc){
+		//呼び出し
+		Opcode_CallProc(Parameter,pUserProc,0,ObjectName,RefType);
+
+		resultType = pUserProc->ReturnType();
+	}
+
+	HeapDefaultFree(Parameter);
+
+	return true;
+}
+
+bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ){
+	//プロパティ用のメソッドを呼び出す
+
+	//配列要素を取得
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(variable,VarName,ArrayElements);
+
+	//オブジェクト名を取得
+	char ObjectName[VN_SIZE];
+	int RefType;
+	SplitObjectName(VarName,ObjectName,&RefType);
+
+	//オーバーロード用の関数リストを作成
+	std::vector<UserProc *> subs;
+	GetOverloadSubHash(VarName,subs);
+	if(subs.size()==0){
+		return 0;
+	}
+
+	//パラメータを整備
+	char *Parameter;
+	Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
+	lstrcpy(Parameter,ArrayElements);
+	if(rightSide){
+		if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
+		lstrcat(Parameter,rightSide);
+	}
+
+	//オーバーロードを解決
+	UserProc *pUserProc;
+	pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
+
+	if(pUserProc){
+		resultType = pUserProc->ReturnType();
+	}
+
+	return 1;
+}
+
+//インデクサ（getter）の戻り値を取得
+bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){
+	vector<UserProc *> subs;
+	objClass.GetMethods().Enum( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
+		return false;
+	}
+
+	resultType = subs[0]->ReturnType();
+
+	return true;
+}
+
+
+void AddDeclareData(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){
+	extern HANDLE hHeap;
+	int i2;
+
+	int i=0;
+
+	//Sub/Function
+	Procedure::Kind kind = Procedure::Sub;
+	if(buffer[i]==ESC_SUB){
+	}
+	else if(buffer[i]==ESC_FUNCTION){
+		kind = Procedure::Function;
+	}
+	else{
+		SetError(1,NULL,nowLine);
+		return;
+	}
+	i++;
+
+	//プロシージャ名
+	char procName[VN_SIZE];
+	bool isCdecl = false;
+	for(i2=0;;i++,i2++){
+		if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
+			isCdecl = true;
+
+			i+=2;
+			procName[i2]=0;
+			break;
+		}
+		if(buffer[i]==','){
+			procName[i2]=0;
+			break;
+		}
+		if(buffer[i]=='\0'){
+			SetError(1,NULL,nowLine);
+			return;
+		}
+		procName[i2]=buffer[i];
+	}
+	i++;
+
+	//ユーザー定義関数との重複チェック
+	if(GetSubHash(procName)){
+		SetError(15,procName,nowLine);
+		return;
+	}
+
+
+	//ライブラリ
+	char dllFileName[MAX_PATH];
+	i = GetOneParameter( buffer, i, dllFileName );
+	Type resultType;
+	_int64 i64data;
+	if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
+		return;
+	}
+	if( resultType.GetBasicType() != typeOfPtrChar ){
+		SetError(1,NULL,nowLine);
+		return;
+	}
+	lstrcpy( dllFileName, (char *)i64data );
+	CharUpper(dllFileName);
+	if(!strstr(dllFileName,".")){
+		lstrcat(dllFileName,".DLL");
+		if(lstrlen(dllFileName)>=16){
+			SetError(7,NULL,nowLine);
+			return;
+		}
+	}
+
+	//エイリアス
+	char alias[VN_SIZE];
+	i = GetOneParameter( buffer, i, alias );
+	if( alias[0] ){
+		if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
+			return;
+		}
+		if( resultType.GetBasicType() != typeOfPtrChar ){
+			SetError(1,NULL,nowLine);
+			return;
+		}
+		lstrcpy( alias, (char *)i64data );
+	}
+	else{
+		//省略されたときは関数名
+		lstrcpy( alias, procName );
+	}
+
+
+	// オブジェクトを生成
+	DllProc *pDllProc = new DllProc( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );
+
+	// パラメータを解析
+	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
+	pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
+
+	// パラメータのエラーチェック
+	foreach( const Parameter *pParam, pDllProc->Params() ){
+		if( pParam->IsObject() ){
+			SetError(25,pParam->GetVarName(),nowLine);
+		}
+		if( !pParam->IsRef() ){
+			if( pParam->IsStruct() ){
+				SetError(28,pParam->GetVarName(),nowLine);
+			}
+		}
+	}
+
+	//戻り値のエラーチェック
+	if( pDllProc->IsFunction() ){
+		// Function定義
+
+		if( pDllProc->ReturnType().IsObject() ){
+			// DLL関数ではオブジェクトを戻り値にできない
+			SetError(40,pDllProc->GetName(),nowLine);
+		}
+	}
+
+
+	/////////////////////////////////
+	// 格納位置を計算してppDeclareHashにセット
+	/////////////////////////////////
+
+	//ハッシュ値を取得
+	int key;
+	key=hash_default(procName);
+
+	extern DllProc **ppDeclareHash;
+	if(ppDeclareHash[key]){
+		DllProc *pTempProc = ppDeclareHash[key];
+		while(1){
+			if( pTempProc->IsEqualSymbol( pDllProc->GetNamespaceScopes(), pDllProc->GetName() ) ){
+				//重複エラー
+				SetError(15,procName,nowLine);
+				return;
+			}
+
+			if(pTempProc->pNextData==0){
+				pTempProc->pNextData=pDllProc;
+				break;
+			}
+			pTempProc=pTempProc->pNextData;
+		}
+		pTempProc=pTempProc->pNextData;
+	}
+	else{
+		ppDeclareHash[key]=pDllProc;
+	}
+}
+
+GlobalProc *AddSubData( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic){
+	int i2,i3;
+	char temporary[8192];
+
+	int i=1;
+
+	Procedure::Kind kind = Procedure::Sub;
+	bool isMacro = false;
+	if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
+	if(buffer[i]==ESC_MACRO){
+		isMacro = true;
+	}
+
+	i++;
+
+	bool isCdecl = false;
+	bool isExport = false;
+	while(1){
+		if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
+			isCdecl = true;
+
+			i+=2;
+		}
+		else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
+			isExport = true;
+
+			i+=2;
+		}
+		else break;
+	}
+
+	i2=0;
+	if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
+		if(!pobj_c){
+			SetError(126,NULL,nowLine);
+			return 0;
+		}
+
+		//オペレータの場合
+		temporary[i2++]=buffer[i++];
+		temporary[i2++]=buffer[i++];
+
+		int iCalcId;
+		if(buffer[i]=='='&&buffer[i+1]=='='){
+			iCalcId=CALC_EQUAL;
+			i3=2;
+		}
+		else if(buffer[i]=='='){
+			iCalcId=CALC_SUBSITUATION;
+			i3=1;
+		}
+		else if(buffer[i]=='('){
+			iCalcId=CALC_AS;
+			i3=0;
+		}
+		else if(buffer[i]=='['&&buffer[i+1]==']'&&buffer[i+2]=='='){
+			iCalcId=CALC_ARRAY_SET;
+			i3=3;
+		}
+		else if(buffer[i]=='['&&buffer[i+1]==']'){
+			iCalcId=CALC_ARRAY_GET;
+			i3=2;
+		}
+		else{
+			iCalcId=GetCalcId(buffer+i,&i3);
+			i3++;
+		}
+		if(!iCalcId){
+			SetError(1,NULL,nowLine);
+			return 0;
+		}
+		temporary[i2++]=iCalcId;
+		temporary[i2]=0;
+
+		i+=i3;
+	}
+	else{
+		if(pobj_c){
+			//クラスメンバの場合、デストラクタには~が付くことを考慮
+			if(buffer[i]=='~'){
+				temporary[i2]='~';
+				i++;
+				i2++;
+			}
+		}
+
+		for(;;i++,i2++){
+			if(!IsVariableChar(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+	}
+
+	if( isMacro ){
+		//大文字に変換
+		CharUpper(temporary);
+
+		//マクロ関数の場合は名前リストに追加
+		extern char **ppMacroNames;
+		extern int MacroNum;
+		ppMacroNames=(char **)HeapReAlloc(hHeap,0,ppMacroNames,(MacroNum+1)*sizeof(char *));
+		ppMacroNames[MacroNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(ppMacroNames[MacroNum],temporary);
+		MacroNum++;
+	}
+
+	if(!pobj_c){
+		//クラスメンバ以外の場合のみ
+		//重複チェック
+
+		if(GetDeclareHash(temporary)){
+			SetError(15,temporary,nowLine);
+			return 0;
+		}
+	}
+
+	extern int SubNum;
+	SubNum++;
+
+	GlobalProc *pUserProc = new GlobalProc( namespaceScopes, importedNamespaces, temporary, kind, isMacro, isCdecl, isExport );
+	pUserProc->SetParentClass( pobj_c );
+	if( Smoothie::isFullCompile ){
+		// すべての関数・メソッドをコンパイルする
+		pUserProc->Using();
+	}
+
+	//ID
+	static int id_base=0;
+	pUserProc->id = (id_base++);
+
+	if(isExport){
+		pUserProc->Using();
+	}
+
+	// パラメータを解析
+	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
+	pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
+
+	pUserProc->_paramStr = buffer + i;
+
+
+	/////////////////////////////////
+	// ハッシュデータに追加
+	/////////////////////////////////
+
+	int key;
+	key=hash_default(pUserProc->GetName().c_str());
+
+	extern GlobalProc **ppSubHash;
+	if(ppSubHash[key]){
+		GlobalProc *psi2;
+		psi2=ppSubHash[key];
+		while(1){
+			if(pobj_c==psi2->GetParentClassPtr()){
+				//重複エラーチェックを行う
+				if( pUserProc->IsEqualSymbol( *psi2 ) ){
+					if( psi2->Params().Equals( pUserProc->Params() ) ){
+						SetError(15,pUserProc->GetName().c_str(),nowLine);
+						return 0;
+					}
+				}
+			}
+
+			if(psi2->pNextData==0) break;
+			psi2=psi2->pNextData;
+		}
+		psi2->pNextData=pUserProc;
+	}
+	else{
+		ppSubHash[key]=pUserProc;
+	}
+
+	return pUserProc;
+}
+
+void GetSubInfo(void){	//サブルーチン情報を取得
+	extern HANDLE hHeap;
+	extern char *basbuf;
+	int i,i2,i3;
+	char temporary[8192];
+
+	//Declare（DLL関数）情報を初期化
+	extern DllProc **ppDeclareHash;
+	ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *));
+
+	//サブルーチン（ユーザー定義）情報を初期化
+	extern GlobalProc **ppSubHash;
+	extern int SubNum;
+	ppSubHash=(GlobalProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(GlobalProc *));
+	SubNum=0;
+
+	//マクロ関数の名前リストを初期化
+	extern char **ppMacroNames;
+	extern int MacroNum;
+	ppMacroNames=(char **)HeapAlloc(hHeap,0,1);
+	MacroNum=0;
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	namespaceScopes.clear();
+
+	// Importsされた名前空間の管理
+	NamespaceScopesCollection &importedNamespaces = Smoothie::Temp::importedNamespaces;
+	importedNamespaces.clear();
+
+	i=-1;
+	while(1){
+		i++;
+
+		if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_INTERFACE)){
+			/*	Class ～ End Class
+				Interface ～ End Interface
+				を飛び越す			*/
+			i3=GetEndXXXCommand(basbuf[i+1]);
+			for(i+=2,i2=0;;i++,i2++){
+				if(basbuf[i]=='\0') break;
+				if(basbuf[i]==1&&basbuf[i+1]==(char)i3){
+					i++;
+					break;
+				}
+			}
+			if(basbuf[i]=='\0') break;
+			continue;
+		}
+
+		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 ){
+				SetError(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];
+			}
+			importedNamespaces.Imports( temporary );
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
+			importedNamespaces.clear();
+			continue;
+		}
+
+		if(basbuf[i]==1&&basbuf[i+1]==ESC_DECLARE){
+			for(i+=2,i2=0;;i2++,i++){
+				if(basbuf[i]=='\n'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+				if(basbuf[i]=='\0') break;
+			}
+			AddDeclareData(namespaceScopes,temporary,i);
+
+			continue;
+		}
+		if(basbuf[i]==1&&(basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION||basbuf[i+1]==ESC_MACRO)){
+			char statementChar = basbuf[i+1];
+
+			for(i2=0;;i2++,i++){
+				if(IsCommandDelimitation(basbuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+				if(basbuf[i]=='\0') break;
+			}
+			AddSubData(namespaceScopes, importedNamespaces, temporary,i,0,0);
+
+			/*	Sub ～ End Sub
+				Function ～ End Function
+				Macro ～ End Macro
+				を飛び越す			*/
+			char endStatementChar = GetEndXXXCommand( statementChar );
+			for(i2=0;;i++,i2++){
+				if( basbuf[i] == '\0' ) break;
+				if( basbuf[i] == 1 && basbuf[i+1] == endStatementChar ){
+					i++;
+					break;
+				}
+			}
+			if(basbuf[i]=='\0') break;
+			continue;
+		}
+
+		//次の行
+		for(;;i++){
+			if(IsCommandDelimitation(basbuf[i])) break;
+		}
+		if(basbuf[i]=='\0') break;
+	}
+
+	////////////
+	// 特殊関数
+	////////////
+	namespaceScopes.clear();
+	importedNamespaces.clear();
+
+	sprintf(temporary,"%c%c_allrem()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_aullrem()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_allmul()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_alldiv()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_aulldiv()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_allshl()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_allshr()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_aullshr()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+
+	sprintf(temporary,"%c%c_System_InitStaticLocalVariables()",1,ESC_SUB);
+	AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
+}
+void Delete_si(GlobalProc *pUserProc){
+	if(pUserProc->pNextData) Delete_si(pUserProc->pNextData);
+	delete pUserProc;
+}
+void DeleteSubInfo(GlobalProc **ppSubHash,char **ppMacroNames,int MacroNum){	//サブルーチン情報のメモリ解放
+	int i;
+	for(i=0;i<MAX_HASH;i++){
+		if(!ppSubHash[i]) continue;
+
+		Delete_si(ppSubHash[i]);
+	}
+	HeapDefaultFree(ppSubHash);
+
+	//マクロの名前リスト
+	if(ppMacroNames){
+		for(i=0;i<MacroNum;i++){
+			HeapDefaultFree(ppMacroNames[i]);
+		}
+		HeapDefaultFree(ppMacroNames);
+	}
+}
+void Delete_di(DllProc *pDllProc){
+	if(pDllProc->pNextData) Delete_di(pDllProc->pNextData);
+
+	delete pDllProc;
+}
+void DeleteDeclareInfo(void){
+	//DLL情報を解放
+	extern DllProc **ppDeclareHash;
+	int i;
+	for(i=0;i<MAX_HASH;i++){
+		if(!ppDeclareHash[i]) continue;
+
+		Delete_di(ppDeclareHash[i]);
+	}
+	HeapDefaultFree(ppDeclareHash);
+}
+
+
+
+///////////////////////
+// 関数ポインタの管理
+///////////////////////
+
+int AddProcPtrInfo( const string &typeExpression, int nowLine ){
+	DWORD dwProcType = (DWORD)typeExpression[2];
+	const string &paramStr = typeExpression.substr( 3 );
+
+	Procedure::Kind kind = Procedure::Sub;
+	if( dwProcType == ESC_FUNCTION ){
+		kind = Procedure::Function;
+	}
+
+	ProcPointer *pProcPointer = new ProcPointer( kind );
+
+	//buffer[0]は'('となっている
+	pProcPointer->SetParamsAndReturnType( paramStr.c_str(), nowLine );
+
+	Smoothie::Meta::procPointers.push_back( pProcPointer );
+
+	return (int)Smoothie::Meta::procPointers.size()-1;
+}
+void DeleteProcPtrInfo(void){
+	BOOST_FOREACH( ProcPointer *pProcPointer, Smoothie::Meta::procPointers ){
+		delete pProcPointer;
+	}
+
+	Smoothie::Meta::procPointers.clear();
+}
+
+
+
+bool IsNeedProcCompile(){
+	for(int i2=0;i2<MAX_HASH;i2++){
+		extern GlobalProc **ppSubHash;
+		GlobalProc *pUserProc=ppSubHash[i2];
+		while(pUserProc){
+			if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
+				return true;
+			}
+
+			pUserProc=pUserProc->pNextData;
+		}
+	}
+	return false;
+}
Index: /trunk/abdev/BasicCompiler_Common/Type.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Type.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Type.cpp	(revision 147)
@@ -0,0 +1,536 @@
+#include "common.h"
+
+const int Type::basicTypeList[] = {
+	DEF_BYTE,
+	DEF_SBYTE,
+	DEF_WORD,
+	DEF_INTEGER,
+	DEF_DWORD,
+	DEF_LONG,
+	DEF_QWORD,
+	DEF_INT64,
+
+	DEF_SINGLE,
+	DEF_DOUBLE,
+
+	DEF_BOOLEAN,
+
+	DEF_PTR_VOID,
+
+	DEF_ANY,
+
+	DEF_NON
+};
+
+const string Type::basicTypeNameList[] = {
+	"Byte",
+	"SByte",
+	"Word",
+	"Integer",
+	"DWord",
+	"Long",
+	"QWord",
+	"Int64",
+
+	"Single",
+	"Double",
+
+	"Boolean",
+
+	"VoidPtr",
+
+	"Any",
+
+	""
+};
+
+bool Type::StringToBasicType( const string &typeName, int &basicType ){
+	for( int i=0; ; i++ ){
+		if( basicTypeList[i] == DEF_NON ){
+			break;
+		}
+		if( basicTypeNameList[i] == typeName ){
+			basicType = basicTypeList[i];
+			return true;
+		}
+	}
+	return false;
+}
+bool Type::StringToType( const string &typeName, Type &type ){
+	type.index = -1;
+
+	if( typeName[0] == '*' ){
+		if( typeName.size() >= 3
+			&& typeName[1] == 1 && ( typeName[2] == ESC_FUNCTION || typeName[2] == ESC_SUB ) ){
+				//関数ポインタ（*Function）
+				type.basicType = DEF_PTR_PROC;
+				type.index = AddProcPtrInfo( typeName, cp );
+				return true;
+		}
+
+		const string &nextTypeName = typeName.substr( 1 );
+
+		if( !StringToType( nextTypeName, type ) ){
+			return false;
+		}
+
+		type.PtrLevelUp();
+
+		return true;
+	}
+
+	if( StringToBasicType( typeName, type.basicType ) ){
+		// 基本型だったとき
+		return true;
+	}
+
+
+	// Object型だったとき
+	if( typeName == "Object" ){
+		type.SetType( DEF_OBJECT, pobj_DBClass->GetObjectClassPtr() );
+		return true;
+	}
+
+	// String型だったとき
+	if( typeName == "String" ){
+		type.SetType( DEF_OBJECT, pobj_DBClass->GetStringClassPtr() );
+		return true;
+	}
+
+
+	////////////////////
+	// TypeDefされた型
+	////////////////////
+	int i=Smoothie::Meta::typeDefs.GetIndex( typeName );
+	if(i!=-1){
+		type = Smoothie::Meta::typeDefs[i].GetBaseType();
+		return true;
+	}
+
+	//クラス
+	const CClass *pobj_c = pobj_DBClass->Find( typeName );
+	if(pobj_c){
+		type.pClass = pobj_c;
+
+		if( pobj_c->IsStructure() ){
+			type.basicType = DEF_STRUCT;
+		}
+		else{
+			type.basicType = DEF_OBJECT;
+		}
+		return true;
+	}
+
+	return false;
+}
+
+int Type::GetBasicSize( int basicType )
+{
+
+	// 基本型
+	switch( basicType ){
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_BOOLEAN:
+			return sizeof(BYTE);
+
+		case DEF_INTEGER:
+		case DEF_WORD:
+			return sizeof(WORD);
+
+		case DEF_LONG:
+		case DEF_DWORD:
+			return sizeof(DWORD);
+
+		case DEF_INT64:
+		case DEF_QWORD:
+			return sizeof(_int64);
+
+		case DEF_DOUBLE:
+			return sizeof(double);
+		case DEF_SINGLE:
+			return sizeof(float);
+	}
+
+	// ポインタ
+	if(IsPtrType(basicType)){
+		return PTR_SIZE;
+	}
+
+	// オブジェクト
+	if(basicType==DEF_OBJECT){
+		return PTR_SIZE;
+	}
+
+	SetError();
+	return 0;
+}
+
+
+bool Type::Equals( const Type &type ) const
+{
+	if( basicType == type.basicType ){
+		if( NATURAL_TYPE( basicType ) == DEF_OBJECT
+			|| NATURAL_TYPE( basicType ) == DEF_STRUCT ){
+
+				if( index == type.index ){
+					return true;
+				}
+
+		}
+		else{
+			return true;
+		}
+	}
+	return false;
+}
+
+int Type::GetBasicSize() const
+{
+	return GetBasicSize( basicType );
+}
+int Type::GetSize() const
+{
+
+	// 基本型
+	switch( basicType ){
+		case DEF_LONG:
+			if(index==LITERAL_NULL||index==LITERAL_M128_0||index==LITERAL_0_255){
+				return sizeof(BYTE);
+			}
+			else if(index==LITERAL_M32768_0||index==LITERAL_0_65535){
+				return sizeof(WORD);
+			}
+			return sizeof(DWORD);
+
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_BOOLEAN:
+			return sizeof(BYTE);
+
+		case DEF_INTEGER:
+		case DEF_WORD:
+			return sizeof(WORD);
+
+		case DEF_DWORD:
+			return sizeof(DWORD);
+
+		case DEF_INT64:
+		case DEF_QWORD:
+			return sizeof(_int64);
+
+		case DEF_DOUBLE:
+			return sizeof(double);
+		case DEF_SINGLE:
+			return sizeof(float);
+	}
+
+	// ポインタ
+	if(IsPtrType(basicType)){
+		return PTR_SIZE;
+	}
+
+	// 構造体
+	if( basicType == DEF_STRUCT ){
+		if( !pClass ){
+			SetError();
+			return 0;
+		}
+
+		return pClass->GetSize();
+	}
+
+	// オブジェクト
+	if(basicType==DEF_OBJECT){
+		if( GetClass().IsInterface() ){
+			// vtblOffsetのサイズを含める
+			return PTR_SIZE*2;
+		}
+		return PTR_SIZE;
+	}
+
+	SetError();
+	return 0;
+}
+
+bool Type::IsNull() const{
+  if( basicType == DEF_NON ){
+	  return true;
+  }
+  return false;
+}
+
+bool Type::IsByte() const{
+  if( basicType == DEF_BYTE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsSByte() const{
+  if( basicType == DEF_SBYTE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsWord() const{
+  if( basicType == DEF_WORD ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsInteger() const{
+  if( basicType == DEF_INTEGER ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsDWord() const{
+  if( basicType == DEF_DWORD ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsLong() const{
+  if( basicType == DEF_LONG ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsQWord() const{
+  if( basicType == DEF_QWORD ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsInt64() const{
+  if( basicType == DEF_INT64 ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsSingle() const{
+  if( basicType == DEF_SINGLE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsDouble() const{
+  if( basicType == DEF_DOUBLE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsBoolean() const{
+  if( basicType == DEF_BOOLEAN ){
+	  return true;
+  }
+  return false;
+}
+
+bool Type::IsPointer() const
+{
+	if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
+		|| ( basicType & FLAG_PTR ) ){
+			return true;
+	}
+
+	return false;
+}
+bool Type::IsSigned() const
+{
+	switch( basicType ){
+		case DEF_SBYTE:
+		case DEF_INTEGER:
+		case DEF_LONG:
+		case DEF_INT64:
+		case DEF_SINGLE:
+		case DEF_DOUBLE:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::IsNaturalWhole() const
+{
+	switch( basicType ){
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_INTEGER:
+		case DEF_WORD:
+		case DEF_LONG:
+		case DEF_DWORD:
+		case DEF_INT64:
+		case DEF_QWORD:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::IsWhole() const
+{
+	return (
+		IsNaturalWhole()
+		|| IsPtrType( basicType )
+		|| basicType == DEF_BOOLEAN
+		);
+}
+bool Type::IsReal() const
+{
+	switch( basicType ){
+		case DEF_SINGLE:
+		case DEF_DOUBLE:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::Is64() const
+{
+	switch( basicType ){
+		case DEF_QWORD:
+		case DEF_INT64:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::IsProcPtr() const
+{
+	if( basicType == DEF_PTR_PROC ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsStruct() const
+{
+	if( basicType == DEF_STRUCT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsStructPtr() const
+{
+	if( basicType == DEF_PTR_STRUCT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsObject() const
+{
+	if( basicType == DEF_OBJECT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsObjectPtr() const
+{
+	if( basicType == DEF_PTR_OBJECT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsObjectClass() const
+{
+	if( basicType == DEF_OBJECT ){
+		if( pClass->GetName() == "Object" ){
+			return true;
+		}
+	}
+	return false;
+}
+bool Type::IsStringClass() const
+{
+	if( basicType == DEF_OBJECT ){
+		if( pClass->GetName() == "String" ){
+			return true;
+		}
+	}
+	return false;
+}
+bool Type::IsVoidPtr() const
+{
+	if( basicType == DEF_PTR_VOID ){
+		return true;
+	}
+	return false;
+}
+
+bool Type::IsAny() const
+{
+	if( basicType == DEF_ANY ){
+		return true;
+	}
+	return false;
+}
+
+bool Type::HasMember() const
+{
+	if( NATURAL_TYPE( basicType ) == DEF_OBJECT
+		|| NATURAL_TYPE( basicType ) == DEF_STRUCT ){
+			return true;
+	}
+	return false;
+}
+
+const string Type::ToString() const
+{
+	if( PTR_LEVEL( basicType ) ){
+		//ポインタレベルが1以上の場合
+		Type type( *this );
+		type.PtrLevelDown();
+
+		return (string)"*" + type.ToString();
+	}
+	else if( IsObject() || IsStruct() ){
+		//オブジェクトまたは構造体
+
+		if( !( index == 0 || index == -1 ) ){
+			if( pClass->GetNamespaceScopes().size() >= 1 )
+			{
+				return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName();
+			}
+			return pClass->GetName();
+		}
+	}
+	else if( IsProcPtr() ){
+		if( index == 0 || index == -1 ){
+			return "VoidPtr";
+		}
+		else{
+			if( Smoothie::Meta::procPointers[index]->ReturnType().IsNull() ){
+				return "*Sub";
+			}
+			return "*Function";
+		}
+	}
+	else{
+		// 基本型
+
+		for( int i=0; ; i++ ){
+			if( basicTypeList[i] == DEF_NON ){
+				break;
+			}
+			if( basicTypeList[i] == basicType ){
+				return basicTypeNameList[i];
+			}
+		}
+	}
+
+	extern int cp;
+	SetError(1,NULL,cp);
+
+	return (string)"(null)";
+}
+
+Type Type::String(){
+	return Type( DEF_OBJECT, *pobj_DBClass->GetStringClassPtr() );
+}
+
+const string BlittableType::GetCreateStaticMethodFullName() const
+{
+	return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName() + "._Create";
+}
Index: /trunk/abdev/BasicCompiler_Common/Type.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Type.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Type.h	(revision 147)
@@ -0,0 +1,191 @@
+#pragma once
+
+class CClass;
+
+class Type{
+	int basicType;
+	union{
+		LONG_PTR index;
+		const CClass *pClass;
+	};
+
+public:
+	static int GetBasicSize( int basicType );
+
+	Type():
+	  basicType( DEF_NON ),
+	  index( -1 ){}
+	Type( int basicType ):
+	  basicType( basicType ),
+	  index( -1 ){}
+
+	Type( int basicType, LONG_PTR index ):
+	  basicType( basicType ),
+	  index( index ){}
+
+	Type( int basicType, const CClass &objClass ):
+	  basicType( basicType ),
+	  index( (LONG_PTR)&objClass ){}
+
+	Type( const Type &type ):
+	  basicType( type.basicType ),
+	  index( type.index ){}
+
+	__inline int GetBasicType() const
+	{
+		return basicType;
+	}
+	LONG_PTR GetIndex() const
+	{
+		return index;
+	}
+	const CClass &GetClass() const
+	{
+		return *pClass;
+	}
+
+	void SetBasicType( int basicType ){
+		this->basicType = basicType;
+	}
+	void SetIndex( LONG_PTR index ){
+		this->index = index;
+	}
+	void SetNull(){
+		SetBasicType( DEF_NON );
+		SetIndex( -1 );
+	}
+	void SetType( int basicType, LONG_PTR index ){
+		SetBasicType( basicType );
+		SetIndex( index );
+	}
+	void SetType( int basicType, const CClass *pClass ){
+		SetBasicType( basicType );
+		this->pClass = pClass;
+	}
+
+	int PtrLevel() const
+	{
+		return PTR_LEVEL( basicType );
+	}
+	void PtrLevelUp(){
+		PTR_LEVEL_UP( basicType );
+	}
+	void PtrLevelDown(){
+		PTR_LEVEL_DOWN( basicType );
+	}
+
+	bool Equals( const Type &type ) const;
+
+	int GetBasicSize() const;
+	int GetSize() const;
+
+	bool IsNull() const;
+
+	bool IsByte() const;
+	bool IsSByte() const;
+	bool IsWord() const;
+	bool IsInteger() const;
+	bool IsDWord() const;
+	bool IsLong() const;
+	bool IsQWord() const;
+	bool IsInt64() const;
+	bool IsSingle() const;
+	bool IsDouble() const;
+	bool IsBoolean() const;
+
+	bool IsPointer() const;
+	bool IsSigned() const;
+	bool IsNaturalWhole() const;
+	bool IsWhole() const;
+	bool IsReal() const;
+	bool Is64() const;
+	bool IsProcPtr() const;
+	bool IsStruct() const;
+	bool IsStructPtr() const;
+	bool IsObject() const;
+	bool IsObjectPtr() const;
+	bool IsObjectClass() const;
+	bool IsStringClass() const;
+	bool IsVoidPtr() const;
+	bool IsAny() const;
+
+	// オブジェクトや構造体など、メンバを持つ型かどうかを判別する
+	bool HasMember() const;
+
+	const string ToString() const;
+
+	void operator= ( const Type &type ){
+		basicType = type.basicType;
+		index = type.index;
+	}
+
+	static Type String();
+
+
+private:
+	static const int basicTypeList[];
+	static const string basicTypeNameList[];
+public:
+	static bool StringToBasicType( const string &typeName, int &basicType );
+	static bool StringToType( const string &typeName, Type &type );
+};
+
+class BlittableType
+{
+	Type basicType;
+	CClass *pClass;
+public:
+	BlittableType( const Type &basicType, CClass *pClass )
+		: basicType( basicType )
+		, pClass( pClass )
+	{
+	}
+	BlittableType(){}
+	const Type &GetBasicType() const
+	{
+		return basicType;
+	}
+	const CClass *GetClassPtr() const
+	{
+		return pClass;
+	}
+	const string GetCreateStaticMethodFullName() const;
+};
+class BlittableTypes : public vector<BlittableType>
+{
+public:
+	bool IsExist( Type type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		BOOST_FOREACH( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return true;
+			}
+		}
+		return false;
+	}
+	const BlittableType &Find( const Type &type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		BOOST_FOREACH( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return blittableType;
+			}
+		}
+		throw "Blittable型ではない";
+	}
+	const CClass *GetClassPtr( const Type &type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		BOOST_FOREACH( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return blittableType.GetClassPtr();
+			}
+		}
+		return NULL;
+	}
+	const CClass &GetClass( const Type &type ) const
+	{
+		return *GetClassPtr( type );
+	}
+};
Index: /trunk/abdev/BasicCompiler_Common/TypeDef.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/TypeDef.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/TypeDef.cpp	(revision 147)
@@ -0,0 +1,239 @@
+#include "common.h"
+
+
+TypeDef::TypeDef( const NamespaceScopes &namespaceScopes, const string &name, const string &baseName )
+	: namespaceScopes( namespaceScopes )
+	, name( name )
+	, baseName( baseName )
+{
+	if( !Type::StringToType( baseName, baseType ) ){
+		SetError(3, baseName, cp );
+		return;
+	}
+}
+TypeDef::~TypeDef(){
+}
+
+bool TypeDef::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	if( GetName() != name ){
+		return false;
+	}
+	return NamespaceScopes::IsSameArea( this->namespaceScopes, namespaceScopes );
+}
+bool TypeDef::IsEqualSymbol( const string &fullName ) const
+{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	if( IsEqualSymbol( NamespaceScopes( AreaName ), NestName ) ){
+		return true;
+	}
+
+	if( isNest ){
+		// 静的メンバを考慮
+
+		char AreaName2[VN_SIZE] = "";		//オブジェクト変数
+		char NestName2[VN_SIZE] = "";		//入れ子メンバ
+		bool isNest = SplitMemberName( AreaName, AreaName2, NestName2 );
+		lstrcat( NestName2, "." );
+		lstrcat( NestName2, NestName );
+
+		return IsEqualSymbol( NamespaceScopes( AreaName2 ), NestName2 );
+	}
+
+	return false;
+}
+
+
+
+TypeDefCollection::TypeDefCollection(){
+}
+TypeDefCollection::~TypeDefCollection(){
+}
+void TypeDefCollection::Add( const NamespaceScopes &namespaceScopes, const string &name, const string &baseName ){
+	TypeDef typeDef( namespaceScopes, name, baseName );
+	this->push_back( typeDef );
+}
+int TypeDefCollection::GetIndex( const NamespaceScopes &namespaceScopes, const string &name ) const{
+	int max = (int)(*this).size();
+	for( int i=0; i<max; i++ ){
+		if( (*this)[i].IsEqualSymbol( namespaceScopes, name ) ){
+			return i;
+		}
+	}
+	return -1;
+}
+int TypeDefCollection::GetIndex( const string &fullName ) const{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	return GetIndex( NamespaceScopes( AreaName ), NestName );
+}
+
+void TypeDefCollection::Add( const NamespaceScopes &namespaceScopes, const string &expression, int nowLine ){
+	int i;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(expression[i]=='='||expression[i]=='\0'){
+			temporary[i]=0;
+			break;
+		}
+		temporary[i]=expression[i];
+	}
+
+	if(expression[i]!='='){
+		SetError(10,"TypeDef",nowLine);
+		return;
+	}
+
+	const char *pTemp=expression.c_str()+i+1;
+
+	//識別文字のエラーチェック（新しい型）
+	i=0;
+	for(;;i++){
+		if(temporary[i]=='\0') break;
+		if(!IsVariableChar(temporary[i])){
+			SetError(10,"TypeDef",nowLine);
+			return;
+		}
+	}
+
+	//識別文字のエラーチェック（コピー元の型）
+	if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){
+		//関数ポインタ
+		if(pTemp[3]!='('){
+			SetError(10,"TypeDef",nowLine);
+			return;
+		}
+	}
+	else{
+		i=0;
+		while(pTemp[i]=='*') i++;
+		for(;;i++){
+			if(pTemp[i]=='\0') break;
+			if(!IsVariableChar(pTemp[i])){
+				SetError(10,"TypeDef",nowLine);
+				return;
+			}
+		}
+	}
+
+	//識別子が重複している場合はエラーにする
+	if(lstrcmp(temporary,pTemp)==0){
+		SetError(1,NULL,nowLine);
+		return;
+	}
+
+
+
+	//////////////////////////
+	// TypeDef情報を追加
+	//////////////////////////
+
+	//エラー用
+	extern int cp;
+	cp = nowLine;
+
+	Add( namespaceScopes, temporary, pTemp );
+}
+
+void TypeDefCollection::Init(){
+	// 初期化
+	clear();
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+	namespaceScopes.clear();
+
+	// Importsされた名前空間の管理
+	NamespaceScopesCollection &importedNamespaces = Smoothie::Temp::importedNamespaces;
+	importedNamespaces.clear();
+
+	int i=-1, i2;
+	char temporary[VN_SIZE];
+	while(1){
+		extern char *basbuf;
+
+		i++;
+
+		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 ){
+				SetError(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];
+			}
+			importedNamespaces.Imports( temporary );
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
+			importedNamespaces.clear();
+			continue;
+		}
+
+		if( basbuf[i]==1 ){
+			char temporary[VN_SIZE];
+			if(basbuf[i+1]==ESC_TYPEDEF){
+				int i2 = 0;
+				for(i+=2;;i2++,i++){
+					if(basbuf[i]=='\n'){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+					if(basbuf[i]=='\0') break;
+				}
+				Add( namespaceScopes, temporary, i );
+
+				continue;
+			}
+			else if( basbuf[i+1] == ESC_CONST && basbuf[i+2] == 1 && basbuf[i+3] == ESC_ENUM ){
+				int i2 = 0;
+				for(i+=4;;i2++,i++){
+					if(!IsVariableChar(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+					if(basbuf[i]=='\0') break;
+				}
+				Add( namespaceScopes, temporary, "Long" );
+			}
+		}
+
+		//次の行
+		for(;;i++){
+			if(IsCommandDelimitation(basbuf[i])) break;
+		}
+		if(basbuf[i]=='\0') break;
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/TypeDef.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/TypeDef.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/TypeDef.h	(revision 147)
@@ -0,0 +1,55 @@
+#pragma once
+
+#include <vector>
+#include <string>
+
+#include "../Type.h"
+
+using namespace std;
+
+class TypeDefCollection;
+
+class TypeDef{
+	friend TypeDefCollection;
+
+	NamespaceScopes namespaceScopes;
+
+	string name;
+	string baseName;
+	Type baseType;
+public:
+	TypeDef( const NamespaceScopes &namespaceScopes, const string &name, const string &baseName );
+	~TypeDef();
+
+	const string &GetName() const
+	{
+		return name;
+	}
+	const string &GetBaseName() const
+	{
+		return baseName;
+	}
+	const Type &GetBaseType() const
+	{
+		return baseType;
+	}
+
+	bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
+	bool IsEqualSymbol( const string &name ) const;
+};
+
+class TypeDefCollection : public vector<TypeDef>
+{
+public:
+	TypeDefCollection();
+	~TypeDefCollection();
+
+	void Add( const NamespaceScopes &namespaceScopes, const string &name, const string &baseName );
+	int GetIndex( const NamespaceScopes &namespaceScopes, const string &name ) const;
+	int GetIndex( const string &fullName ) const;
+
+private:
+	void Add( const NamespaceScopes &namespaceScopes, const string &expression, int nowLine );
+public:
+	void Init();
+};
Index: /trunk/abdev/BasicCompiler_Common/VarList.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/VarList.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/VarList.cpp	(revision 147)
@@ -0,0 +1,1334 @@
+#include "../BasicCompiler_Common/common.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+//変数リストのツリーハンドル
+HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
+
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts);
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr);
+void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,const char *VarName,const Type &type,LONG_PTR offset){
+	extern HANDLE hDebugProcess;
+	int i2;
+	char temporary[255],temp2[255];
+	LONG_PTR pData;
+	SIZE_T accessBytes;
+	double dbl;
+	float flt;
+	WORD wData;
+	BYTE byteData;
+	HTREEITEM hParent;
+	_int64 i64data;
+
+	if( type.IsObject() || type.IsStruct() ){
+		i2=1;
+		if( type.IsObject() ){
+			// 参照型ということを考慮する
+			i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
+			offset = pData;
+		}
+
+		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(ULONG_PTR)offset);
+		lptv->item.iImage=1;
+		lptv->item.iSelectedImage=1;
+		hParent=TreeView_InsertItem(hVarTree,lptv);
+
+		if(i2 && offset) VarList_Member(hVarTree,hParent,offset,type.GetClass(),0);
+		return;
+	}
+	else if( type.IsObjectPtr() || type.IsStructPtr() ){
+		i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
+
+		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(ULONG_PTR)pData);
+		lptv->item.iImage=4;
+		lptv->item.iSelectedImage=4;
+		hParent=TreeView_InsertItem(hVarTree,lptv);
+
+		if(i2) VarList_Member(hVarTree,hParent,pData,type.GetClass(),1);
+		return;
+	}
+	else{
+		if(type.GetBasicType()==MAKE_PTR_TYPE(DEF_SBYTE,1)||type.GetBasicType()==MAKE_PTR_TYPE(DEF_BYTE,1)){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes)){
+				for(i2=0;;i2++){
+					if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],1,&accessBytes)){
+						i2=-1;
+						break;
+					}
+					if(temporary[i2]=='\0') break;
+					if(i2==64){
+						lstrcpy(temporary+i2,"...");
+						break;
+					}
+				}
+				if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData);
+				else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsDouble()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsSingle()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsInt64()){
+			_int64 i64data;
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				_i64toa(i64data,temporary,10);
+				_i64toa(i64data,temp2,16);
+				CharUpper(temp2);
+				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsQWord()||(type.IsPointer()&&PTR_SIZE==sizeof(_int64))){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				_ui64toa(i64data,temporary,10);
+				_ui64toa(i64data,temp2,16);
+				CharUpper(temp2);
+				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsLong()){
+			long l;
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&l,sizeof(long),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,l,l);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsDWord()||(type.IsPointer()&&PTR_SIZE==sizeof(long))){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,(int)i64data,(int)i64data);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsInteger()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsWord()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsSByte()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				temporary[0]=byteData;
+				temporary[1]=0;
+				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsByte()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				temporary[0]=byteData;
+				temporary[1]=0;
+				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsBoolean()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				if( byteData ) lstrcpy( temporary, "True" );
+				else lstrcpy( temporary, "False" );
+
+				wsprintf(lptv->item.pszText,"%s %s",VarName,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		lptv->item.iImage=2;
+		lptv->item.iSelectedImage=2;
+	}
+	TreeView_InsertItem(hVarTree,lptv);
+}
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr){
+	char VarData[VN_SIZE],VarName[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=hParent;
+	tv.item.pszText=VarData;
+
+	BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
+		if(bPtr){
+			lstrcpy(VarName,"->");
+			lstrcat(VarName,pMember->GetName().c_str());
+		}
+		else{
+			lstrcpy(VarName,".");
+			lstrcat(VarName,pMember->GetName().c_str());
+		}
+
+		LONG_PTR offset;
+		int i2;
+		offset=objClass.GetMemberOffset( pMember->GetName().c_str(), &i2 );
+
+		if(pMember->SubScripts[0]!=-1){
+			//構造体内の配列
+			sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree,&tv);
+
+			VarList_Array(hVarTree,hParent,
+				pTopOffset+offset,
+				pMember->GetType(),
+				pMember->SubScripts);
+		}
+		else{
+			//メンバ変数
+			VarList_Insert(hVarTree,
+				&tv,
+				VarName,
+				pMember->GetType(),
+				pTopOffset+offset);
+		}
+	}
+}
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts ){
+	int i,i2,i3,ElementNum,MemCounter,UseCount[255];
+	char temporary[VN_SIZE],temp2[DIGIT_SIZE];
+
+	TV_INSERTSTRUCT tv;
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=hParent;
+	tv.item.pszText=temporary;
+
+	for(i=0;i<255;i++){
+		if(SubScripts[i]==-1) break;
+		UseCount[i]=0;
+	}
+	UseCount[i]=-2;
+	MemCounter=0;
+	while(1){
+		UseCount[i]++;
+		for(ElementNum=0;SubScripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
+			UseCount[i-ElementNum]=0;
+			if(i-ElementNum-1<0) return MemCounter;
+			UseCount[i-ElementNum-1]++;
+		}
+
+		if(MemCounter<50){
+			temporary[0]='[';
+			temporary[1]=0;
+			for(i2=0;i2<i;i2++){
+				sprintf(temp2,"%d",UseCount[i2]);
+				lstrcat(temporary,temp2);
+				lstrcat(temporary,",");
+			}
+			i3=lstrlen(temporary);
+			temporary[i3-1]=']';
+			temporary[i3]=0;
+
+			VarList_Insert(hVarTree,&tv,temporary,type,
+				offset+MemCounter*type.GetSize());
+		}
+
+		MemCounter++;
+		if(MemCounter==50){
+			lstrcpy(tv.item.pszText,"...");
+			TreeView_InsertItem(hVarTree,&tv);
+		}
+	}
+	return 0;
+}
+void RefreshGlobalVar(void){
+	extern DWORD ImageBase;
+	char temporary[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+	HTREEITEM hParent;
+
+	TreeView_DeleteAllItems(hVarTree_Global);
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=TVI_ROOT;
+	tv.item.pszText=temporary;
+
+	extern HANDLE hDebugProcess;
+	extern int MemPos_RWSection;
+
+	foreach( Variable *pVar, globalVars ){
+
+		//スコープ外の場合は無視
+		if(pVar->ScopeLevel!=0){
+			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0]  &&
+				pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
+				//範囲内
+			}
+			else{
+				//範囲外
+				continue;
+			}
+		}
+
+
+		if(!pobj_nv->bShow_DefaultSystem_Var){
+			if(memcmp(pVar->GetName().c_str(),"_System_",8)==0||
+				memcmp(pVar->GetName().c_str(),"_DebugSys_",10)==0||
+				memcmp(pVar->GetName().c_str(),"_PromptSys_",11)==0) continue;
+		}
+		if(!pobj_nv->bShow_Rad_Var){
+			if(memcmp(pVar->GetName().c_str(),"_RadSys_",8)==0) continue;
+		}
+		if(!pobj_nv->bShow_GUID_Var){
+			if(memcmp(pVar->GetName().c_str(),"GUID_",5)==0||
+				memcmp(pVar->GetName().c_str(),"IID_",4)==0||
+				memcmp(pVar->GetName().c_str(),"CLSID_",6)==0) continue;
+		}
+
+		//静的メンバ
+		if(strstr(pVar->GetName().c_str(),".")) continue;
+
+		if(pVar->IsArray()){
+			sprintf(temporary,"%s %s(&H%X)",
+				pVar->GetName().c_str(),
+				STRING_ARRAY,
+				ImageBase+MemPos_RWSection+pVar->offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_Global,&tv);
+
+			VarList_Array(hVarTree_Global,hParent,
+				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
+				*pVar,
+				pVar->GetSubScriptsPtr());
+		}
+		else{
+			VarList_Insert(hVarTree_Global,
+				&tv,
+				pVar->GetName().c_str(),
+				*pVar,
+				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset));
+		}
+	}
+}
+void RefreshLocalVar(void){
+	int i2,i3,sw;
+	char temporary[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+	HTREEITEM hParent;
+	LONG_PTR offset;
+	SIZE_T accessBytes;
+	LONG_PTR lpData;
+
+	TreeView_DeleteAllItems(hVarTree_Local);
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=TVI_ROOT;
+	tv.item.pszText=temporary;
+
+	extern HANDLE hDebugProcess;
+	extern HWND hDebugWnd;
+	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+	i2=pobj_dti->iProcLevel-i2;
+
+	if(pobj_dti->lplpSpBase[i2]==0) return;
+
+	extern GlobalProc **ppSubHash;
+	GlobalProc *pUserProc;
+	for(i3=0,sw=0;i3<MAX_HASH;i3++){
+		pUserProc=ppSubHash[i3];
+		while(pUserProc){
+			if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
+				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
+				sw=1;
+				break;
+			}
+
+			pUserProc=pUserProc->pNextData;
+		}
+		if(sw) break;
+	}
+	if(!pUserProc) return;
+
+	foreach( Variable *pVar, pUserProc->localVars ){
+
+		//スコープ外の場合は無視
+		if(pVar->ScopeLevel!=0){
+			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2]  &&
+				pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
+				//範囲内
+			}
+			else{
+				//範囲外
+				continue;
+			}
+		}
+
+		if(pVar->IsArray()){
+			sprintf(temporary,"%s %s(&H%X)",
+				pVar->GetName().c_str(),
+				STRING_ARRAY,
+				pobj_dti->lplpSpBase[i2]+pVar->offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_Local,&tv);
+
+			VarList_Array(hVarTree_Local,hParent,
+				pobj_dti->lplpSpBase[i2]+pVar->offset,
+				*pVar,
+				pVar->GetSubScriptsPtr());
+		}
+		else{
+			offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
+			if(pVar->IsRef()){
+				ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&accessBytes);
+				offset=lpData;
+			}
+			VarList_Insert(hVarTree_Local,&tv,
+				pVar->GetName().c_str(),
+				*pVar,
+				offset);
+		}
+	}
+
+
+
+	/////////////////////////////
+	// Thisオブジェクトのリスト
+	/////////////////////////////
+
+	TreeView_DeleteAllItems(hVarTree_This);
+	if(!pUserProc->GetParentClassPtr()) return;
+
+	//Thisポインタを取得
+	LONG_PTR pThis;
+	const Variable *pVar = pUserProc->localVars.Find( Symbol( "_System_LocalThis" ) );
+	if( !pVar ){
+		return;
+	}
+	lpData=pobj_dti->lplpSpBase[i2]+pVar->offset;
+	ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&accessBytes);
+
+	BOOST_FOREACH( CMember *pMember, pUserProc->GetParentClassPtr()->GetDynamicMembers() ){
+		offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pMember->GetName().c_str(),&i2);
+
+		if(pMember->SubScripts[0]!=-1){
+			//配列
+			sprintf(temporary,"%s %s(&H%X)",
+				pMember->GetName().c_str(),
+				STRING_ARRAY,
+				(ULONG_PTR)offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_This,&tv);
+
+			VarList_Array(hVarTree_This,hParent,
+				pThis+offset,
+				pMember->GetType(),
+				pMember->SubScripts);
+		}
+		else{
+			VarList_Insert(hVarTree_This,&tv,
+				pMember->GetName().c_str(),
+				pMember->GetType(),
+				pThis+offset);
+		}
+	}
+}
+void RefreshGlobalVar_with_WindowLock(void){
+	extern HWND hDebugWnd;
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+
+	//リフレッシュ
+	RefreshGlobalVar();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+}
+void RefreshLocalVar_with_WindowLock(void){
+	extern HWND hDebugWnd;
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
+
+	//リフレッシュ
+	RefreshLocalVar();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
+}
+
+void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
+	char temporary[255],temp2[255];
+
+	//エスケープシーケンスをセット
+	SetEscapeSequenceFormat(buffer);
+
+	KillStringSpaces(buffer);
+
+	//カッコを相互チェック
+	if(!CheckParenthesis2(buffer)){
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+		return;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type resultType;
+	bool isMemoryAccessError;
+	if( !StaticCalculation(true, buffer,0,&i64data,resultType,1,&isMemoryAccessError) ){
+		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+	}
+	else if(isMemoryAccessError){
+		ListView_SetItemText(hListView,iItem,1,"アクセスできません");
+	}
+	else{
+		if(resultType.IsReal()){
+			memcpy(&dbl,&i64data,sizeof(double));
+			sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
+		}
+		else if(resultType.Is64()){
+			_i64toa(i64data,temporary,10);
+			_i64toa(i64data,temp2,16);
+			CharUpper(temp2);
+			sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
+		}
+		else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
+
+		ListView_SetItemText(hListView,iItem,1,temporary);
+	}
+}
+void RefreshWatchList(void){
+	extern HWND hDebugWnd;
+	HWND hListView;
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
+	i2=ListView_GetItemCount(hListView);
+	for(i=0;i<i2-1;i++){
+		ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+
+		//演算結果を表示
+		SetCalcToWatchList(hListView,i,temporary);
+	}
+}
+
+BOOL SetDebugProcCombo(HWND hProcCombo){
+	int i2,i3;
+	char temporary[255];
+
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+
+	//行番号情報
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+		for(i2=0;i2<MaxLineInfoNum-1;i2++){
+			if((ULONG_PTR)(pLineInfo[i2].TopObp+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
+				pobj_dti->lplpObp[i3]<=(ULONG_PTR)(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
+		}
+		if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
+		else pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
+	}
+	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+		if(pobj_dti->lpdwCp[i3]==-1){
+			pobj_dti->iProcLevel--;
+			for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
+				pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
+				pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
+				pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
+			}
+			i3--;
+			continue;
+		}
+	}
+
+	if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
+		extern HWND hMainDlg;
+		//"デバッグ情報の取得に失敗"
+		MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
+		return 0;
+	}
+	ShowErrorLine(i2,temporary);
+
+	//プロシージャ コンボボックス
+	extern GlobalProc **ppSubHash;
+	GlobalProc *pUserProc;
+	int sw;
+	SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
+	for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
+		for(i3=0,sw=0;i3<MAX_HASH;i3++){
+			pUserProc=ppSubHash[i3];
+			while(pUserProc){
+				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
+					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
+						lstrcpy(temporary,pUserProc->GetName().c_str());
+						sw=1;
+						break;
+				}
+				pUserProc=pUserProc->pNextData;
+			}
+			if(sw) break;
+		}
+		if(!pUserProc){
+			if(i2==0){
+				lstrcpy(temporary,"Global");
+				pobj_dti->lplpSpBase[i2]=0;
+			}
+			else lstrcpy(temporary,"error");
+		}
+		SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
+	}
+	SendMessage(hProcCombo,CB_SETCURSEL,0,0);
+
+	return pobj_dti->iProcLevel;
+}
+
+//IDC_THREADCOMBOプロシージャ
+LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldThreadComboProc;
+	int i2;
+	DWORD dwThreadID;
+	char temporary[255];
+
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
+				sscanf(temporary+2,"%X",&dwThreadID);
+
+				extern DWORD _DebugSys_dwThreadID[256];
+				i2=0;
+				while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
+
+				//次回のステップ実行対象を指定
+				extern int NextStepThreadNum;
+				NextStepThreadNum=i2;
+
+				//スレッド情報をリフレッシュ
+				pobj_dti->Reflesh(i2);
+
+				SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
+
+				SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
+			}
+			break;
+	}
+	return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
+}
+//IDC_PROCCOMBOプロシージャ
+LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldProcComboProc;
+	int i2,i3;
+	char temporary[MAX_PATH];
+
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
+				GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
+				ShowErrorLine(i3,temporary);
+
+				RefreshLocalVar_with_WindowLock();
+			}
+			break;
+	}
+	return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
+}
+void InitVarList(DWORD dwThreadId){
+	extern HWND hDebugWnd;
+	int i2,i3,i5;
+	char temporary[255];
+
+
+	//スレッド
+	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
+	extern DWORD _DebugSys_dwThreadID[256];
+	for(i2=0;i2<256;i2++){
+		if(_DebugSys_dwThreadID[i2]){
+			sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
+			SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
+			if(_DebugSys_dwThreadID[i2]==dwThreadId){
+				extern int NextStepThreadNum;
+				NextStepThreadNum=i2;
+			}
+		}
+	}
+	sprintf(temporary,"&H%08X",dwThreadId);
+	i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
+	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
+
+	i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
+
+
+	///////////////////////////////////////////////
+	// 実行中のプロシージャのローカル変数をセット
+	///////////////////////////////////////////////
+
+	int sw;
+
+	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+	i2=pobj_dti->iProcLevel-i2;
+
+	if(pobj_dti->lplpSpBase[i2]){
+		extern GlobalProc **ppSubHash;
+		GlobalProc *pUserProc;
+		for(i3=0,sw=0;i3<MAX_HASH;i3++){
+			pUserProc=ppSubHash[i3];
+			while(pUserProc){
+				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
+					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
+					sw=1;
+					break;
+				}
+
+				pUserProc=pUserProc->pNextData;
+			}
+			if(sw) break;
+		}
+
+
+		if(pUserProc){
+			pobj_CompilingClass = pUserProc->GetParentClassPtr();
+			UserProc::CompileStartForUserProc( pUserProc );
+		}
+	}
+
+
+	////////////////////////
+	// 変数リストを再表示
+	////////////////////////
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
+
+	//リフレッシュ
+	RefreshLocalVar();
+	RefreshGlobalVar();
+	RefreshWatchList();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
+}
+
+
+
+
+//////////////////////////////////////
+// エディタに埋め込み表示のデバッガ
+//////////////////////////////////////
+
+BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+
+	//デバッガ用ツールバー
+#define BMPNUM_DEBUGGERTOOLBAR 3
+#define BTNNUM_DEBUGGERTOOLBAR 4
+	TBBUTTON DebuggerToolBar[]={
+		{0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+		{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
+		{1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+		{2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+	};
+	TOOLTIPTEXT *pTipText;
+
+	static HIMAGELIST hImageList,hImageList_Disabled;
+
+	switch(message){
+		case WM_INITDIALOG:
+			//ツールバーを生成
+			extern HWND hDebuggerToolbar;
+			hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
+				NULL,
+				0,0,0,
+				DebuggerToolBar,
+				BTNNUM_DEBUGGERTOOLBAR,	/*アイテムの個数*/
+				0,0,16,15,sizeof(TBBUTTON));
+
+			hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
+				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+			SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
+			hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
+				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+			SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_DEBUG_START:
+					DestroyWindow(GetParent(hwnd));
+					return 1;
+				case IDC_DEBUG_STEPIN:
+					dwStepRun=1;
+					return 1;
+				case IDC_DEBUG_STEPOVER:
+					dwStepRun=2;
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			pTipText=(TOOLTIPTEXT *)lParam;
+			if(pTipText->hdr.code==TTN_NEEDTEXT){
+				//ツールチップを表示
+				switch(pTipText->hdr.idFrom){
+					case IDC_DEBUG_START:
+						pTipText->lpszText="実行";
+						break;
+					case IDC_DEBUG_STEPOVER:
+						pTipText->lpszText="ステップ アウト";
+						break;
+					case IDC_DEBUG_STEPIN:
+						pTipText->lpszText="ステップ イン";
+						break;
+				}
+			}
+			break;
+		case WM_SIZE:
+			MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
+			return 1;
+
+		case WM_DESTROY:
+			ImageList_Destroy(hImageList);
+			ImageList_Destroy(hImageList_Disabled);
+			return 1;
+	}
+	return 0;
+}
+
+WNDPROC OldTabProc;
+LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+
+	static HMENU hDummyMenu,hMenu=0;
+
+	switch(message){
+		case WM_CONTEXTMENU:
+			if(hMenu==0){
+				hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
+				hMenu=GetSubMenu(hDummyMenu,0);
+			}
+
+			MENUITEMINFO mi;
+			mi.cbSize=sizeof(MENUITEMINFO);
+			mi.fMask=MIIM_STATE;
+			mi.fState=MFS_CHECKED;
+
+			if(pobj_nv->bShow_DefaultSystem_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+			if(pobj_nv->bShow_Rad_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+			if(pobj_nv->bShow_GUID_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+
+			TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+
+			break;
+		case WM_COMMAND:
+			mi.cbSize=sizeof(MENUITEMINFO);
+			mi.fMask=MIIM_STATE;
+			switch(LOWORD(wParam)){
+				case IDM_SHOW_DEFAULTSYSTEM_VAR:
+					if(pobj_nv->bShow_DefaultSystem_Var){
+						pobj_nv->bShow_DefaultSystem_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_DefaultSystem_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+				case IDM_SHOW_RAD_VAR:
+					if(pobj_nv->bShow_Rad_Var){
+						pobj_nv->bShow_Rad_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_Rad_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+				case IDM_SHOW_GUID_VAR:
+					if(pobj_nv->bShow_GUID_Var){
+						pobj_nv->bShow_GUID_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_GUID_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+			}
+			break;
+		case WM_DESTROY:
+			DestroyMenu(hMenu);
+			hMenu=0;
+			break;
+	}
+	return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
+}
+
+BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+	extern double width_ratio_VarList;
+	RECT rect;
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+	LV_DISPINFO *lvinfo;
+	LVITEM ListView_Item;
+
+	static POINT pos_VarList;
+	static POINT pos_WatchList;
+
+	switch(message){
+		case WM_INITDIALOG:
+			extern HWND hDebugWnd;
+			hDebugWnd=hwnd;
+
+			//変数リストの初期位置を取得
+			GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
+			pos_VarList.x=rect.left;
+			pos_VarList.y=rect.top;
+			ScreenToClient(hwnd,&pos_VarList);
+
+			//ウォッチリストの初期位置を取得
+			pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
+			pos_WatchList.y=0;
+
+			//ツールバーのベースウィンドウを生成
+			static HWND hBase_ToolBar;
+			hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
+			MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
+
+			extern WNDPROC OldThreadComboProc;
+			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+			extern WNDPROC OldProcComboProc;
+			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+
+			///////////////////////////
+			// タブコントロールを生成
+			///////////////////////////
+
+			static HWND hTab;
+			HFONT hFont;
+			hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+			hTab=CreateWindow(WC_TABCONTROL,NULL,
+				WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+				0,0,0,0,hwnd,0,hInst,0);
+			SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
+			OldTabProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
+			SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
+
+			//タブを設定
+			TC_ITEM tcItem;
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="グローバル";
+			SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="ローカル";
+			SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="This";
+			SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
+
+			//グローバル変数リストのツリーを作成
+			hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			//ローカル変数リストのツリーを作成
+			hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			//This変数リストのツリーを作成
+			hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			ShowWindow(hVarTree_Global,SW_SHOW);
+
+
+			//イメージリスト読み込み、設定
+			static HIMAGELIST hVariOrderImageList;
+			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+			TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
+			TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
+			TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
+
+
+			/////////////////////////
+			// ウォッチリスト
+			/////////////////////////
+
+			//コラムの設定
+			static HWND hListView;
+			LV_COLUMN ListView_Column;
+			DWORD dwStyle;
+
+			hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
+			GetClientRect(hListView,&rect);
+			dwStyle=ListView_GetExtendedListViewStyle(hListView);
+			dwStyle|=LVS_EX_FULLROWSELECT;
+			ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+			ListView_Column.fmt=LVCFMT_LEFT;
+
+			extern int width_WatchColumn_Expression;
+			ListView_Column.cx=width_WatchColumn_Expression;
+			ListView_Column.pszText="ウォッチ式";
+			ListView_Column.iSubItem=0;
+			ListView_InsertColumn(hListView,0,&ListView_Column);
+
+			extern int width_WatchColumn_Value;
+			ListView_Column.cx=width_WatchColumn_Value;
+			ListView_Column.pszText="値";
+			ListView_Column.iSubItem=1;
+			ListView_InsertColumn(hListView,1,&ListView_Column);
+
+			//アイテムの設定
+			ListView_Item.mask=LVIF_TEXT;
+			ListView_Item.iSubItem=0;
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				ListView_Item.pszText=pobj_nv->ppWatchStr[i];
+				ListView_Item.iItem=i;
+				ListView_InsertItem(hListView,&ListView_Item);
+			}
+			ListView_Item.pszText="...";
+			ListView_Item.iItem=i;
+			ListView_InsertItem(hListView,&ListView_Item);
+
+
+			///////////////////////
+			// 変数リストの初期化
+			///////////////////////
+			InitVarList((DWORD)lParam);
+
+			break;
+		case WM_NOTIFY:
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
+				i=TabCtrl_GetCurSel(hTab);
+
+				if(i==0){
+					//グローバル変数を表示
+					ShowWindow(hVarTree_Global,SW_SHOW);
+					ShowWindow(hVarTree_Local,SW_HIDE);
+					ShowWindow(hVarTree_This,SW_HIDE);
+				}
+				else if(i==1){
+					//ローカル変数を表示
+					ShowWindow(hVarTree_Global,SW_HIDE);
+					ShowWindow(hVarTree_Local,SW_SHOW);
+					ShowWindow(hVarTree_This,SW_HIDE);
+				}
+				else if(i==2){
+					//This変数を表示
+					ShowWindow(hVarTree_Global,SW_HIDE);
+					ShowWindow(hVarTree_Local,SW_HIDE);
+					ShowWindow(hVarTree_This,SW_SHOW);
+				}
+			}
+
+			if(hdr->hwndFrom==hListView){
+				lvinfo=(LV_DISPINFO *)hdr;
+				if(hdr->code==NM_DBLCLK){
+					i2=ListView_GetItemCount(hListView);
+					for(i=0;i<i2;i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
+					}
+					if(i==i2) break;
+
+					ListView_EditLabel(hListView,i);
+				}
+
+				static HWND hEdit;
+				if(hdr->code==LVN_BEGINLABELEDIT){
+					hEdit=ListView_GetEditControl(hListView);
+
+					GetWindowText(hEdit,temporary,VN_SIZE);
+					if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
+				}
+				if(hdr->code==LVN_ENDLABELEDIT){
+					GetWindowText(hEdit,temporary,VN_SIZE);
+					if(temporary[0]=='\0'){
+						if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
+
+						//空白入力の場合はそのアイテムを削除する
+						ListView_DeleteItem(hListView,lvinfo->item.iItem);
+						break;
+					}
+					ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
+
+					//演算結果を表示
+					SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
+
+					if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
+						//リストアイテムを追加
+						ListView_Item.mask=LVIF_TEXT;
+						ListView_Item.pszText="...";
+						ListView_Item.iItem=lvinfo->item.iItem+1;
+						ListView_Item.iSubItem=0;
+						ListView_InsertItem(hListView,&ListView_Item);
+					}
+				}
+
+				if(hdr->code==LVN_KEYDOWN){
+					LV_KEYDOWN *plvKeydown;
+					plvKeydown=(LV_KEYDOWN *)hdr;
+					if(plvKeydown->wVKey==VK_DELETE){
+						i2=ListView_GetItemCount(hListView);
+						for(i=i2-2;i>=0;i--){
+							if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+								ListView_DeleteItem(hListView,i);
+								i3=i;
+							}
+						}
+
+						ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
+					}
+				}
+			}
+			break;
+
+		case WM_SIZE:
+			//変数リストの位置
+			int width_VarList;
+			width_VarList=
+				(int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
+
+			MoveWindow(hTab,
+				pos_VarList.x,
+				pos_VarList.y,
+				width_VarList,
+				HIWORD(lParam)-pos_VarList.y,
+				1);
+
+			GetClientRect(hTab,&rect);
+			TabCtrl_AdjustRect(hTab,FALSE,&rect);
+			rect.left-=2;
+			rect.right++;
+			rect.bottom++;
+
+			MoveWindow(hVarTree_Global,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+			MoveWindow(hVarTree_Local,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+			MoveWindow(hVarTree_This,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+			pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
+			pos_WatchList.y=0;
+
+			//ウォッチリストの位置
+			MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
+				pos_WatchList.x,
+				pos_WatchList.y,
+				LOWORD(lParam)-pos_WatchList.x,
+				HIWORD(lParam)-pos_WatchList.y,
+				1);
+
+			return 1;
+
+		case WM_VARLIST_CLOSE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_DESTROY:
+			ImageList_Destroy(hVariOrderImageList);
+
+
+			//////////////////////////////////////////////////////////////
+			// ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
+			//////////////////////////////////////////////////////////////
+
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				HeapDefaultFree(pobj_nv->ppWatchStr[i]);
+			}
+			HeapDefaultFree(pobj_nv->ppWatchStr);
+
+			pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
+			pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+				pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+				lstrcpy(pobj_nv->ppWatchStr[i],temporary);
+			}
+
+
+			//////////////////////////////
+			// デバッグダイアログを破棄
+			//////////////////////////////
+
+			hDebugWnd=0;
+
+			extern BOOL bClipCompileView;
+			if(bClipCompileView){
+				extern HWND hOwnerEditor;
+				SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
+			}
+
+			return 1;
+
+
+
+		///////////////////////
+		// デバッグコマンド
+		///////////////////////
+
+		case WM_DEBUG_CONTINUE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_STEP_IN:
+			Debugger_StepIn();
+			return 1;
+		case WM_STEP_OVER:
+			Debugger_StepOver();
+			return 1;
+		case WM_STEP_CURSOR:
+			Debugger_StepCursor();
+			return 1;
+	}
+	return 0;
+}
+
+
+
+
+//////////////////////////////////
+// ポップアップ表示の変数リスト
+//////////////////////////////////
+
+BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+	RECT rect;
+	POINT pos;
+	SIZE size;
+
+	switch(message){
+		case WM_INITDIALOG:
+			extern HWND hDebugWnd;
+			hDebugWnd=hwnd;
+
+			pos.x=pobj_nv->VarDlgRect.left;
+			pos.y=pobj_nv->VarDlgRect.top;
+			size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
+			size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
+			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+			extern WNDPROC OldThreadComboProc;
+			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+			extern WNDPROC OldProcComboProc;
+			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+			//イメージリスト読み込み、設定
+			static HIMAGELIST hVariOrderImageList;
+			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+			TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
+
+			InitVarList((DWORD)lParam);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDCANCEL:
+					DestroyWindow(hwnd);
+					return 1;
+				case IDC_STEPIN:
+					dwStepRun=1;
+					return 1;
+				case IDC_STEPOVER:
+					dwStepRun=2;
+					return 1;
+			}
+			break;
+		case WM_SIZE:
+			GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
+			pos.x=rect.left;
+			pos.y=rect.top;
+			ScreenToClient(hwnd,&pos);
+			MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
+			SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
+			return 1;
+		case WM_VARLIST_CLOSE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_DESTROY:
+			ImageList_Destroy(hVariOrderImageList);
+
+			GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
+
+			hDebugWnd=0;
+
+			return 1;
+	}
+	return 0;
+}
Index: /trunk/abdev/BasicCompiler_Common/Variable.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Variable.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Variable.cpp	(revision 147)
@@ -0,0 +1,21 @@
+#include "common.h"
+
+bool Variable::IsEqualSymbol( const Symbol &symbol, bool isSupportStaticMember ) const
+{
+	if( GetName() == symbol.GetName()
+		&& NamespaceScopes::IsSameArea( this->namespaceScopes, symbol.GetNamespaceScopes() ) )
+	{
+		return true;
+	}
+
+	if( isSupportStaticMember && symbol.GetNamespaceScopes().size() >= 1 )
+	{
+		// 静的メンバを考慮
+		NamespaceScopes namespaceScopes( symbol.GetNamespaceScopes() );
+		string name = namespaceScopes[namespaceScopes.size()-1] + "." + symbol.GetName();
+		namespaceScopes.pop_back();
+
+		return IsEqualSymbol( Symbol( namespaceScopes, name ), false );
+	}
+	return false;
+}
Index: /trunk/abdev/BasicCompiler_Common/Variable.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Variable.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/Variable.h	(revision 147)
@@ -0,0 +1,207 @@
+#pragma once
+
+#include "Type.h"
+#include <Symbol.h>
+
+class Variable : public Type
+{
+	const NamespaceScopes namespaceScopes;
+	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 NamespaceScopes &namespaceScopes, const string &name, const Type &type, bool isConst = false, bool isRef = false )
+		: namespaceScopes( namespaceScopes )
+		, 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;
+	}
+
+	bool IsEqualSymbol( const Symbol &symbol, bool isSupportStaticMember = true ) const;
+
+	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<MAX_ARRAYDIM; i++){
+				if(subScripts[i]==-1) break;
+				num *= subScripts[i]+1;
+			}
+			size *= num;
+		}
+
+		if( size % PTR_SIZE ){
+			size += PTR_SIZE-(size%PTR_SIZE);
+		}
+
+		return size;
+	}
+
+
+	/* --- オフセット ---
+
+		※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
+		初期バッファの有無が識別される。
+		（その後、スケジュール実行により、実際の配置に並び替えられる）*/
+	int offset;
+
+	//コンストラクタ用パラメータ
+	string paramStrForConstructor;
+
+	//レキシカルスコープ用
+	int ScopeStartAddress;
+	int ScopeEndAddress;
+	int ScopeLevel;
+	BOOL bLiving;
+
+
+	int source_code_address;
+};
+
+class Variables : public vector<Variable *>
+{
+public:
+	Variables(){}
+	~Variables(){
+		clear();
+	}
+
+	void clear(){
+		for( int i=0; i<(int)this->size(); i++ ){
+			delete (*this)[i];
+		}
+
+		vector<Variable *>::clear();
+	}
+
+	bool DuplicateCheck( const Symbol &symbol ) 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.IsEqualSymbol( symbol ) ){
+						return true;
+					}
+			}
+		}
+		return false;
+	}
+
+	const Variable *BackSearch( const Symbol &symbol ) 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.IsEqualSymbol( symbol ) ){
+						return &var;
+					}
+			}
+		}
+		return NULL;
+	}
+
+	const Variable *Find( const Symbol &symbol )const
+	{
+		int max = (int)this->size();
+		for( int i=0; i<max; i++ ){
+			Variable *pVar = (*this)[i];
+			if( pVar->IsEqualSymbol( symbol ) ){
+				return pVar;
+			}
+		}
+		return NULL;
+	}
+};
+
+extern Variables globalVars;
+
+
+
Index: /trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/VariableOpe.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/VariableOpe.cpp	(revision 147)
@@ -0,0 +1,1283 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+BOOL IsVariableTopChar(char c){
+	if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1;
+	return 0;
+}
+BOOL IsVariableChar(char c){
+	if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
+		c=='%'||c=='!'||c=='#'||c=='$'||
+		c=='_'||c=='.') return 1;
+	return 0;
+}
+BOOL IsPtrType(int type){
+	if(type==-1) return 0;
+
+	if(PTR_LEVEL(type)||type==DEF_PTR_VOID||type==DEF_PTR_PROC||
+		(type&FLAG_PTR) ) return 1;
+
+	return 0;
+}
+BOOL IsSignedType(int type){
+	switch(type){
+		case DEF_SBYTE:
+		case DEF_INTEGER:
+		case DEF_LONG:
+		case DEF_INT64:
+		case DEF_SINGLE:
+		case DEF_DOUBLE:
+		case DEF_CHAR:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
+BOOL IsNaturalWholeNumberType(int type){
+	switch(type){
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_INTEGER:
+		case DEF_WORD:
+		case DEF_LONG:
+		case DEF_DWORD:
+		case DEF_INT64:
+		case DEF_QWORD:
+		case DEF_CHAR:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
+BOOL IsWholeNumberType(int type){
+	return (
+		IsNaturalWholeNumberType(type)
+		|| IsPtrType(type)
+		|| type == DEF_BOOLEAN
+		);
+}
+BOOL IsRealNumberType(int type){
+	switch(type){
+		case DEF_DOUBLE:
+		case DEF_SINGLE:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
+BOOL Is64Type(int type){
+	switch(type){
+		case DEF_INT64:
+		case DEF_QWORD:
+			return 1;
+		default:
+			break;
+	}
+#ifdef _AMD64_
+	return IsPtrType(type);
+#else
+	return 0;
+#endif
+}
+int GetSignedType(int type){
+	switch(type){
+		case DEF_BYTE:
+			return DEF_SBYTE;
+		case DEF_WORD:
+			return DEF_INTEGER;
+		case DEF_DWORD:
+			return DEF_LONG;
+		case DEF_QWORD:
+			return DEF_INT64;
+		default:
+			break;
+	}
+#ifdef _AMD64_
+	if(IsPtrType(type)) return DEF_INT64;
+#else
+	if(IsPtrType(type)) return DEF_LONG;
+#endif
+	return type;
+}
+int GetUnsignedType(int type){
+	switch(type){
+		case DEF_SBYTE:
+			return DEF_BYTE;
+		case DEF_INTEGER:
+			return DEF_WORD;
+		case DEF_LONG:
+			return DEF_DWORD;
+		case DEF_INT64:
+			return DEF_QWORD;
+		case DEF_CHAR:
+			if( isUnicode ) return DEF_WORD;
+			return DEF_BYTE;
+	}
+	return type;
+}
+int GetTypeSize(int type,LONG_PTR lpIndex){
+	if(type==DEF_LONG){
+		if(lpIndex==LITERAL_NULL||lpIndex==LITERAL_M128_0||lpIndex==LITERAL_0_255)
+			return sizeof(BYTE);
+		else if(lpIndex==LITERAL_M32768_0||lpIndex==LITERAL_0_65535)
+			return sizeof(WORD);
+
+		return sizeof(DWORD);
+	}
+
+	//整数型
+	if(type==DEF_INT64||type==DEF_QWORD)
+		return sizeof(_int64);
+	else if(type==DEF_LONG||type==DEF_DWORD)
+		return sizeof(DWORD);
+	else if(type==DEF_INTEGER||type==DEF_WORD)
+		return sizeof(WORD);
+	else if(type==DEF_SBYTE||type==DEF_BYTE || type == DEF_BOOLEAN)
+		return sizeof(BYTE);
+
+	//実数型
+	else if(type==DEF_DOUBLE)		return sizeof(double);
+	else if(type==DEF_SINGLE)		return sizeof(float);
+
+	//文字型
+	else if( type == DEF_CHAR ){
+		if( isUnicode ) return sizeof( WORD );
+		return sizeof( BYTE );
+	}
+
+	//ポインタ型
+	else if(IsPtrType(type))		return PTR_SIZE;
+
+	else if( type == DEF_STRUCT ){
+		if(lpIndex == 0 || lpIndex == -1){
+			SetError(300,NULL,cp);
+			return 0;
+		}
+
+		const CClass *pobj_c=(CClass *)lpIndex;
+
+		return pobj_c->GetSize();
+	}
+
+	else if(type==DEF_OBJECT){
+		return PTR_SIZE;
+	}
+	else{
+		SetError(300,NULL,cp);
+	}
+	return 0;
+}
+int GetPtrType(int type){
+	return MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)+1);
+}
+BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name){
+	if(PTR_LEVEL(type)){
+		//ポインタ型
+		name[0]='*';
+		return GetTypeName(MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1),lpIndex,name+1);
+	}
+
+	//整数型
+	if(type==DEF_SBYTE)				lstrcpy(name,"SByte");
+	else if(type==DEF_BYTE)			lstrcpy(name,"Byte");
+	else if(type==DEF_INTEGER)		lstrcpy(name,"Integer");
+	else if(type==DEF_WORD)			lstrcpy(name,"Word");
+	else if(type==DEF_LONG)			lstrcpy(name,"Long");
+	else if(type==DEF_DWORD)		lstrcpy(name,"DWord");
+	else if(type==DEF_INT64)		lstrcpy(name,"Int64");
+	else if(type==DEF_QWORD)		lstrcpy(name,"QWord");
+
+	//実数型
+	else if(type==DEF_SINGLE)		lstrcpy(name,"Single");
+	else if(type==DEF_DOUBLE)		lstrcpy(name,"Double");
+
+	//文字型
+	//else if(type==DEF_CHAR)				lstrcpy(name,"Char");
+
+	//bool型
+	else if(type==DEF_BOOLEAN)		lstrcpy(name,"Boolean");
+
+	//オブジェクト
+	else if(type==DEF_OBJECT || type==DEF_STRUCT){
+		if(lpIndex==0) lstrcpy(name,"non");
+		else{
+			lstrcpy(name,((CClass *)lpIndex)->GetName().c_str());
+		}
+	}
+
+	//ポインタ型
+	else if(type==DEF_PTR_VOID)		lstrcpy(name,"VoidPtr");
+
+	else if(type==DEF_PTR_PROC){
+		if(lpIndex==-1) lstrcpy(name,"VoidPtr");
+		else{
+			if( Smoothie::Meta::procPointers[lpIndex]->ReturnType().IsNull() )
+				lstrcpy(name,"*Sub");
+			else lstrcpy(name,"*Function");
+		}
+	}
+
+	else{
+		extern int cp;
+		SetError(1,NULL,cp);
+		return 0;
+	}
+	return 1;
+}
+
+Type GetStringTypeInfo(){
+	Type type( DEF_OBJECT, *pobj_DBClass->GetStringClassPtr() );
+	return type;
+}
+
+void GetWithName(char *buffer){
+	extern WITHINFO WithInfo;
+	int i;
+
+	buffer[0]=0;
+	for(i=0;i<WithInfo.num;i++)
+		lstrcat(buffer,WithInfo.ppName[i]);
+}
+
+/*TODO: 消す
+bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){
+	int p1 = 0, p2 = 0;
+
+	for( int i=0; term[i]!='\0' ; i++ ){
+
+		if( term[i] == '[' ){
+			i = JumpStringInBracket( term, i + 1 );
+			if( term[i] == '\0' ) break;
+			continue;
+		}
+		if( term[i] == '(' ){
+			int temp_p = i;
+			i = JumpStringInPare( term, i + 1 ) + 1;
+			if( term[i] == '\0' ) break;
+			if( term[i] == '.'
+				|| term[i] == 1 && term[i] == ESC_PSMEM ){
+					p1 = temp_p;
+					p2 = i;
+			}
+			continue;
+		}
+	}
+	if( !p1 ) return false;
+
+	//メソッド名
+	memcpy( procName, term, p1 );
+	procName[p1] = 0;
+
+	//パラメータ
+	memcpy( parameter, term + p1 + 1, p2 - p1 - 2 );
+	parameter[ p2 - p1 - 2 ] = 0;
+
+	//参照タイプ
+	if( term[p2] == '.' ){
+		refType = CClass::Dot;
+	}
+	else{
+		refType = CClass::Pointer;
+		p2++;
+	}
+
+	//メンバ
+	lstrcpy( member, term + p2 + 1 );
+
+	return true;
+}*/
+
+BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){
+	extern int cp;
+	int i,i2,i3;
+	char cPare_Open,cPare_Close;
+
+	array[0]=0;
+	array2[0]=0;
+	NestMember[0]=0;
+	for(i=0;;i++){
+		if(buffer[i]=='\"'){
+			for(i++;;i++){
+				if(IsDBCSLeadByte(buffer[i])){
+					i++;
+					continue;
+				}
+				if(buffer[i]=='\"') break;
+			}
+		}
+		if(buffer[i]=='['||buffer[i]=='('){
+			if(buffer[i]=='['){
+				cPare_Open='[';
+				cPare_Close=']';
+			}
+			else{
+				cPare_Open='(';
+				cPare_Close=')';
+			}
+			buffer[i]=0;
+			for(i++,i2=0;;i++,i2++){
+				if(buffer[i]==cPare_Open){
+					if(cPare_Open=='[') i3=GetStringInBracket(array+i2,buffer+i);
+					else i3=GetStringInPare(array+i2,buffer+i);
+					i+=i3-1;
+					i2+=i3-1;
+					continue;
+				}
+				if(buffer[i]==cPare_Close){
+					array[i2]=0;
+					break;
+				}
+				array[i2]=buffer[i];
+			}
+			if(buffer[i+1]==cPare_Open){
+				for(i+=2,i2=0;;i++,i2++){
+					if(buffer[i]==cPare_Open){
+						if(cPare_Open=='[') i3=GetStringInBracket(array2+i2,buffer+i);
+						else i3=GetStringInPare(array2+i2,buffer+i);
+						i+=i3-1;
+						i2+=i3-1;
+						continue;
+					}
+					if(buffer[i]==cPare_Close){
+						array2[i2]=0;
+						break;
+					}
+					array2[i2]=buffer[i];
+				}
+				if(buffer[i+1]==cPare_Open){
+					SetError(14,buffer,cp);
+					return 0;
+				}
+			}
+			continue;
+		}
+		if(buffer[i]=='.'){
+			lstrcpy(NestMember,buffer+i+1);
+			refType = CClass::Dot;
+			buffer[i]=0;
+			break;
+		}
+		if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
+			lstrcpy(NestMember,buffer+i+2);
+			refType = CClass::Pointer;
+			buffer[i]=0;
+			break;
+		}
+		if(buffer[i]=='\0') break;
+	}
+	return 1;
+}
+
+void GetArrayElement( const char *buffer,char *variable,char *array_element){
+	array_element[0]=0;
+
+	if(buffer[lstrlen(buffer)-1]!=']'){
+		lstrcpy(variable,buffer);
+		return;
+	}
+
+	int i,i2;
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+		if(buffer[i]=='['){
+			i2=GetStringInBracket(array_element,buffer+i);
+			i+=i2-1;
+			continue;
+		}
+	}
+
+	lstrcpy(variable,buffer);
+	variable[lstrlen(variable)-lstrlen(array_element)]=0;
+
+	RemoveStringBracket(array_element);
+}
+
+BOOL CheckVarNameError(char *name,int nowLine){
+	int i2;
+
+	if(!IsVariableTopChar(name[0])){
+		SetError(1,NULL,nowLine);
+		return 0;
+	}
+	for(i2=1;;i2++){
+		if(name[i2]=='\0') break;
+		if(!IsVariableChar(name[i2])){
+			SetError(1,NULL,nowLine);
+			return 0;
+		}
+	}
+	return 1;
+}
+
+int JumpSubScripts(const int *ss){
+	//DIMで定義された並んだ配列の数だけアドレスを進める
+	int i,i2;
+	for(i=0,i2=1;i<255;i++){
+		if(ss[i]==-1) break;
+		i2*=ss[i]+1;
+	}
+	return i2;
+}
+void GetArrange(char *variable,char *variAnswer,int *SubScripts){
+	extern int cp;
+	int i,i2,i3,i4;
+	double dbl;
+	_int64 i64data;
+	BOOL bBracket;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(variable[i]=='('||variable[i]=='['){
+			if(variable[i]=='[') bBracket=1;
+			else bBracket=0;
+
+			variAnswer[i]=0;
+			for(i++,i2=0,i3=0;;i++,i2++){
+				if(variable[i]==','){
+					temporary[i2]=0;
+
+					Type resultType;
+					if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
+						return;
+					}
+					if(resultType.IsReal()){
+						memcpy(&dbl,&i64data,sizeof(double));
+						i64data=(_int64)dbl;
+					}
+
+					if(i64data<0){
+						//error
+						SubScripts[i3]=0;
+					}
+					else SubScripts[i3]=(int)i64data;
+					i3++;
+					i2=-1;
+					continue;
+				}
+				if(variable[i]=='('){
+					i4=GetStringInPare(temporary+i2,variable+i);
+					i2+=i4-1;
+					i+=i4-1;
+					continue;
+				}
+				if(variable[i]=='['){
+					i4=GetStringInBracket(temporary+i2,variable+i);
+					i2+=i4-1;
+					i+=i4-1;
+					continue;
+				}
+				if(variable[i]==')'&&bBracket==0||
+					variable[i]==']'&&bBracket){
+					temporary[i2]=0;
+					if(i2==0){
+						SubScripts[i3]=-2;
+						break;
+					}
+
+					Type resultType;
+					if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
+						return;
+					}
+					if(resultType.IsReal()){
+						memcpy(&dbl,&i64data,sizeof(double));
+						i64data=(_int64)dbl;
+					}
+
+					if(i64data<0){
+						//error
+						SubScripts[i3]=0;
+					}
+					else SubScripts[i3]=(int)i64data;
+					SubScripts[i3+1]=-1;
+					break;
+				}
+				if(variable[i]=='\"'){
+					SetError(1,NULL,cp);
+					return;
+				}
+				temporary[i2]=variable[i];
+			}
+			break;
+		}
+		variAnswer[i]=variable[i];
+		if(variable[i]=='\0'){
+			SubScripts[0]=-1;
+			break;
+		}
+	}
+}
+
+int GetTypeFromSimpleName(char *variable){
+	extern char DefIntVari[26],DefSngVari[26],DefStrVari[26],divNum,dsvNum,dStrvNum;
+	int i;
+	char name[VN_SIZE];
+
+	//構造体メンバの場合を考慮
+	for(i=lstrlen(variable);i>0;i--){
+		if(variable[i]=='.'){
+			i++;
+			break;
+		}
+	}
+
+	for(;;i++){
+		if(variable[i]=='('||variable[i]=='\0'){
+			name[i]=0;
+			break;
+		}
+		name[i]=variable[i];
+	}
+	//変数名から選択
+	i--;
+	if(name[i]=='#') return DEF_DOUBLE;
+	if(name[i]=='!') return DEF_SINGLE;
+	if(name[i]=='%') return DEF_INTEGER;
+	return DEF_DOUBLE;
+}
+
+
+bool GetMemberType( const CClass &objClass, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled){
+	extern int cp;
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];		//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	CClass::RefType refType = CClass::Non;
+	lstrcpy(VarName,lpszMember);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
+
+	bool isFound = false;
+	CMember *pMember = NULL;
+	BOOST_FOREACH( pMember, objClass.GetDynamicMembers() ){
+		if( pMember->GetName() == VarName ){
+			isFound = true;
+			break;
+		}
+	}
+	if( !isFound ){
+		if(isErrorEnabled) SetError(103,VarName,cp);
+		return false;
+	}
+
+	//アクセシビリティをチェック
+	if( &objClass == pobj_CompilingClass ){
+		//同一クラスオブジェクトの場合はプライベートアクセスを容認する
+		if( pMember->IsNoneAccess() ){
+			if(isErrorEnabled) SetError(107,VarName,cp);
+			return false;
+		}
+	}
+	else{
+		if(( bPrivateAccess==0 && pMember->IsPrivate() )||
+			pMember->IsNoneAccess() ){
+			if(isErrorEnabled) SetError(107,VarName,cp);
+			return false;
+		}
+		else if( bPrivateAccess==0 && pMember->IsProtected() ){
+			if(isErrorEnabled) SetError(108,VarName,cp);
+			return false;
+		}
+	}
+
+	resultType = pMember->GetType();
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if(pMember->SubScripts[0]==-1){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]){
+			if(isErrorEnabled) SetError(16,lpszMember,cp);
+			return false;
+		}
+	}
+
+	if( refType != CClass::Non ){
+		//入れ子構造の場合
+
+		return GetMemberType( pMember->GetType().GetClass(),
+			NestMember,
+			resultType,
+			0,
+			isErrorEnabled);
+	}
+
+	if(array[0]==0&&pMember->SubScripts[0]!=-1){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+		return true;
+	}
+
+	if(lpPtrOffset[0]){
+		if( resultType.PtrLevel() ){
+			resultType.PtrLevelDown();
+		}
+		else{
+			//エラー
+			if(isErrorEnabled) SetError(1,NULL,cp);
+			return false;
+		}
+	}
+
+	return true;
+}
+bool GetVarType( const char *nameBuffer, Type &resultType, bool isErrorEnabled){
+	char variable[VN_SIZE];
+
+	if(nameBuffer[0]=='.'){
+		GetWithName(variable);
+		lstrcat(variable,nameBuffer);
+	}
+	else lstrcpy(variable,nameBuffer);
+
+	// 名前空間を分離
+	char namespaceStr[VN_SIZE]="", simpleName[VN_SIZE];
+	Smoothie::Meta::namespaceScopesCollection.SplitNamespace( variable, namespaceStr, simpleName );
+
+	// 先頭オブジェクトまたはクラス名と入れ子メンバに分割
+	CClass::RefType refType;
+	char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
+
+	// 名前空間を分離していた場合は結合
+	char VarName[VN_SIZE];
+	if( namespaceStr[0] ){
+		sprintf( VarName, "%s.%s", namespaceStr, simpleName );
+	}
+	else{
+		lstrcpy( VarName, simpleName );
+	}
+
+	const Variable *pVar = NULL;
+	const int *pSubScripts;
+
+	if( UserProc::IsLocalAreaCompiling() ){
+		/////////////////
+		// ローカル変数
+		/////////////////
+
+		pVar = UserProc::CompilingUserProc().localVars.BackSearch( Symbol( VarName ) );
+		if( pVar ){
+			goto ok;
+		}
+	}
+
+	if(pobj_CompilingClass){
+		///////////////////////
+		// クラスメンバの参照
+		///////////////////////
+
+		if(lstrcmpi(variable,"This")==0){
+			//Thisオブジェクト
+			resultType.SetType( DEF_OBJECT, pobj_CompilingClass );
+			return true;
+		}
+
+		if(memicmp(variable,"This.",5)==0){
+			//Thisオブジェクトのメンバを参照するとき
+			SlideString(variable+5,-5);
+			lstrcpy(VarName,variable);
+		}
+		else{
+			//クラス内メンバを参照するとき（通常）
+
+			bool isFound = false;
+			BOOST_FOREACH( CMember *pMember, pobj_CompilingClass->GetDynamicMembers() ){
+				if( pMember->GetName() == VarName ){
+					isFound = true;
+					break;
+				}
+			}
+			if( !isFound ) goto NonClassMember;
+		}
+
+		return GetMemberType(*pobj_CompilingClass,variable,resultType,1,isErrorEnabled);
+	}
+
+NonClassMember:
+
+	//////////////////////////
+	// 静的ローカル変数
+	// ※"Static.Object.Method.Variable"
+	//////////////////////////
+
+	char temporary[VN_SIZE];
+	if( UserProc::IsLocalAreaCompiling() ){
+		GetNowStaticVarFullName(VarName,temporary);
+
+		pVar = globalVars.Find( Symbol( temporary ) );
+		if( pVar ){
+			goto ok;
+		}
+	}
+
+
+	//////////////////////////
+	// クラスの静的メンバ
+	//////////////////////////
+
+	if(member[0]){
+		lstrcpy(temporary,member);
+		char tempMember[VN_SIZE];
+		char tempArray[VN_SIZE];
+		{
+			CClass::RefType refType;
+			GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
+		}
+
+		int typeDefIndex = Smoothie::Meta::typeDefs.GetIndex( VarName );
+		if( typeDefIndex != -1 ){
+			// TypeDef後の型名だったとき
+			lstrcpy( VarName, Smoothie::Meta::typeDefs[typeDefIndex].GetBaseName().c_str() );
+		}
+
+		char temp2[VN_SIZE];
+		sprintf(temp2,"%s.%s",VarName,temporary);
+
+		pVar = globalVars.Find( Symbol( temp2 ) );
+		if( pVar ){
+			lstrcpy(member,tempMember);
+			lstrcpy(array,tempArray);
+			goto ok;
+		}
+	}
+
+	if(pobj_CompilingClass){
+		//自身のクラスから静的メンバを参照する場合
+		char temp2[VN_SIZE];
+		sprintf(temp2,"%s.%s",pobj_CompilingClass->GetName().c_str(),VarName);
+
+		pVar = globalVars.Find( Symbol( temp2 ) );
+		if( pVar ){
+			goto ok;
+		}
+	}
+
+
+	////////////////////
+	// グローバル変数
+	////////////////////
+
+	pVar = globalVars.BackSearch( Symbol( VarName ) );
+	if( pVar ){
+		goto ok;
+	}
+
+	//変数として見つからなかったとき
+	if(isErrorEnabled) SetError(3,variable,cp);
+	return false;
+
+ok:
+
+	//ポインタ変数の場合
+	if( pVar->IsPointer() ){
+		if( !pVar->IsArray() ){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]){
+			if(isErrorEnabled) SetError(16,variable,cp);
+			return false;
+		}
+	}
+
+	resultType = (*pVar);
+	pSubScripts=pVar->GetSubScriptsPtr();
+
+
+	if(member[0]){
+		if( NATURAL_TYPE( resultType.GetBasicType() )==DEF_OBJECT
+			|| NATURAL_TYPE( resultType.GetBasicType() )==DEF_STRUCT){
+				return GetMemberType(resultType.GetClass(),member,resultType,0,isErrorEnabled);
+		}
+	}
+
+	if(array[0]==0&&pSubScripts[0]!=-1){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(lpPtrOffset[0]){
+		if( resultType.PtrLevel() ){
+			resultType.PtrLevelDown();
+		}
+		else{
+			//エラー
+			if(isErrorEnabled) SetError(1,NULL,cp);
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss ){
+	//読み取り専用で変数へアクセス
+	return GetVarOffset(
+		true,		//エラー表示有効
+		false,		//書き込みアクセスは無し
+		NameBuffer,
+		pRelativeVar,
+		resultType,
+		pss);
+}
+bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss ){
+	//読み書き両用で変数へアクセス
+	return GetVarOffset(
+		true,		//エラー表示有効
+		true,		//書き込みアクセス
+		NameBuffer,
+		pRelativeVar,
+		resultType,
+		pss);
+}
+
+
+
+bool GetDimentionFormat( const char *buffer,
+						char *VarName,
+						int *SubScripts,
+						Type &type,
+						char *InitBuf,
+						char *ConstractParameter ){
+	int i,i2,i3,IsStr;
+	char variable[VN_SIZE],temporary[8192];
+
+	for(i=0;;i++){
+		if((buffer[i]==1&&buffer[i+1]==ESC_AS)||
+			buffer[i]=='='||
+			buffer[i]=='\0'){
+			variable[i]=0;
+			break;
+		}
+		variable[i]=buffer[i];
+	}
+
+	if(buffer[i]=='='){
+		////////////////////////////////////
+		// 初期化データが指定されいるとき
+		////////////////////////////////////
+		i++;
+
+		if( buffer[i]=='[' ){
+			// 構造初期データの場合
+
+			i3=GetStringInBracket(InitBuf,buffer+i);
+			i+=i3;
+		}
+		else{
+			// 代入初期データの場合
+
+			for(i2=0,IsStr=0;;i++,i2++){
+				if(buffer[i]=='\"') IsStr^=1;
+				if(buffer[i]=='('&&IsStr==0){
+					i3=GetStringInPare(InitBuf+i2,buffer+i);
+					i+=i3-1;
+					i2+=i3-1;
+					continue;
+				}
+				if(buffer[i]=='['&&IsStr==0){
+					i3=GetStringInBracket(InitBuf+i2,buffer+i);
+					i+=i3-1;
+					i2+=i3-1;
+					continue;
+				}
+				if((buffer[i]==','&&IsStr==0)||
+					buffer[i]=='\0'){
+					InitBuf[i2]=0;
+					break;
+				}
+				InitBuf[i2]=buffer[i];
+			}
+		}
+	}
+	else{
+		//初期化データなし
+		InitBuf[0]=0;
+	}
+
+	ConstractParameter[0]=0;
+	if(buffer[i]==1&&buffer[i+1]==ESC_AS){
+		/////////////////////////////
+		// "As ～" による型指定あり
+		/////////////////////////////
+
+		for(i+=2,i2=0;;i++,i2++){
+			if(buffer[i]==','||buffer[i]=='('||buffer[i]=='\0'){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+		if(temporary[0]=='*'&&
+			temporary[1]==1&&
+			(temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
+			if(buffer[i]!='('){
+				SetError(10,temporary,cp);
+				return false;
+			}
+			i3=GetStringInPare(temporary+3,buffer+i);
+			i+=i3;
+			i2+=i3;
+
+			if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
+				temporary[i2++]=buffer[i++];
+				temporary[i2++]=buffer[i++];
+				for(;;i++,i2++){
+					if(!IsVariableChar(buffer[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+			}
+		}
+
+		if( !Type::StringToType( temporary, type ) ){
+			SetError(3,temporary,cp);
+			type.SetBasicType( DEF_LONG );
+		}
+
+		if(buffer[i]=='('){
+			//コンストラクタに渡すパラメータを取得
+			i2=GetStringInPare(ConstractParameter,buffer+i);
+			i+=i2;
+			RemoveStringPare(ConstractParameter);
+
+			if( !type.IsObject() ){
+				SetError(112,variable,cp);
+				return false;
+			}
+		}
+	}
+	else{
+		/////////////////
+		// As指定なし
+		/////////////////
+
+		if( InitBuf[0] == '\0' ){
+			//As指定も、初期値指定もない場合
+			type.SetBasicType( GetTypeFromSimpleName(variable) );
+
+			i2=lstrlen(variable)-1;
+			if(i2>=0){
+				if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
+					SetError(-103,variable,cp);
+			}
+		}
+		else{
+			//初期値の型を判別して自動的に型情報を付加する
+			if( !NumOpe_GetType( InitBuf, GetStringTypeInfo(), type ) ){
+				// エラーの場合
+				return false;
+			}
+
+			if( IS_LITERAL( type.GetIndex() ) ){
+				type.SetIndex( -1 );
+			}
+		}
+
+	}
+
+	if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){
+		//初期値とコンストラクタパラメータが同時に呼び出されているとき
+		SetError(132, NULL, cp);
+	}
+
+	GetArrange(variable,VarName,SubScripts);
+	return true;
+}
+
+BOOL GetNowStaticVarFullName(char *VarName,char *FullName){
+	if( UserProc::IsGlobalAreaCompiling() ){
+		// グローバル領域をコンパイル中のとき
+		return 0;
+	}
+
+	UserProc &proc = UserProc::CompilingUserProc();
+
+	//Static識別
+	lstrcpy(FullName,"Static%");
+
+	//クラス名
+	if(pobj_CompilingClass){
+		lstrcat(FullName,pobj_CompilingClass->GetName().c_str());
+		lstrcat(FullName,"%");
+	}
+
+	//関数（またはメソッド）名
+	lstrcat(FullName,proc.GetName().c_str());
+	lstrcat(FullName,"%");
+
+	//ID
+	char temp[255];
+	sprintf(temp,"%x",proc.id);
+	lstrcat(FullName,temp);
+	lstrcat(FullName,"%");
+
+	//変数名
+	lstrcat(FullName,VarName);
+
+	return 1;
+}
+
+
+void AddGlobalVariable( const char *name,int *SubScripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlag){
+	/////////////////////////
+	// グローバル変数を追加
+	/////////////////////////
+	extern int AllInitGlobalVarSize;
+	extern int AllGlobalVarSize;
+
+	if( globalVars.DuplicateCheck( Symbol( name ) ) ){
+		//２重定義のエラー
+		SetError(15,name,cp);
+		return;
+	}
+
+	bool isConst = ( dwFlag & DIMFLAG_CONST ) ? true:false;
+
+	Variable *pVar = new Variable( Smoothie::Lexical::liveingNamespaceScopes, name, type, isConst );
+
+	if( SubScripts[0] != -1 ){
+		//配列あり
+		pVar->SetArray( SubScripts );
+	}
+
+	//コンストラクタ用パラメータ
+	pVar->paramStrForConstructor = ConstractParameter;
+
+	//レキシカルスコープ
+	pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
+	pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
+	pVar->bLiving=TRUE;
+
+	//エラー用
+	pVar->source_code_address=cp;
+
+	// 変数を追加
+	globalVars.push_back( pVar );
+
+	//アラインメントを考慮
+	int alignment = 0;
+	if( pVar->IsStruct() ){
+		alignment = pVar->GetClass().iAlign;
+	}
+
+	if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
+		//初期バッファがあるとき
+
+		if( alignment ){
+			if( AllInitGlobalVarSize % alignment ){
+				AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment);
+			}
+		}
+
+		pVar->offset=AllInitGlobalVarSize;
+		AllInitGlobalVarSize += pVar->GetMemorySize();
+	}
+	else{
+		//初期バッファがないとき
+
+		if( alignment ){
+			if( AllGlobalVarSize % alignment ){
+				AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment);
+			}
+		}
+
+		pVar->offset=AllGlobalVarSize | 0x80000000;
+		AllGlobalVarSize += pVar->GetMemorySize();
+	}
+
+	if(InitBuf[0]){
+		int result = 0;
+		if( !pVar->IsObject() ){
+			//初期バッファにデータをセット
+			extern BYTE *initGlobalBuf;
+			initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
+				HEAP_ZERO_MEMORY,
+				initGlobalBuf,
+				AllInitGlobalVarSize);
+
+			result = SetInitGlobalData(pVar->offset,
+				*pVar,
+				pVar->GetSubScriptsPtr(),
+				InitBuf);
+		}
+
+		if(!result){
+			//動的な式だった場合は代入演算を行う
+
+			//初期代入時のみ、書き込みアクセスを許可する
+			if( isConst ){
+				pVar->ConstOff();
+			}
+
+			//代入
+			char temporary[8192];
+			sprintf(temporary,"%s=%s",name,InitBuf);
+			OpcodeCalc(temporary);
+
+			//アクセス制限を元に戻す
+			if( isConst ){
+				pVar->ConstOn();
+			}
+		}
+	}
+
+
+	if( type.IsObject() ){
+		//デストラクタの利用フラグをオンにする
+		const CMethod *method = type.GetClass().GetDestructorMethod();
+		if( method ){
+			method->pUserProc->Using();
+		}
+	}
+}
+
+void dim(char *Parameter,DWORD dwFlags){
+	extern HANDLE hHeap;
+	int i2;
+	char VarName[VN_SIZE];
+
+	i2 = 0;
+
+	if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
+		//参照型
+		SetError();
+		Parameter += 2;
+	}
+
+	if(dwFlags & DIMFLAG_CONST){
+
+		//////////////////////////////////
+		// 定数変数の場合を考慮
+		//////////////////////////////////
+		for(;;i2++){
+			if(Parameter[i2] == '=' ||
+				Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
+				Parameter[i2] =='('){
+					VarName[i2] = 0;
+					break;
+			}
+			VarName[i2] = Parameter[i2];
+		}
+
+		//定数と２重定義されていないる場合は抜け出す
+		if(CDBConst::obj.GetBasicType(VarName)){
+			return;
+		}
+
+		//定数マクロとして定義されている場合は抜け出す
+		if(GetConstHash(VarName)){
+			return;
+		}
+	}
+
+	//構文を解析
+	int SubScripts[MAX_ARRAYDIM];
+	Type type;
+	char InitBuf[8192];
+	char ConstractParameter[VN_SIZE];
+	if(!GetDimentionFormat(Parameter, VarName,SubScripts,type,InitBuf,ConstractParameter))
+		return;
+
+
+	//定数と２重定義されていないかを調べる
+	if(CDBConst::obj.GetBasicType(VarName)){
+		SetError(15,VarName,cp);
+		return;
+	}
+
+	//定数マクロとして定義されている場合
+	if(GetConstHash(VarName)){
+		SetError(15,VarName,cp);
+		return;
+	}
+
+	if( type.IsObject() ){
+		if( type.GetClass().IsBlittableType() ){
+			// Blittable型のときは基本型として扱う
+			// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+			if( UserProc::IsLocalAreaCompiling()
+				&& UserProc::CompilingUserProc().HasParentClass()
+				&& UserProc::CompilingUserProc().GetParentClass().IsBlittableType() )
+			{
+				// コンパイル中のメソッドがBlittable型クラスに属している
+			}
+			else{
+				type = type.GetClass().GetBlittableType();
+			}
+		}
+	}
+
+	if(dwFlags&DIMFLAG_STATIC){
+		if( UserProc::IsGlobalAreaCompiling() ){
+			SetError(60,NULL,cp);
+			return;
+		}
+
+		/////////////////////
+		// Static変数
+		// ※"Static.Object.Method.Variable"
+		/////////////////////
+
+		char temporary[VN_SIZE];
+		GetNowStaticVarFullName(VarName,temporary);
+
+		dim( temporary,SubScripts,type,InitBuf,ConstractParameter,dwFlags );
+
+		/*
+		Note: 静的変数のコンストラクタ呼び出しは
+			_System_InitStaticLocalVariables関数内で一括して行う
+		*/
+	}
+	else{
+		dim( VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags );
+	}
+}
+void OpcodeDim(char *Parameter,DWORD dwFlags){
+	int i,i2,i3,IsStr=0;
+	char temporary[8192];
+
+	for(i=0,i2=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		if(Parameter[i]=='('&&IsStr==0){
+			i3=GetStringInPare(temporary+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		if(Parameter[i]=='['&&IsStr==0){
+			i3=GetStringInBracket(temporary+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		if((Parameter[i]==','&&IsStr==0)||
+			Parameter[i]=='\0'){
+			temporary[i2]=0;
+
+			dim(temporary,dwFlags);
+
+			if(Parameter[i]=='\0') break;
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=Parameter[i];
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/VariableOpe.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/VariableOpe.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/VariableOpe.h	(revision 147)
@@ -0,0 +1,36 @@
+
+
+BOOL IsVariableTopChar(char c);
+BOOL IsVariableChar(char c);
+BOOL IsPtrType(int type);
+BOOL IsSignedType(int type);
+BOOL IsNaturalWholeNumberType(int type);
+BOOL IsWholeNumberType(int type);
+BOOL IsRealNumberType(int type);
+BOOL Is64Type(int type);
+int GetSignedType(int type);
+int GetUnsignedType(int type);
+int GetTypeSize(int type,LONG_PTR lpIndex);
+int GetPtrType(int type);
+BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name);
+void GetWithName(char *buffer);
+BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, CClass::RefType &refType );
+void GetArrayElement( const char *buffer,char *variable,char *array_element);
+BOOL CheckVarNameError(char *name,int nowLine);
+int JumpSubScripts(const int *ss);
+void GetArrange(char *variable,char *variAnswer,int *SubScripts);
+int GetTypeFromSimpleName(char *variable);
+bool GetMemberType( const CClass &objClass, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled);
+bool GetVarType( const char *nameBuffer, Type &resultType, bool isError);
+bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL );
+bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL );
+bool GetDimentionFormat( const char *buffer,
+						char *VarName,
+						int *SubScripts,
+						Type &type,
+						char *InitBuf,
+						char *ConstractParameter );
+BOOL GetNowStaticVarFullName(char *VarName,char *FullName);
+void AddGlobalVariable( const char *name,int *SubScripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlag);
+void dim(char *Parameter,DWORD dwFlags);
+void OpcodeDim(char *Parameter,DWORD dwFlags);
Index: /trunk/abdev/BasicCompiler_Common/WatchList.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/WatchList.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/WatchList.cpp	(revision 147)
@@ -0,0 +1,544 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+//デバッグ用
+#include "debug.h"
+
+int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset);
+
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+	int i2;
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		return ImageBase+MemPos_RWSection+pRelativeVar->offset;
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		extern HANDLE hDebugProcess;
+		LONG_PTR lpData;
+		SIZE_T accessBytes;
+		ReadProcessMemory(hDebugProcess,
+			(void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
+			&lpData,
+			sizeof(LONG_PTR),
+			&accessBytes);
+
+		return lpData;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+		return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+		extern HANDLE hDebugProcess;
+		LONG_PTR lpData;
+		SIZE_T accessBytes;
+		ReadProcessMemory(hDebugProcess,
+			(void *)(pobj_dti->lplpSpBase[i2]+(int)pRelativeVar->offset),
+			&lpData,
+			sizeof(LONG_PTR),
+			&accessBytes);
+
+		return lpData;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+		return pRelativeVar->offset;
+	}
+
+	return 0;
+}
+
+bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+	int array_num;
+
+	_int64 i64data;
+	if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
+		return false;
+	}
+	if( type.IsReal() ){
+		double dbl;
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+
+	array_num=(int)i64data;
+
+	if( type.PtrLevel() ){
+		type.PtrLevelDown();
+		array_num *= type.GetSize();
+	}
+	else{
+		//エラー
+		return false;
+	}
+
+	extern HANDLE hDebugProcess;
+	LONG_PTR lpData;
+	SIZE_T accessBytes;
+	lpData=Debugging_GetVarPtr(pRelativeVar);
+	if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
+		return false;
+	}
+	pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+	pRelativeVar->offset+=array_num;
+	return true;
+}
+
+int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
+	int i2;
+
+	//直接参照に切り替え
+	pRelativeVar->offset=(LONG_PTR)Debugging_GetVarPtr(pRelativeVar);
+	pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	CClass::RefType refType;
+	lstrcpy(VarName,member);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0;
+
+
+	////////////////////////////
+	// メンバオフセットを取得
+	////////////////////////////
+
+	int memberIndex;
+	int offset = objClass.GetMemberOffset( VarName, &memberIndex );
+	if(memberIndex==objClass.GetDynamicMembers().size()) return 0;
+
+	CMember *pMember = objClass.GetDynamicMembers()[memberIndex];
+
+
+	//アクセシビリティをチェック
+	if(( bPrivateAccess==0 && pMember->IsPrivate() )||
+		pMember->IsNoneAccess() ){
+		return 0;
+	}
+	else if(bPrivateAccess==0&&pMember->IsProtected())
+		return 0;
+
+	resultType = pMember->GetType();
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if(pMember->SubScripts[0]==-1){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]) return 0;
+	}
+
+	pRelativeVar->offset+=offset;
+
+	if(array[0]){
+		//配列オフセット
+		i2=Debugging_GetArray(
+			pMember->SubScripts,
+			array,
+			resultType,
+			&pRelativeVar->offset);
+		if(i2==0){
+			//式エラー
+			return 0;
+		}
+		if(i2==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+	else if(pMember->SubScripts[0]!=-1){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(NestMember[0]){
+		//入れ子構造の場合
+
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			if( refType != CClass::Dot ) return 0;
+
+			if( resultType.IsObject() ){
+				extern HANDLE hDebugProcess;
+				LONG_PTR lpData;
+				SIZE_T accessBytes;
+				lpData=Debugging_GetVarPtr(pRelativeVar);
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//構造体ポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				if( refType != CClass::Dot ) return 0;
+
+				//直接参照に切り替え
+				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+
+				lpPtrOffset[0]=0;
+			}
+			else{
+				if( refType != CClass::Pointer ) return 0;
+
+				extern HANDLE hDebugProcess;
+				LONG_PTR lpData;
+				SIZE_T accessBytes;
+				lpData=Debugging_GetVarPtr(pRelativeVar);
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+		}
+
+		i2=Debugging_GetMember(pMember->GetType().GetClass(),
+			NestMember,
+			pRelativeVar,
+			resultType,
+			0);
+		if(i2==0){
+			//式エラー
+			return 0;
+		}
+		if(i2==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+
+	if(lpPtrOffset[0]){
+		Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+	}
+
+	return 1;
+}
+int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5,array_offset;
+	char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+	for(i=0,i2=0,i3=0;;i++,i2++){
+		if(array[i]=='('){
+			i4=GetStringInPare(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]=='['){
+			i4=GetStringInBracket(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]==','||array[i]=='\0'){
+			if(SubScripts[i3]==-1){
+				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+				return 0;
+			}
+
+			temporary[i2]=0;
+
+			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(pParm[i3],temporary);
+
+			i3++;
+
+			if(array[i]=='\0'){
+				if(SubScripts[i3]!=-1){
+					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+					return 0;
+				}
+				break;
+			}
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=array[i];
+	}
+
+	array_offset=0;
+
+	for(i=i3-1;i>=0;i--){
+		_int64 i64data;
+		Type resultType;
+		bool isMemoryAccessError;
+		if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
+			//式エラー
+			return 0;
+		}
+		if(isMemoryAccessError){
+			//アクセスエラー
+			return -1;
+		}
+
+		if(resultType.IsReal()){
+			double dbl;
+			memcpy(&dbl,&i64data,sizeof(double));
+			i64data=(_int64)dbl;
+		}
+		i5=(int)i64data;
+
+		for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
+
+		array_offset+=i5*i4;
+
+		HeapDefaultFree(pParm[i]);
+	}
+
+	array_offset *= type.GetSize();
+
+	*plpOffset+=array_offset;
+
+	return 1;
+}
+ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
+	GlobalProc *pUserProc = GetSubFromObp(obp_Rip);
+
+	foreach( Variable *pVar, pUserProc->localVars ){
+		if( pVar->GetName() == "_System_LocalThis" ){
+			return pVar->offset;
+		}
+	}
+	return 0;
+}
+int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
+	extern HANDLE hDebugProcess;
+	int i2,i3;
+	char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	LONG_PTR lpData;
+	SIZE_T accessBytes;
+
+	lstrcpy(VarName,variable);
+	CClass::RefType refType;
+	GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
+
+	const int *pSubScripts;
+	bool isArray;
+
+
+	/////////////////
+	// ローカル変数
+	/////////////////
+	if( UserProc::IsLocalAreaCompiling() ){
+		const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( Symbol( VarName ) );
+
+		if( pVar ){
+			//ポインタ変数の場合
+			if( pVar->IsPointer() ){
+				if( !pVar->IsArray() ){
+					lstrcpy(lpPtrOffset,array);
+					array[0]=0;
+				}
+			}
+			else{
+				if(lpPtrOffset[0]) return 0;
+			}
+
+			pRelativeVar->offset = pVar->offset;
+			if( pVar->IsRef() ){
+				pRelativeVar->dwKind=VAR_REFLOCAL;
+			}
+			else{
+				pRelativeVar->dwKind=VAR_LOCAL;
+			}
+			resultType = *pVar;
+			isArray = pVar->IsArray();
+			pSubScripts = pVar->GetSubScriptsPtr();
+		}
+	}
+
+	if(pobj_CompilingClass){
+		///////////////////////
+		// クラスメンバの参照
+		///////////////////////
+
+		if(memicmp(variable,"This.",5)==0){
+			//Thisオブジェクトのメンバを参照するとき
+			SlideString(variable+5,-5);
+			lstrcpy(VarName,variable);
+		}
+		else{
+			//クラス内メンバを参照するとき（通常）
+
+			bool isFound = false;
+			BOOST_FOREACH( CMember *pMember, pobj_CompilingClass->GetDynamicMembers() ){
+				if( pMember->GetName() == VarName ){
+					isFound = true;
+					break;
+				}
+			}
+			if( !isFound ) goto NonClassMember;
+		}
+
+		/////////////////////////////
+		// thisポインタを取得
+
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
+		if(!lpData){
+			//式エラー
+			return 0;
+		}
+		lpData+=pobj_dti->lplpSpBase[i2];
+		if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
+			//メモリにアクセスできないとき
+			return -1;
+		}
+
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+		i3=Debugging_GetMember(*pobj_CompilingClass,variable,pRelativeVar,resultType,1);
+		if(i3==0){
+			//式エラー
+			return 0;
+		}
+		if(i3==-1){
+			//アクセスエラー
+			return -1;
+		}
+
+		return 1;
+	}
+
+NonClassMember:
+
+	{
+		///////////////////
+		// グローバル変数
+		///////////////////
+
+		const Variable *pVar = globalVars.Find( VarName );
+		if( !pVar ){
+			//一致しないとき
+			return 0;
+		}
+
+		//ポインタ変数の場合
+		if( pVar->IsPointer() ){
+			if( !pVar->IsArray() ){
+				lstrcpy(lpPtrOffset,array);
+				array[0]=0;
+			}
+		}
+		else{
+			if(lpPtrOffset[0]) return 0;
+		}
+
+		pRelativeVar->offset=pVar->offset;
+		if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
+		else pRelativeVar->dwKind=VAR_GLOBAL;
+		resultType = *pVar;
+		isArray = pVar->IsArray();
+		pSubScripts=pVar->GetSubScriptsPtr();
+	}
+
+
+	if(array[0]==0&&isArray){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+		if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM*sizeof(int));
+		return 1;
+	}
+
+	if(array[0]){
+		i3=Debugging_GetArray(pSubScripts,array,resultType,&pRelativeVar->offset);
+		if(i3==0){
+			//式エラー
+			return 0;
+		}
+		if(i3==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+	if(member[0]){
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			//実態オブジェクトのメンバを参照（obj.member）
+			if( refType != CClass::Dot ){
+				return 0;
+			}
+
+			i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+			if(i3==0){
+				//式エラー
+				return 0;
+			}
+			if(i3==-1){
+				//アクセスエラー
+				return -1;
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( refType != CClass::Dot ) return 0;
+				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+
+				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+				if(i3==0){
+					//式エラー
+					return 0;
+				}
+				if(i3==-1){
+					//アクセスエラー
+					return -1;
+				}
+			}
+			else{
+				//pObj->member
+				if( refType != CClass::Pointer ) return 0;
+
+				pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->offset=lpData;
+
+				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+				if(i3==0){
+					//式エラー
+					return 0;
+				}
+				if(i3==-1){
+					//アクセスエラー
+					return -1;
+				}
+			}
+		}
+		else{
+			return 0;
+		}
+		return 1;
+	}
+
+	if(lpPtrOffset[0]){
+		if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
+	}
+
+	return 1;
+}
Index: /trunk/abdev/BasicCompiler_Common/calculation.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/calculation.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/calculation.cpp	(revision 147)
@@ -0,0 +1,1547 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+double dbl_stack[255];
+_int64 i64stack[255];
+
+bool IsNumberTopChar(const char *buffer){
+	int c = buffer[0];
+	if('0' <= c && c <= '9') return true;
+	if(c == '&' && (buffer[1] == 'h' || buffer[1] == 'H' || buffer[1] == 'o' || buffer[1] == 'O')) return true;
+
+	return false;
+}
+bool IsNumberChar(const char c){
+	if('0' <= c && c <= '9') return true;
+	if('a' <= c && c <= 'f') return true;
+	if('A' <= c && c <= 'F') return true;
+	if(c=='.' || c=='e'||c=='E') return true;
+
+	return false;
+}
+BOOL IsJudgMark(const char *Command,int p){
+	if(Command[p]==1){
+		if(Command[p+1]==ESC_AND) return 1;
+		if(Command[p+1]==ESC_OR) return 1;
+		if(Command[p+1]==ESC_XOR) return 1;
+		if(Command[p+1]==ESC_NOT) return 1;
+	}
+	return 0;
+}
+BOOL IsNumCalcMark(const char *Command,int p){
+	if(Command[p]=='^'||Command[p]=='*'||Command[p]=='/'||Command[p]=='\\'||
+		(Command[p]==1&&Command[p+1]==ESC_MOD)||Command[p]=='+'||Command[p]=='-'||
+		Command[p]=='='||Command[p]=='<'||Command[p]=='>'||
+		IsJudgMark(Command,p)||
+		(Command[p]==1&&Command[p+1]==ESC_AS)||
+		(Command[p]==1&&Command[p+1]==ESC_BYVAL)) return 1;
+	return 0;
+}
+BOOL IsNumCalcMark_Back(const char *Command,int p){
+	if(p==0){
+		if(Command[p]=='^'||Command[p]=='*'||Command[p]=='/'||Command[p]=='\\'||
+			Command[p]=='+'||Command[p]=='-'||
+			Command[p]=='='||Command[p]=='<'||Command[p]=='>') return 1;
+	}
+	else{
+		if(Command[p]=='^'||Command[p]=='*'||Command[p]=='/'||Command[p]=='\\'||
+			(Command[p-1]==1&&Command[p]==ESC_MOD)||Command[p]=='+'||Command[p]=='-'||
+			Command[p]=='='||Command[p]=='<'||Command[p]=='>'||
+			IsJudgMark(Command,p-1)||
+			(Command[p-1]==1&&Command[p]==ESC_AS)) return 1;
+	}
+	return 0;
+}
+BOOL IsStrCalcMark(const char c){
+	if(c=='+'||c=='&') return 1;
+	return 0;
+}
+BOOL IsExponent(const char *Command,int p){
+	int i,sw;
+	for(i=p-2,sw=FALSE;i>=0;i--){
+		if(Command[i]>='0'&&Command[i]<='9') sw=TRUE;
+		if(!((Command[i]>='0'&&Command[i]<='9')||Command[i]=='.')){
+			if((IsNumCalcMark(Command,i)||Command[i]=='('||Command[i]==')')&&sw) return TRUE;
+			return FALSE;
+		}
+		if(i==0&&sw) return TRUE;
+	}
+	return FALSE;
+}
+
+int CompStr(char *str1,int len1,char *str2,int len2){
+	int i,len;
+
+	if(len1<len2) len=len1;
+	else len=len2;
+
+	for(i=0;i<len;i++){
+		if((unsigned char *)str1[i]>(unsigned char *)str2[i]) return 1;
+		else if((unsigned char *)str1[i]<(unsigned char *)str2[i]) return -1;
+	}
+	if(len1>len2) return 1;
+	else if(len1<len2) return -1;
+	return 0;
+}
+void TypeErrorCheck(_int64 *stack,int sp,long calc){
+	extern int cp;
+	if(sp==0||calc==0) return;
+	if(sp==1){
+		if(stack[0]){
+			SetError(9,NULL,cp);
+			return;
+		}
+		return;
+	}
+	if(CALC_PE<=calc&&calc<=CALC_Q||calc==CALC_ADDITION){
+		//文字列演算が可能な演算子
+		if((stack[sp-2]&&stack[sp-1]==0)||(stack[sp-2]==0&&stack[sp-1])){
+			SetError(9,NULL,cp);
+			return;
+		}
+	}
+	else{
+		//文字列演算ができない演算子
+		if(stack[sp-2]||stack[sp-1]){
+			SetError(9,NULL,cp);
+			return;
+		}
+	}
+}
+
+
+int GetLiteralIndex(_int64 i64data){
+	if(i64data==0) return LITERAL_NULL;
+	else if(-128<=i64data&&i64data<0) return LITERAL_M128_0;
+	else if(0<i64data&&i64data<256) return LITERAL_0_255;
+	else if(-32768<=i64data&&i64data<0) return LITERAL_M32768_0;
+	else if(0<i64data&&i64data<65536) return LITERAL_0_65535;
+	else if(i64data<0) return LITERAL_OTHER_MINUS;
+	return LITERAL_OTHER_PLUS;
+}
+
+
+int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2){
+
+	if(type1==DEF_DOUBLE||type2==DEF_DOUBLE) return DEF_DOUBLE;
+	if(type1==DEF_SINGLE||type2==DEF_SINGLE) return DEF_SINGLE;
+
+	int size1,size2;
+	size1=GetTypeSize(type1,index1);
+	size2=GetTypeSize(type2,index2);
+	if(size1<size2){
+		size1=size2;
+	}
+	else if(type1==type2) return type1;
+
+	if(IsPtrType(type1)||IsPtrType(type2)){
+		if(IsPtrType(type1)) return type1;
+		else return type2;
+	}
+
+
+	/////////////////////////////
+	// 片方がリテラル値の場合
+	// ※柔軟に符号を除去する
+	/////////////////////////////
+	if(IsSignedType(type1)&&IS_POSITIVE_LITERAL(index1)&&
+		IsSignedType(type2)==0){
+		type1=GetUnsignedType(type1);
+	}
+	if(IsSignedType(type1)==0&&
+		IsSignedType(type2)&&IS_POSITIVE_LITERAL(index2)){
+		type2=GetUnsignedType(type2);
+	}
+
+
+	if(IsSignedType(type1)||IsSignedType(type2)){
+		//符号あり
+		if(size1==sizeof(char))		return DEF_SBYTE;
+		if(size1==sizeof(short))	return DEF_INTEGER;
+		if(size1==sizeof(long))		return DEF_LONG;
+		if(size1==sizeof(_int64))	return DEF_INT64;
+	}
+	else{
+		//符号なし
+		if(size1==sizeof(char))		return DEF_BYTE;
+		if(size1==sizeof(short))	return DEF_WORD;
+		if(size1==sizeof(long))		return DEF_DWORD;
+		if(size1==sizeof(_int64))	return DEF_QWORD;
+	}
+
+	extern int cp;
+	SetError(300,NULL,cp);
+	return 0;
+}
+
+void StaticTwoTerm(int idCalc,int *type_stack,LONG_PTR *index_stack,int *pStackPointer,int BaseType){
+	int sp,AnswerType;
+
+	sp=*pStackPointer;
+ 
+	AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(BaseType)&&idCalc==CALC_QUOTIENT) AnswerType=BaseType;
+
+	if(IsRealNumberType(AnswerType)){
+		///////////////
+		// 実数演算
+		///////////////
+
+		if(IsWholeNumberType(type_stack[sp-2])) dbl_stack[sp-2]=(double)i64stack[sp-2];
+		if(IsWholeNumberType(type_stack[sp-1])) dbl_stack[sp-1]=(double)i64stack[sp-1];
+
+
+		//比較演算
+		if(idCalc==CALC_PE){
+			if(dbl_stack[sp-2]<=dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_QE){
+			if(dbl_stack[sp-2]>=dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_P){
+			if(dbl_stack[sp-2]<dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_Q){
+			if(dbl_stack[sp-2]>dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_NOTEQUAL){
+			if(dbl_stack[sp-2]!=dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_EQUAL){
+			if(dbl_stack[sp-2]==dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+
+		//論理演算
+		else if(idCalc==CALC_XOR)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]^(long)dbl_stack[sp-1]);
+		else if(idCalc==CALC_OR)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]|(long)dbl_stack[sp-1]);
+		else if(idCalc==CALC_AND)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]&(long)dbl_stack[sp-1]);
+
+		//シフト演算
+		else if(idCalc==CALC_SHL)			dbl_stack[sp-2]=(double)((DWORD)dbl_stack[sp-2]<<(DWORD)dbl_stack[sp-1]);
+		else if(idCalc==CALC_SHR)			dbl_stack[sp-2]=(double)((DWORD)dbl_stack[sp-2]>>(DWORD)dbl_stack[sp-1]);
+
+		//算術演算
+		else if(idCalc==CALC_ADDITION)		dbl_stack[sp-2]+=dbl_stack[sp-1];
+		else if(idCalc==CALC_SUBTRACTION)	dbl_stack[sp-2]-=dbl_stack[sp-1];
+		else if(idCalc==CALC_MOD)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]%(long)dbl_stack[sp-1]);
+		else if(idCalc==CALC_PRODUCT)		dbl_stack[sp-2]*=dbl_stack[sp-1];
+		else if(idCalc==CALC_QUOTIENT){
+			if(dbl_stack[sp-1])
+				dbl_stack[sp-2]/=dbl_stack[sp-1];
+			else{
+				//ゼロ割りエラーを検地
+				SetError(56,NULL,cp);
+			}
+		}
+		else if(idCalc==CALC_INTQUOTIENT){
+			if(dbl_stack[sp-1])
+				dbl_stack[sp-2]=(double)(long)(dbl_stack[sp-2]/dbl_stack[sp-1]);
+			else{
+				//ゼロ割りエラーを検地
+				SetError(56,NULL,cp);
+			}
+		}
+		else if(idCalc==CALC_POWER)			dbl_stack[sp-2]=pow(dbl_stack[sp-2],dbl_stack[sp-1]);
+	}
+	else{
+		///////////////
+		// 整数演算
+		///////////////
+
+		if(IsRealNumberType(type_stack[sp-2])) i64stack[sp-2]=(_int64)dbl_stack[sp-2];
+		if(IsRealNumberType(type_stack[sp-1])) i64stack[sp-1]=(_int64)dbl_stack[sp-1];
+
+
+		//比較演算
+		if(idCalc==CALC_PE){
+			if(IsSignedType(AnswerType)){
+				if(i64stack[sp-2]<=i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])<=((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_QE){
+			if(IsSignedType(AnswerType)){
+				if(i64stack[sp-2]>=i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])>=((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_P){
+			if(IsSignedType(AnswerType)){
+				if(i64stack[sp-2]<i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])<((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_Q){
+			if(IsSignedType(AnswerType)){
+				AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+				if(i64stack[sp-2]>i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])>((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_NOTEQUAL){
+			if(i64stack[sp-2]!=i64stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_EQUAL){
+			if(i64stack[sp-2]==i64stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+
+		//論理演算
+		else if(idCalc==CALC_XOR)			i64stack[sp-2]^=i64stack[sp-1];
+		else if(idCalc==CALC_OR)			i64stack[sp-2]|=i64stack[sp-1];
+		else if(idCalc==CALC_AND)			i64stack[sp-2]&=i64stack[sp-1];
+
+		//シフト演算
+		else if(idCalc==CALC_SHL){
+			i64stack[sp-2]<<=(DWORD)i64stack[sp-1];
+			if(IsSignedType(AnswerType)) AnswerType=DEF_LONG;
+			else AnswerType=DEF_DWORD;
+		}
+		else if(idCalc==CALC_SHR){
+			i64stack[sp-2]>>=(DWORD)i64stack[sp-1];
+			if(IsSignedType(AnswerType)) AnswerType=DEF_LONG;
+			else AnswerType=DEF_DWORD;
+		}
+
+		//算術演算
+		else if(idCalc==CALC_ADDITION)		i64stack[sp-2]+=i64stack[sp-1];
+		else if(idCalc==CALC_SUBTRACTION)	i64stack[sp-2]-=i64stack[sp-1];
+		else if(idCalc==CALC_MOD)			i64stack[sp-2]%=i64stack[sp-1];
+		else if(idCalc==CALC_PRODUCT)		i64stack[sp-2]*=i64stack[sp-1];
+		else if(idCalc==CALC_QUOTIENT||
+			idCalc==CALC_INTQUOTIENT){
+			if(i64stack[sp-1])
+				i64stack[sp-2]/=i64stack[sp-1];
+			else{
+				//ゼロ割りエラーを検地
+				SetError(56,NULL,cp);
+			}
+		}
+		else if(idCalc==CALC_POWER)			i64stack[sp-2]=(_int64)pow((double)i64stack[sp-2],(double)i64stack[sp-1]);
+
+		if(IsSignedType(AnswerType)){
+			if(AnswerType==DEF_SBYTE&&(i64stack[sp-2]<CHAR_MIN||CHAR_MAX<i64stack[sp-2])){
+				//符号有り8ビット値をはみ出したとき
+				AnswerType=DEF_INTEGER;
+			}
+			if(AnswerType==DEF_INTEGER&&(i64stack[sp-2]<SHRT_MIN||SHRT_MAX<i64stack[sp-2])){
+				//符号有り16ビット値をはみ出したとき
+				AnswerType=DEF_LONG;
+			}
+			if(i64stack[sp-2]<LONG_MIN||LONG_MAX<i64stack[sp-2]){
+				//符号有り32ビット値をはみ出したとき
+				AnswerType=DEF_INT64;
+			}
+		}
+		else{
+			if(UINT_MAX<((unsigned _int64)i64stack[sp-2])){
+				//符号無し32ビット値をはみ出したとき
+				AnswerType=DEF_QWORD;
+			}
+		}
+	}
+
+	type_stack[sp-2]=AnswerType;
+	index_stack[sp-2]=-1;
+
+	sp--;
+	*pStackPointer=sp;
+}
+
+bool StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,Type &resultType,BOOL bDebuggingWatchList, bool *pIsMemoryAccessError){
+	extern int cp;
+	int i,i2,i3,PareNum;
+	char Parms[1024],temporary[VN_SIZE],temp2[VN_SIZE];
+
+	_int64 i64data;
+	double nums[255];
+	_int64 i64nums[255];
+	char *StrPtr[255];
+	long calc[255];
+	_int64 stack[255];
+	int type[255];
+	LONG_PTR before_index[255];
+	int sp,pnum;
+
+	if( pIsMemoryAccessError ) *pIsMemoryAccessError = false;
+
+	*pi64data=0;
+	if(Command[0]=='\0') return false;
+
+	for(i=0,i2=0,sp=0,pnum=0,PareNum=0;;i++,i2++){
+		if(Command[i]=='\"'){
+			Parms[i2]=Command[i];
+			for(i++,i2++;;i++,i2++){
+				Parms[i2]=Command[i];
+				if(Command[i]=='\"') break;
+			}
+			continue;
+		}
+		else if(Command[i]=='['){
+			i3=GetStringInBracket(Parms+i2,Command+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Command[i]=='('){
+			if(i==0){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else if(IsNumCalcMark_Back(Command,i-1)||Command[i-1]=='('){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else{
+				//配列変数の場合を考慮
+				i3=GetStringInPare(Parms+i2,Command+i);
+				i+=i3-1;
+				i2+=i3-1;
+				continue;
+			}
+		}
+		else if(Command[i]==')'){
+			PareNum--;
+			i2--;
+			continue;
+		}
+		else if(IsNumCalcMark(Command,i)||Command[i]=='\0'){
+			if((Command[i]=='+'||Command[i]=='-')&&(Command[i-1]=='e'||Command[i-1]=='E')){
+				if(IsExponent(Command,i)){
+					Parms[i2]=Command[i];
+					continue;
+				}
+			}
+			Parms[i2]=0;
+
+			if(stack[sp-1]==CALC_AS&&Command[i]=='*'){
+				for(i3=0;i3<i2;i3++){
+					if(Parms[i2]!='*') break;
+				}
+				if(i3==i2){
+					//"*"をポインタ指定文字として認識する
+					Parms[i2]=Command[i];
+					continue;
+				}
+			}
+
+			calc[pnum]=0;
+			if(i2){
+				before_index[pnum]=-1;
+
+				i3=GetCallProcName(Parms,temporary);
+				if(Parms[i3]=='('){
+					lstrcpy(temp2,Parms+i3+1);
+					temp2[lstrlen(temp2)-1]=0;
+
+					if(lstrcmpi(temporary,"SizeOf")==0){
+						//SizeOf関数
+
+						type[pnum]=DEF_LONG;
+
+						Type tempType;
+						if( !Type::StringToType( temp2, tempType ) ){
+							if(enableerror) SetError(3,temp2,cp);
+							return false;
+						}
+						i64nums[pnum] = tempType.GetSize();
+						StrPtr[pnum]=0;
+					}
+					else{
+						//定数関数
+
+						if(!GetConstCalcBuffer(temporary,temp2,Parms)){
+							if(enableerror) SetError(3,temporary,cp);
+							return false;
+						}
+
+						Type tempType;
+						StaticCalculation(enableerror, Parms,BaseType,&i64data,tempType);
+						type[pnum] = tempType.GetBasicType();
+						before_index[pnum] = tempType.GetIndex();
+						if(tempType.IsReal()){
+							//実数型
+							memcpy(&nums[pnum],&i64data,sizeof(double));
+						}
+						else{
+							//整数型
+							i64nums[pnum]=i64data;
+						}
+
+						StrPtr[pnum]=0;
+					}
+				}
+				else{
+					if(Parms[0]=='\"'){
+						//文字列の場合（比較演算子を考慮）
+						RemoveStringQuotes(Parms);
+						i2=lstrlen(Parms);
+
+						nums[pnum]=i2;
+						StrPtr[pnum]=(char *)HeapAlloc(hHeap,0,i2+1);
+						memcpy(StrPtr[pnum],Parms,i2);
+						StrPtr[pnum][i2]=0;
+
+						type[pnum]=typeOfPtrChar;
+						before_index[pnum]=LITERAL_STRING;
+					}
+					else if((Parms[0]=='e'||Parms[0]=='E')&&
+						(Parms[1]=='x'||Parms[1]=='X')&&
+						Parms[2]=='\"'){
+						//拡張文字列
+						RemoveStringQuotes(Parms+2);
+						i2=FormatString_EscapeSequence(Parms+2);
+						nums[pnum]=i2;
+						StrPtr[pnum]=(char *)HeapAlloc(hHeap,0,(int)i2+1);
+						memcpy(StrPtr[pnum],Parms+2,i2);
+						StrPtr[pnum][i2]=0;
+
+						type[pnum]=typeOfPtrChar;
+						before_index[pnum]=LITERAL_STRING;
+					}
+					else if(IsVariableTopChar(Parms[0])||Parms[0]=='*'||(Parms[0]=='.'&&IsVariableTopChar(Parms[1]))){
+						if(bDebuggingWatchList){
+							//////////////////////////
+							// 変数（デバッグ時のみ）
+							//////////////////////////
+
+							RELATIVE_VAR RelativeVar;
+							int ss[MAX_ARRAYDIM];
+							void *offset;
+							DWORD dwData;
+							SIZE_T accessBytes;
+							float flt;
+
+							extern HANDLE hDebugProcess;
+
+							Type tempType;
+							i3=Debugging_GetVarOffset(Parms,&RelativeVar,tempType,ss);
+							if(i3==0){
+								//式エラー
+								return false;
+							}
+							if(i3==-1){
+								//メモリにアクセスできないとき
+								if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
+								return false;
+							}
+
+							if(i3){
+								StrPtr[pnum]=0;
+								offset=(void *)Debugging_GetVarPtr(&RelativeVar);
+
+								type[pnum]=tempType.GetBasicType();
+
+								if(tempType.IsDouble()){
+									i3=ReadProcessMemory(hDebugProcess,offset,&nums[pnum],sizeof(double),&accessBytes);
+								}
+								else if(tempType.IsSingle()){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&flt,sizeof(float),&accessBytes)){
+										nums[pnum]=(double)flt;
+									}
+								}
+								else if(tempType.IsPointer()){
+									LONG_PTR lpData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&lpData,sizeof(LONG_PTR),&accessBytes)){
+										i64nums[pnum]=(_int64)lpData;
+									}
+								}
+								else if(tempType.Is64()){
+									type[pnum]=DEF_INT64;
+
+									i3=ReadProcessMemory(hDebugProcess,offset,&i64nums[pnum],sizeof(_int64),&accessBytes);
+								}
+
+								else if(tempType.IsLong()){
+									long lData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&lData,sizeof(long),&accessBytes)){
+										i64nums[pnum]=(_int64)lData;
+									}
+								}
+								else if(tempType.IsDWord()){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&dwData,sizeof(DWORD),&accessBytes)){
+										i64nums[pnum]=(_int64)dwData;
+									}
+								}
+								else if(tempType.IsInteger()){
+									short shortData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&shortData,sizeof(short),&accessBytes)){
+										i64nums[pnum]=(_int64)shortData;
+									}
+								}
+								else if(tempType.IsWord()){
+									WORD wData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&wData,sizeof(WORD),&accessBytes)){
+										i64nums[pnum]=(_int64)wData;
+									}
+								}
+								else if(tempType.IsSByte()){
+									char charData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&charData,sizeof(char),&accessBytes)){
+										i64nums[pnum]=(_int64)charData;
+									}
+								}
+								else if(tempType.IsByte()){
+									BYTE byteData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&accessBytes)){
+										i64nums[pnum]=(_int64)byteData;
+									}
+								}
+								else if(tempType.IsBoolean()){
+									BYTE byteData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&accessBytes)){
+										i64nums[pnum]=(_int64)byteData;
+									}
+								}
+								else return false;
+
+								if(!i3){
+									//読み込みに失敗
+									if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
+									return false;
+								}
+								goto JumpConst;
+							}
+						}
+
+
+						/////////
+						//定数
+						/////////
+						StrPtr[pnum]=0;
+						type[pnum] = CDBConst::obj.GetBasicType(Parms);
+						if(type[pnum]){
+							if(IsRealNumberType(type[pnum])){
+								//実数型
+								nums[pnum] = CDBConst::obj.GetDoubleData(Parms);
+							}
+							else if(IsWholeNumberType(type[pnum])){
+								//整数
+								i64nums[pnum] = CDBConst::obj.GetWholeData(Parms);
+							}
+/*							else if(type[pnum]==DEF_STRING){
+								//リテラル文字列
+
+								//バイト数
+								nums[pnum]=dbl;
+								i2=(int)dbl;
+
+								memcpy(Parms,temporary,(int)nums[pnum]);
+								goto StrLiteral;
+							}*/
+							else{
+								//エラー
+								if(enableerror) SetError(300,NULL,cp);
+								return 0;
+							}
+							goto JumpConst;
+						}
+
+
+						//////////////
+						// 型名の場合
+						//////////////
+
+						{
+							Type tempType;
+							if( !Type::StringToType( Parms, tempType ) ){
+								if(bDebuggingWatchList){
+									if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
+									return false;
+								}
+								//エラー
+								if(enableerror) SetError(3,Parms,cp);
+								return false;
+							}
+
+							if( tempType.IsObject() ){
+								if( tempType.GetClass().IsBlittableType() ){
+									// Blittable型のときは基本型として扱う
+									tempType = tempType.GetClass().GetBlittableType();
+								}
+							}
+
+							type[pnum] = tempType.GetBasicType();
+							before_index[pnum] = tempType.GetIndex();
+						}
+
+JumpConst:;
+					}
+					else{
+						//リテラル値
+						StrPtr[pnum]=0;
+						type[pnum]=GetLiteralValue(Parms,&i64data,BaseType);
+						if(IsRealNumberType(type[pnum])){
+							//実数型
+							memcpy(&nums[pnum],&i64data,sizeof(double));
+						}
+						else{
+							//整数型
+							i64nums[pnum]=i64data;
+							before_index[pnum]=GetLiteralIndex(i64data);
+						}
+					}
+				}
+
+				pnum++;
+			}
+			else{
+				if(!(Command[i]=='+'||Command[i]=='-'||(Command[i]==1&&Command[i+1]==ESC_NOT))){
+					if(enableerror) SetError(1,NULL,cp);
+					return false;
+				}
+				if(Command[i]=='+'){
+					i2=-1;
+					continue;
+				}
+			}
+
+			if(Command[i]=='\0'){
+				for(;sp>0;pnum++){
+					sp--;
+					calc[pnum]=(int)stack[sp];
+				}
+				break;
+			}
+
+			//論理演算子
+			if(Command[i]==1&&Command[i+1]==ESC_XOR) i3=CALC_XOR;
+			else if(Command[i]==1&&Command[i+1]==ESC_OR) i3=CALC_OR;
+			else if(Command[i]==1&&Command[i+1]==ESC_AND) i3=CALC_AND;
+			else if(Command[i]==1&&Command[i+1]==ESC_NOT) i3=CALC_NOT;
+
+			//ビット演算子（優先順位は算術演算子の後部）
+			else if(Command[i]=='<'&&Command[i+1]=='<'){
+				i3=CALC_SHL;
+				i++;
+			}
+			else if(Command[i]=='>'&&Command[i+1]=='>'){
+				i3=CALC_SHR;
+				i++;
+			}
+
+			//比較演算子
+			else if(Command[i]=='<'&&Command[i+1]=='='||
+				Command[i]=='='&&Command[i+1]=='<'){
+				i3=CALC_PE;
+				i++;
+			}
+			else if(Command[i]=='>'&&Command[i+1]=='='||
+				Command[i]=='='&&Command[i+1]=='>'){
+				i3=CALC_QE;
+				i++;
+			}
+			else if(Command[i]=='<'&&Command[i+1]=='>'||
+				Command[i]=='>'&&Command[i+1]=='<'){
+				i3=CALC_NOTEQUAL;
+				i++;
+			}
+			else if(Command[i]=='=') i3=CALC_EQUAL;
+			else if(Command[i]=='<') i3=CALC_P;
+			else if(Command[i]=='>') i3=CALC_Q;
+
+			//算術演算子
+			else if(Command[i]=='+'||Command[i]=='&') i3=CALC_ADDITION;
+			else if(Command[i]=='-'&&i2) i3=CALC_SUBTRACTION;
+			else if(Command[i]==1&&Command[i+1]==ESC_MOD) i3=CALC_MOD;
+			else if(Command[i]=='*') i3=CALC_PRODUCT;
+			else if(Command[i]=='/') i3=CALC_QUOTIENT;
+			else if(Command[i]=='\\') i3=CALC_INTQUOTIENT;
+			else if(Command[i]=='-'&&i2==0) i3=CALC_MINUSMARK;
+			else if(Command[i]=='^') i3=CALC_POWER;
+			else if(Command[i]==1&&Command[i+1]==ESC_AS) i3=CALC_AS;
+			else if(Command[i]==1&&Command[i+1]==ESC_BYVAL) i3=CALC_BYVAL;
+
+			i3+=PareNum*100;
+			if(sp){
+				if(stack[sp-1]>i3-3&&
+					(!(
+					(stack[sp-1]%100==CALC_MINUSMARK||stack[sp-1]%100==CALC_NOT)&&
+					(i3%100==CALC_MINUSMARK||i3%100==CALC_NOT)
+					))
+					){
+					for(;sp>0;){
+						sp--;
+						calc[pnum]=(int)stack[sp];
+						pnum++;
+						if(!(stack[sp-1]>i3-3)) break;
+					}
+				}
+			}
+			stack[sp]=i3;
+			sp++;
+
+			if(Command[i]==1) i++;
+			i2=-1;
+			continue;
+		}
+		Parms[i2]=Command[i];
+	}
+
+	int type_stack[255];
+	LONG_PTR index_stack[255];
+	int idCalc;
+	for(i=0,sp=0;i<pnum;i++){
+
+		if( enableerror ){
+			//型チェック（正常でない場合はエラーにする）
+			TypeErrorCheck(stack,sp,calc[i]%100);
+		}
+
+		idCalc=calc[i]%100;
+
+		switch(idCalc){
+			//数値
+			case 0:
+				dbl_stack[sp]=nums[i];
+				i64stack[sp]=i64nums[i];
+				type_stack[sp]=type[i];
+				index_stack[sp]=before_index[i];
+
+				stack[sp]=(_int64)StrPtr[i];
+				sp++;
+				break;
+
+			//論理演算
+			case CALC_NOT:
+				if(IsRealNumberType(type_stack[sp-1])){
+					//実数演算
+					dbl_stack[sp-1]=(double)(~(long)dbl_stack[sp-1]);
+				}
+				else{
+					//整数演算
+					i64stack[sp-1]=~i64stack[sp-1];
+				}
+				break;
+
+			//比較演算
+			case CALC_PE:
+			case CALC_QE:
+			case CALC_P:
+			case CALC_Q:
+			case CALC_NOTEQUAL:
+			case CALC_EQUAL:
+
+			//論理演算
+			case CALC_XOR:
+			case CALC_OR:
+			case CALC_AND:
+
+			//シフト演算
+			case CALC_SHL:
+			case CALC_SHR:
+
+			//算術演算
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_MOD:
+			case CALC_PRODUCT:
+			case CALC_QUOTIENT:
+			case CALC_INTQUOTIENT:
+			case CALC_POWER:
+				StaticTwoTerm(idCalc,type_stack,index_stack,&sp,BaseType);
+				break;
+
+			case CALC_MINUSMARK:
+				if(IsRealNumberType(type_stack[sp-1])){
+					//実数演算
+					dbl_stack[sp-1]=-dbl_stack[sp-1];
+				}
+				else{
+					//整数演算
+					i64stack[sp-1]=-i64stack[sp-1];
+				}
+				break;
+			case CALC_AS:
+				if(IsWholeNumberType(type_stack[sp-2])){
+					if(IsRealNumberType(type_stack[sp-1])){
+						dbl_stack[sp-2]=(double)i64stack[sp-2];
+					}
+				}
+				if(IsRealNumberType(type_stack[sp-2])){
+					if(IsWholeNumberType(type_stack[sp-1])){
+						i64stack[sp-2]=(_int64)dbl_stack[sp-2];
+					}
+				}
+
+				if( type_stack[sp-1] == DEF_OBJECT || type_stack[sp-1] == DEF_STRUCT ){
+					// リテラル値ではないため抜け出す
+					return false;
+				}
+
+				type_stack[sp-2]=type_stack[sp-1];
+				index_stack[sp-2]=index_stack[sp-1];
+				sp--;
+				break;
+			case CALC_BYVAL:
+				//エラー
+				break;
+		}
+	}
+	if(stack[0]){
+		//文字列ポインタ
+		*pi64data=(_int64)stack[0];
+		resultType.SetType( type_stack[0], index_stack[0] );
+		return true;
+	}
+
+	if(IsRealNumberType(type_stack[0])){
+		//実数
+		memcpy(pi64data,&dbl_stack[0],sizeof(double));
+		resultType.SetType( type_stack[0], index_stack[0] );
+		return true;
+	}
+
+	//整数
+	*pi64data=i64stack[0];
+
+	if(index_stack[0]==-1){
+		if(Is64Type(type_stack[0])==0&&IsRealNumberType(type_stack[0])==0){
+			//整数（符号有り/無し）
+			i64data=*pi64data;
+
+			resultType.SetIndex( GetLiteralIndex(i64data) );
+		}
+	}
+	else{
+		resultType.SetIndex( index_stack[0] );
+	}
+
+	resultType.SetBasicType( type_stack[0] );
+	return true;
+}
+
+#pragma optimize("", off)
+#pragma warning(disable : 4748)
+DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType){
+	extern HANDLE hHeap;
+	extern int cp;
+	int i,i2,i3,sw1,sw2,bDbl;
+	double dbl;
+	char temporary[255];
+
+	if(value[0]=='&'){
+		_int64 i64temp;
+		lstrcpy(temporary,value);
+
+		if(temporary[1]=='o'||temporary[1]=='O'){
+			for(i=2;;i++){
+				i3=temporary[i]-0x30;
+				if(i3<0||7<i3) break;
+				temporary[i]=i3;
+			}
+			if(temporary[i]){
+				SetError(57,NULL,cp);
+				return DEF_BYTE;
+			}
+
+			i64temp=1;
+			*pi64=0;
+			for(i--;i>=2;i--){
+				*pi64=(*pi64)+(_int64)(i64temp*temporary[i]);
+				i64temp*=8;
+			}
+		}
+		else if(temporary[1]=='h'||temporary[1]=='H'){
+			CharUpper(temporary+2);
+			for(i=2;;i++){
+				i3=temporary[i]-0x30;
+				if(i3<0||9<i3){
+					i3=temporary[i]-0x41+10;
+					if(i3<0xA||0xF<i3) break;
+				}
+				temporary[i]=i3;
+			}
+			if(temporary[i]){
+				SetError(58,NULL,cp);
+				return DEF_BYTE;
+			}
+
+			i64temp=1;
+			*pi64=0;
+			for(i--;i>=2;i--){
+				*pi64=(*pi64)+(_int64)(i64temp*temporary[i]);
+				i64temp*=0x10;
+			}
+		}
+		else{
+			SetError(12,"&",cp);
+			return DEF_BYTE;
+		}
+
+		if(BaseType==DEF_INT64||BaseType==DEF_QWORD) return DEF_QWORD;
+
+		if(((unsigned _int64)*pi64)<=UCHAR_MAX){
+			//符号無し8ビット整数のリテラル値
+			return DEF_BYTE;
+		}
+		else if(((unsigned _int64)*pi64)<=USHRT_MAX){
+			//符号無し16ビット整数のリテラル値
+			return DEF_WORD;
+		}
+		else if(((unsigned _int64)*pi64)<=UINT_MAX){
+			//符号無し32ビット整数のリテラル値
+			return DEF_DWORD;
+		}
+		else{
+			//符号無し64ビット整数のリテラル値
+			return DEF_QWORD;
+		}
+	}
+	else if((value[0]>='0'&&value[0]<='9')||value[0]=='+'||value[0]=='-'||(value[0]=='.'&&(!IsVariableTopChar(value[1])))){
+		for(i=0;;i++){
+			if(value[i]!='-') break;
+		}
+		if(value[i]=='.'){
+			SlideString(value+i,1);
+			value[i]='0';
+		}
+
+		//エラーチェック
+		bDbl=0;
+		sw1=0;
+		sw2=0;
+		for(i2=i;;i2++){
+			if(value[i2]=='\0') break;
+			if(value[i2]=='.') bDbl=1;
+			if(!((value[i2]>='0'&&value[i2]<='9')||value[i2]=='.')){
+				if((value[i2]=='e'||value[i2]=='E')&&sw1==0){
+					bDbl=1;
+					sw1=1;
+				}
+				else if((value[i2]=='+'||value[i2]=='-')&&sw1==1&&sw2==0) sw2=1;
+				else{
+					extern BOOL bDebugRun;
+					if(bDebugRun) return DEF_DOUBLE;
+
+					SetError(3,value,cp);
+					return DEF_DOUBLE;
+				}
+			}
+		}
+
+		if(bDbl){
+			//実数のリテラル値
+			if(i%2) dbl=-atof(value+i);
+			else dbl=atof(value+i);
+
+			memcpy(pi64,&dbl,sizeof(double));
+
+			if(BaseType==DEF_SINGLE) return DEF_SINGLE;
+
+			return DEF_DOUBLE;
+		}
+		else{
+			*pi64=_atoi64(value+i);
+			if(i%2) *pi64=-(*pi64);
+
+			if(BaseType==DEF_INT64||BaseType==DEF_QWORD) return BaseType;
+
+			if(LONG_MIN<=*pi64&&*pi64<=LONG_MAX){
+				//符号有り32ビット整数のリテラル値
+				return DEF_LONG;
+			}
+			else if(*pi64<=UINT_MAX){
+				//符号無し32ビット整数のリテラル値
+				return DEF_DWORD;
+			}
+			else{
+				//符号有り64ビット整数のリテラル値
+				return DEF_INT64;
+			}
+		}
+	}
+
+	extern BOOL bDebugRun;
+	if(bDebugRun) return DEF_DOUBLE;
+
+	SetError(33,NULL,cp);
+	return DEF_DOUBLE;
+}
+#pragma optimize("", on)
+
+BOOL GetConstCalcBuffer(const char *name,const char *Parameter,char *pCalcBuffer){
+	extern HANDLE hHeap;
+	int i2,i3,i4,num;
+	char temporary[VN_SIZE];
+	char *pParms[MAX_PARMS];
+
+	CONSTINFO *pci;
+	pci=GetConstHash(name);
+	if(!pci) return 0;
+
+	num=0;
+	i2=0;
+	while(1){
+		i2=GetOneParameter(Parameter,i2,temporary);
+
+		pParms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(pParms[num],temporary);
+
+		num++;
+		if(Parameter[i2]=='\0') break;
+	}
+	if(num!=pci->ParmNum){
+		extern int cp;
+		for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
+		SetError(10,name,cp);
+		lstrcpy(pCalcBuffer,"0");
+		return 1;
+	}
+
+	i2=0;
+	i4=0;
+	while(1){
+
+		//数式内の項を取得
+		for(i3=0;;i2++,i3++){
+			if(!IsVariableChar(pci->StrValue[i2])){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3]=pci->StrValue[i2];
+		}
+
+		//パラメータと照合する
+		for(i3=0;i3<pci->ParmNum;i3++){
+			if(lstrcmp(pci->ppParm[i3],temporary)==0) break;
+		}
+
+		if(i3==pci->ParmNum){
+			//パラメータでないとき
+			lstrcpy(pCalcBuffer+i4,temporary);
+			i4+=lstrlen(temporary);
+		}
+		else{
+			//パラメータのとき
+			lstrcpy(pCalcBuffer+i4,pParms[i3]);
+			i4+=lstrlen(pParms[i3]);
+		}
+
+		//演算子をコピー
+		for(;;i2++,i4++){
+			if(pci->StrValue[i2]==1){
+				pCalcBuffer[i4++]=pci->StrValue[i2++];
+				pCalcBuffer[i4]=pci->StrValue[i2];
+				continue;
+			}
+			if(IsVariableTopChar(pci->StrValue[i2])) break;
+			pCalcBuffer[i4]=pci->StrValue[i2];
+			if(pci->StrValue[i2]=='\0') break;
+		}
+
+		if(pci->StrValue[i2]=='\0') break;
+	}
+
+	for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
+
+	return 1;
+}
+DWORD GetConstValue(char *name,double *pDbl,char *buffer,LONG_PTR *plpIndex){
+	CONSTINFO *pci;
+	pci=GetConstHash(name);
+	if(pci){
+		//定数が見つかったとき
+
+		if(pci->StrValue){
+			//文字列定数
+
+			//バイト数
+			*pDbl=pci->DblValue;
+
+			//データ
+			memcpy(buffer,pci->StrValue,(int)pci->DblValue);
+
+			if(plpIndex) *plpIndex=pci->lpIndex;
+
+			return DEF_STRING;
+		}
+		else{
+			if(pci->type==DEF_INT64){
+				memcpy(pDbl,&pci->i64Value,sizeof(_int64));
+				return DEF_INT64;
+			}
+
+			if(plpIndex) *plpIndex=pci->lpIndex;
+
+			*pDbl=pci->DblValue;
+			return pci->type;
+		}
+	}
+
+	if(plpIndex) *plpIndex=-1;
+
+	return -1;
+}
+int IsStrCalculation(char *Command){
+	int i,i2,i3,i4,PareNum;
+	char temporary[VN_SIZE],temp2[8192];
+
+	for(i=0,i2=0;;i++){
+		if(Command[i]=='('){
+			for(i++,PareNum=1;;i++){
+				if(Command[i]=='(') PareNum++;
+				else if(Command[i]==')'){
+					PareNum--;
+					if(PareNum==0) break;
+				}
+			}
+			continue;
+		}
+		if(Command[i]=='['){
+			for(i++,PareNum=1;;i++){
+				if(Command[i]=='[') PareNum++;
+				else if(Command[i]==']'){
+					PareNum--;
+					if(PareNum==0) break;
+				}
+			}
+			continue;
+		}
+		if(Command[i]=='\"'){
+			i++;
+			while(Command[i]!='\"') i++;
+			continue;
+		}
+		if(Command[i]=='\0'){
+			if(IsVariableTopChar(Command[i2])||
+				Command[i2]=='.'&&IsVariableTopChar(Command[i2+1])){
+
+				if((Command[i2]=='e'||Command[i2]=='E')&&
+					(Command[i2+1]=='x'||Command[i2+1]=='X')&&
+					Command[i2+2]=='\"'){
+					//拡張文字列
+					return 1;
+				}
+
+				for(i3=0;;i3++){
+					if(Command[i2+i3]=='('){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=Command[i2+i3];
+					if(Command[i2+i3]=='\0') break;
+				}
+				if(Command[i2+i3]=='('){
+
+					//DLL関数の場合
+					DllProc *pDllProc;
+					pDllProc=GetDeclareHash(temporary);
+					if(pDllProc){
+						if( pDllProc->ReturnType().IsStringClass() ){
+							return 1;
+						}
+						return 0;
+					}
+
+					//ユーザー定義関数
+					UserProc *pUserProc;
+					pUserProc=GetSubHash(temporary);
+					if(pUserProc){
+						if( pUserProc->ReturnType().IsStringClass() ){
+							return 1;
+						}
+						return 0;
+					}
+
+					//組み込み関数
+					i4=GetFunctionFromName(temporary);
+					if(i4){
+						//組み込み関数は文字列を返さない
+						return 0;
+					}
+
+					//定数
+					CONSTINFO *pci;
+					pci=GetConstHash(temporary);
+					if(pci){
+
+						if(pci->ParmNum){
+							//マクロ関数の場合
+							GetStringInPare_RemovePare(temporary,Command+i2+i3+1);
+							GetConstCalcBuffer(pci->name,temporary,temp2);
+							return IsStrCalculation(temp2);
+						}
+
+						if(pci->type==DEF_STRING) return 1;
+						else return 0;
+					}
+				}
+
+				//定数
+				i3 = CDBConst::obj.GetBasicType(Command+i2);
+				if(i3==DEF_STRING) return 1;	//文字列
+				if(i3) return 0;			//数値
+
+				//変数
+				Type varType;
+				if( !GetVarType(Command+i2,varType,1) ){
+					//エラー
+					return -1;
+				}
+				if( varType.IsStringClass() ){
+					return 1;
+				}
+			}
+			else if(Command[i2]=='\"') return 1;
+			break;
+		}
+		if(IsNumCalcMark(Command,i)||IsStrCalcMark(Command[i])){
+			if(IsStrCalcMark(Command[i])){
+
+				//&H、&O表記の場合を考慮
+				if(i==0) continue;
+				if(IsNumCalcMark(Command,i-1)) continue;
+
+				if(Command[i+1]=='(') break;
+				i2=i+1;
+				continue;
+			}
+			break;
+		}
+	}
+	return 0;
+}
+
+BYTE GetCalcId(const char *Command,int *pi){
+	*pi=0;
+
+	if(Command[0]==1) *pi=1;
+
+	//論理演算子
+	if(Command[0]==1&&Command[1]==ESC_XOR) return CALC_XOR;
+	else if(Command[0]==1&&Command[1]==ESC_OR) return CALC_OR;
+	else if(Command[0]==1&&Command[1]==ESC_AND) return CALC_AND;
+	else if(Command[0]==1&&Command[1]==ESC_NOT) return CALC_NOT;
+
+	//ビット演算子（優先順位は算術演算子の後部）
+	else if(Command[0]=='<'&&Command[1]=='<'){
+		*pi=1;
+		return CALC_SHL;
+	}
+	else if(Command[0]=='>'&&Command[1]=='>'){
+		*pi=1;
+		return CALC_SHR;
+	}
+
+	//比較演算子
+	else if(Command[0]=='<'&&Command[1]=='='||
+		Command[0]=='='&&Command[1]=='<'){
+		*pi=1;
+		return CALC_PE;
+	}
+	else if(Command[0]=='>'&&Command[1]=='='||
+		Command[0]=='='&&Command[1]=='>'){
+		*pi=1;
+		return CALC_QE;
+	}
+	else if(Command[0]=='<'&&Command[1]=='>'||
+		Command[0]=='>'&&Command[1]=='<'){
+		*pi=1;
+		return CALC_NOTEQUAL;
+	}
+	else if(Command[0]=='=') return CALC_EQUAL;
+	else if(Command[0]=='<') return CALC_P;
+	else if(Command[0]=='>') return CALC_Q;
+
+	//算術演算子
+	else if(Command[0]=='+') return CALC_ADDITION;
+	else if(Command[0]=='-') return CALC_SUBTRACTION;
+	else if(Command[0]=='&') return CALC_STRPLUS;
+	else if(Command[0]==1&&Command[1]==ESC_MOD) return CALC_MOD;
+	else if(Command[0]=='*') return CALC_PRODUCT;
+	else if(Command[0]=='/') return CALC_QUOTIENT;
+	else if(Command[0]=='\\') return CALC_INTQUOTIENT;
+	else if(Command[0]=='^') return CALC_POWER;
+	else if(Command[0]==1&&Command[1]==ESC_AS) return CALC_AS;
+	else if(Command[0]==1&&Command[1]==ESC_BYVAL) return CALC_BYVAL;
+
+	return 0;
+}
+BOOL GetNumOpeElements(const char *Command,int *pnum,
+					   char *values[255],long calc[255],long stack[255]){
+	extern int cp;
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,PareNum,sp;
+	char temporary[1024];
+
+	for(i=0,i2=0,sp=0,*pnum=0,PareNum=0;;i++,i2++){
+		if(Command[i]=='\"'){
+			temporary[i2]=Command[i];
+			for(i++,i2++;;i++,i2++){
+				temporary[i2]=Command[i];
+				if(Command[i]=='\"') break;
+			}
+			continue;
+		}
+		else if(Command[i]=='['){
+			i3=GetStringInBracket(temporary+i2,Command+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Command[i]=='('){
+			if(i==0){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else if(IsNumCalcMark_Back(Command,i-1)||Command[i-1]=='('){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else{
+				//配列変数の場合を考慮
+				i3=GetStringInPare(temporary+i2,Command+i);
+				i+=i3-1;
+				i2+=i3-1;
+				continue;
+			}
+		}
+		else if(Command[i]==')'){
+			PareNum--;
+			i2--;
+			continue;
+		}
+		else if(IsNumCalcMark(Command,i)||(Command[i]=='&'&&i2!=0)){
+			if((Command[i]=='+'||Command[i]=='-')&&(Command[i-1]=='e'||Command[i-1]=='E')){
+				if(IsExponent(Command,i)){
+					temporary[i2]=Command[i];
+					continue;
+				}
+			}
+			temporary[i2]=0;
+
+			if((stack[sp-1]%100)==CALC_AS&&Command[i]=='*'){
+				for(i3=0;i3<i2;i3++){
+					if(temporary[i2]!='*') break;
+				}
+				if(i3==i2){
+					//"*"をポインタ指定文字として認識する
+					temporary[i2]=Command[i];
+					continue;
+				}
+			}
+
+			calc[*pnum]=0;
+			if(i2){
+				values[*pnum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+255);
+				lstrcpy(values[*pnum],temporary);
+				(*pnum)++;
+			}
+			else{
+				if(!(
+						Command[i]=='+'||
+						Command[i]=='-'||
+						(Command[i]==1&&Command[i+1]==ESC_NOT)||
+						(Command[i]==1&&Command[i+1]==ESC_BYVAL)
+					)){
+						SetError(1,NULL,cp);
+						return 0;
+				}
+				if(Command[i]=='+'){
+					i2=-1;
+					continue;
+				}
+			}
+
+			if(Command[i]=='-'&&i2==0){
+				i3=CALC_MINUSMARK;
+			}
+			else{
+				i3=GetCalcId(Command+i,&i4);
+				i+=i4;
+				if(!i3){
+					SetError(1,NULL,cp);
+					return 0;
+				}
+			}
+
+			i3+=PareNum*100;
+			if(sp){
+				if(stack[sp-1]>i3-3&&
+					(!(
+					(stack[sp-1]%100==CALC_MINUSMARK || stack[sp-1]%100==CALC_NOT || stack[sp-1]%100==CALC_POWER)&&
+					(i3%100==CALC_MINUSMARK || i3%100==CALC_NOT)
+					))
+					){
+					for(;sp>0;){
+						sp--;
+						calc[*pnum]=stack[sp];
+						values[*pnum]=0;
+						(*pnum)++;
+						if(!(stack[sp-1]>i3-3)) break;
+					}
+				}
+			}
+			stack[sp]=i3;
+			sp++;
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=Command[i];
+		if(Command[i]=='\0'){
+			calc[*pnum]=0;
+
+			values[*pnum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+255);
+			lstrcpy(values[*pnum],temporary);
+			(*pnum)++;
+
+			for(;sp>0;(*pnum)++){
+				sp--;
+				calc[*pnum]=stack[sp];
+				values[*pnum]=0;
+			}
+			break;
+		}
+	}
+
+	calc[*pnum]=0;
+
+	return 1;
+}
Index: /trunk/abdev/BasicCompiler_Common/common.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/common.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/common.h	(revision 147)
@@ -0,0 +1,537 @@
+//#define _CRT_SECURE_NO_DEPRECATE
+#pragma warning(disable : 4996)
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <commctrl.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <vector>
+#include <string>
+#include <fstream>
+
+//boost libraries
+#include <boost/foreach.hpp>
+
+#define foreach BOOST_FOREACH
+
+using namespace std;
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/resource.h"
+#include "../BasicCompiler64/CommandValue.h"
+#include "../BasicCompiler64/FunctionValue.h"
+#define OPCODE_H_PATH "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/resource.h"
+#include "../BasicCompiler32/CommandValue.h"
+#include "../BasicCompiler32/FunctionValue.h"
+#define OPCODE_H_PATH "../BasicCompiler32/opcode.h"
+#endif
+
+#include "../BasicCompiler_Common/BasicFixed.h"
+#include "../BasicCompiler_Common/NonVolatile.h"
+#include "../BasicCompiler_Common/psapi.h"
+#include "../BasicCompiler_Common/BreakPoint.h"
+#include "../BasicCompiler_Common/LexicalScoping.h"
+
+
+
+//バージョン
+#define MAJOR_VER		5
+#define MINOR_VER		00
+#define REVISION_VER	00
+
+#ifdef _AMD64_
+#define VER_INFO		"(x64) (rev.280)"
+#else
+#define VER_INFO		"(rev.280)"
+#endif
+
+#if defined(JPN)
+//日本語
+#include "common_msg_jpn.h"
+#else
+//英語
+#include "common_msg_eng.h"
+#endif
+
+
+#define PTR_SIZE		sizeof(LONG_PTR)
+#define OBJECT_HEAD_SIZE PTR_SIZE*4
+
+#define MAX_LEN			65535
+#define VN_SIZE			512
+#define DIGIT_SIZE		128
+#define MAX_PARMS		64
+#define MAX_ARRAYDIM	16
+#define MAX_HASH		32761
+
+
+#ifdef _AMD64_
+#define PLATFORM	64
+#else
+#define PLATFORM	32
+typedef long LONG_PTR;
+typedef DWORD ULONG_PTR;
+#endif
+
+
+//未定義の定数情報
+#ifndef IMAGE_FILE_MACHINE_AMD64
+	#define IMAGE_FILE_MACHINE_AMD64 0x8664
+#endif
+
+#ifdef _AMD64_
+	#ifndef IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
+		#define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER    240
+	#endif
+#else
+	#ifndef IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
+		#define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER    224
+	#endif
+#endif
+
+
+extern HWND hOwnerEditor;
+extern HANDLE hHeap;
+extern char BasicSystemDir[MAX_PATH];
+extern int cp;
+extern bool isUnicode;
+extern int typeOfPtrChar;
+extern int typeOfPtrUChar;
+
+
+
+//////////////////////////////////////////
+// BasicCompiler、ProjectEditor共通の定数
+//////////////////////////////////////////
+
+//サイズ変更枠の太さ
+#define LEVER_THICK 5
+
+#define WM_SHOWERROR			WM_USER+70	//エラー表示メッセージ
+
+#define WM_SETCOMPILEVIEW		WM_USER+71	//コンパイラウィンドウが表示されたとき
+#define WM_DESTROYCOMPILEVIEW	WM_USER+72	//コンパイラウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERBASE		WM_USER+73	//デバッガベースウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERBASE	WM_USER+74	//デバッガベースウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERVIEW		WM_USER+75	//デバッガウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERVIEW	WM_USER+76	//デバッガウィンドウが表示されたとき
+
+///////////////////////////////////////////
+
+
+#define WM_SHOWVARLIST			WM_USER+80
+#define WM_VARLIST_CLOSE		WM_USER+81	//変数リストの終了メッセージ（破棄のみ、解放なし）
+
+
+
+///////////////////////////////////////////
+// デバッグ コマンド
+
+#define WM_DEBUG_CONTINUE	WM_USER+200
+#define WM_STEP_IN			WM_USER+201
+#define WM_STEP_OVER		WM_USER+202
+#define WM_STEP_CURSOR		WM_USER+203
+#define WM_DEBUG_STOP		WM_USER+204
+#define WM_DEBUG_PAUSE		WM_USER+205
+#define WM_CLOSE_DEBUGGER	WM_USER+206
+
+///////////////////////////////////////////
+
+
+
+
+#define FILE_ALIGNMENT	0x1000
+#define MEM_ALIGNMENT	0x1000
+#define EXE_HEADER_SIZE	0x1000
+
+
+// ログ生成を行うためのクラス
+#include <logger.h>
+
+// クラス管理用のクラス
+#include "Class.h"
+
+// 列挙体管理用のクラス
+#include "Enum.h"
+
+// 定数管理用のクラス
+#include "Const.h"
+
+// 変数管理用のクラス
+#include "Variable.h"
+
+// パラメータ管理用のクラス
+#include "Parameter.h"
+
+// プロシージャ管理用のクラス
+#include "Procedure.h"
+
+// コンパイラが必要とするデータハウス
+#include <Smoothie.h>
+
+
+
+struct ERRORINFO{
+	char *FileName;
+	int line;
+};
+struct INCLUDEFILEINFO{
+	char **ppFileNames;
+	int FilesNum;
+	int LineOfFile[MAX_LEN];
+};
+
+//変数の相対情報
+struct RELATIVE_VAR{
+	DWORD dwKind;
+	LONG_PTR offset;
+	BOOL bOffsetOffset;
+};
+
+struct CONSTINFO{
+	char *name;
+	char *StrValue;
+
+	double DblValue;
+	_int64 i64Value;
+	int type;
+	LONG_PTR lpIndex;
+
+	int ParmNum;
+	char **ppParm;
+
+	CONSTINFO *pNextData;
+};
+
+
+#define CODETYPE_SYSTEMPROC		0x0001
+#define CODETYPE_DEBUGPROC		0x0002
+struct LINEINFO{
+	int TopCp;
+	int TopObp;
+	DWORD dwCodeType;
+};
+struct RESOURCEDATAINFO{
+	DWORD dwId;
+	char FileName[MAX_PATH];
+};
+
+
+//////////////////////////////////////////
+// リソース ヘッダ（アイコン、カーソル用）
+typedef struct{
+	WORD idReserved;
+	WORD idType;
+	WORD idCount;
+}ICONDIR,CURSORDIR;
+
+
+/////////////////////////////
+// .curファイルのヘッダ情報
+struct CURSORDIRENTRY{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wXHotspot;
+	WORD wYHotspot;
+	DWORD dwBytesInRes;
+	DWORD dwImageOffset;
+};
+struct CURSORDIRENTRY_RES{
+	WORD wWidth;
+	WORD wHeight;
+	WORD wXHotspot;
+	WORD wYHotspot;
+	DWORD dwBytesInRes;
+	WORD wCursorNum;
+};
+
+
+////////////////////////////
+//.icoファイルのヘッダ情報
+struct ICONDIRENTRY{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wPlanes;
+	WORD wBitCount;
+	DWORD dwBytesInRes;
+	DWORD dwImageOffset;
+};
+struct ICONDIRENTRY_RES{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wPlanes;
+	WORD wBitCount;
+	DWORD dwBytesInRes;
+	WORD wIconNum;
+};
+
+
+
+#include "../BasicCompiler_Common/PESchedule.h"
+#include "../BasicCompiler_Common/DebugSection.h"
+#include "../BasicCompiler_Common/VariableOpe.h"
+#include <Exception.h>
+
+
+
+bool StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,Type &resultType,BOOL bDebuggingWatchList=0, bool *pIsMemoryAccessError=NULL);
+
+
+//BasicCompiler.cpp
+void HeapDefaultFree(LPVOID lpMem);
+void ts(int i);
+void ts(int i,int i2);
+void ts(char *msg);
+void ts(char *msg,char *title);
+void epi_check();
+void GetRelationalPath(char *path,char *dir);
+void GetFullPath(char *path,char *dir);
+void ShowErrorLine(int LineNum,char *FileName);
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen);
+void MakeMessageText(char *buffer,char *msg,int flag);
+
+//hash.cpp
+int hash_default(const char *name);
+CONSTINFO *GetConstHash(const char *name);
+DllProc *GetDeclareHash(char *name);
+void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs );
+UserProc *GetSubHash(const char *name,BOOL bError=0);
+UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError=0);
+UserProc *GetClassMethod( const char *className, const char *methodName );
+
+//Object.cpp
+void CallConstructor( const char *ObjectName,const int *SubScripts, const Type &type,const char *Parameter);
+bool Operator_New( const char *expression, const Type &baseType, Type &resultType );
+
+//Overload.sbp
+UserProc *OverloadSolutionWithStrParam(
+	const char *name,
+	std::vector<UserProc *> &subs,
+	const char *Parameter,
+	const char *ObjectName);
+UserProc *OverloadSolution(
+	const char *name,
+	std::vector<UserProc *> &subs,
+	const Parameters &params,
+	const Type &returnType );
+
+//Debug.cpp
+void Debugger_StepIn(void);
+void Debugger_StepOver(void);
+void Debugger_StepCursor(void);
+void Debugger_Stop(void);
+void Debugger_Pause(void);
+ULONG_PTR rva_to_real(DWORD p);
+GlobalProc *GetSubFromObp(ULONG_PTR pos);
+void ReadOpBuffer();
+void DebugProgram(void);
+
+//VarList.cpp
+void InitVarList(DWORD dwThreadId);
+BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//WatchList.cpp
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar);
+ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip);
+int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss);
+
+//MakeExe.cpp
+void StepCompileProgress(void);
+void DeleteConstInfo(CONSTINFO **ppConstHash);
+void DeleteDeclareInfo(void);
+void AddSourceCode(char *buffer);
+void OutputExe(void);
+int MainThread(DWORD dummy);
+
+//Intermediate_Step1.cpp
+void ChangeReturnCode(char *buffer);
+void DeleteComment(char *buffer);
+void KillReturnCode(char *buffer);
+void CheckParenthesis(char *buffer);
+BOOL CheckParenthesis2(char *buffer);
+void DirectiveCheck(void);
+void NextCommandFormat(char *buffer);
+void SetEscapeSequenceFormat(char *buffer);
+void DefCommandFormat(char *buffer);
+void IfCommandFormat(char *buffer);
+void CheckPareCommand(void);
+
+//Intermediate_Step2.cpp
+bool GetConstInfo(void);
+void ChangeCommandToCode(char *buffer);
+
+//preprocessor.cpp
+char *OpenBasicFile(char *FileName);
+
+//Resource.cpp
+void GetResourceData(char *FileName);
+
+//CommandFormat.cpp
+void ComOpen(char *Parameter,char *buffer,int nowLine);
+void ComClose(char *Parameter,char *buffer);
+void ComField(char *Parameter,char *buffer);
+void ComLine(char *Parameter,char *buffer,int nowLine);
+void ComCircle(char *Parameter,char *buffer,int nowLine);
+void ComPSet(char *Parameter,char *buffer,int nowLine);
+void ComPaint(char *Parameter,char *buffer,int nowLine);
+
+// StrOperation.cpp
+void KillSpaces(char *str1,char *str2);
+void KillStringSpaces(char *str);
+BOOL RemoveStringQuotes(char *str);
+void RemoveStringPare(char *str);
+void RemoveStringBracket(char *str);
+void SetStringQuotes(char *str);
+int FormatString_EscapeSequence(char *buffer);
+void SlideString(char *str,int slide);
+void SlideBuffer(char *buffer,int length,int slide);
+_int8 IsCommandDelimitation(char c);
+BOOL IsBlank(char c);
+int GetOneParameter(const char *Parameter,int pos,char *retAns);
+int JumpOneParameter(char *Parameter,int i);
+int GetStringInQuotation(char *buffer,char *ReadBuffer);
+int GetStringInPare(char *buffer,const char *ReadBuffer);
+int GetStringInPare_RemovePare(char *buffer,char *ReadBuffer);
+int GetStringInBracket(char *buffer,const char *ReadBuffer);
+int JumpStringInPare(const char *buffer,int pos);
+int JumpStringInBracket(const char *buffer,int pos);
+int GetCpFromLine(int LineNum);
+BOOL GetLineNum(int pos,int *pLine,char *FileName);
+char GetEndXXXCommand(char es);
+void GetDefaultNameFromES(char es,char *name);
+void GetCalcName(int idCalc,char *name);
+BOOL IsFile(char *path);
+BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath);
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle);
+void ShortPathToLongPath(const char *ShortPath,char *LongPath);
+
+//calculation.cpp
+bool IsNumberTopChar(const char *buffer);
+bool IsNumberChar(const char c);
+BOOL IsNumCalcMark(const char *Command,int p);
+BOOL IsNumCalcMark_Back(const char *Command,int p);
+BOOL IsStrCalcMark(const char c);
+BOOL IsExponent(const char *Command,int p);
+int GetLiteralIndex(_int64 i64data);
+int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2);
+DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType);
+BOOL GetConstCalcBuffer(const char *name,const char *Parameter,char *pCalcBuffer);
+DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex);
+int IsStrCalculation(char *Command);
+BYTE GetCalcId(const char *Command,int *pi);
+BOOL GetNumOpeElements(const char *Command,int *pnum,
+					   char *values[255],long calc[255],long stack[255]);
+
+//NumOpe_GetType.cpp
+int AutoBigCast(int BaseType,int CalcType);
+BOOL CheckCalcType(int idCalc,int *type,int sp);
+bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL );
+bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType );
+
+//Subroutine.cpp
+int GetCallProcName(char *buffer,char *name);
+int GetProc(char *name,void **ppInfo);
+void SplitObjectName(const char *name,char *ObjectName,int *pRefType);
+bool SplitMemberName( const char *desc, char *object, char *member, CClass::RefType &refType );
+bool SplitMemberName( const char *desc, char *object, char *member );
+bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn = true );
+bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType);
+bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType );
+bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType );
+GlobalProc *AddSubData( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic = false );
+void GetSubInfo(void);
+void DeleteSubInfo(GlobalProc **ppSubHash,char **ppMacroNames,int MacroNum);
+void DeleteDeclareInfo(void);
+int AddProcPtrInfo( const string &typeExpression, int nowLine );
+void DeleteProcPtrInfo(void);
+bool IsNeedProcCompile();
+
+//OldStatement.cpp
+void Opcode_Input(const char *Parameter);
+void Opcode_Print(const char *Parameter,BOOL bWrite);
+
+//LoopRefCheck.cpp
+class CLoopRefCheck{
+	char **names;
+	int num;
+	void init();
+public:
+	CLoopRefCheck();
+	~CLoopRefCheck();
+	void add(const char *lpszInheritsClass);
+	void del(const char *lpszInheritsClass);
+	BOOL check(const CClass &inheritsClass) const;
+};
+extern CLoopRefCheck *pobj_LoopRefCheck;
+
+//DataTable.cpp
+class DataTable{
+	void *pdata;
+	int size;
+
+public:
+	DataTable();
+	~DataTable();
+	void Init();
+
+	int AddBinary( const void *pdata, int size );
+	int Add( _int64 i64data );
+	int Add( int i32data );
+	int Add( double dbl );
+	int Add( float flt );
+	int AddString( const char *str, int length );
+	int AddString( const char *str );
+
+	const void *GetPtr() const;
+	int GetSize() const;
+};
+extern DataTable dataTable;
+
+//error.cpp
+void SetError(int ErrorNum,const char *KeyWord,int pos);
+void SetError(int ErrorNum,const string &keyWord,int pos);
+void SetError();
+void CompileMessage(char *buffer);
+bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum);
+bool CheckDifferentType( const Type &varType,const Type &calcType,const char *pszFuncName,const int ParmNum);
+
+//Compile.cpp
+void ReallocNativeCodeBuffer();
+void GetIdentifierToken( char *token, const char *source, int &pos );
+int JumpStatement(const char *source, int &pos);
+void DebugVariable(void);
+void Compile(void);
+
+//Diagnose.cpp
+void Diagnose();
+
+//gc.cpp
+void InitGCVariables(void);
+void PerformedGcVarSchedule(void);
+
+
+
+#ifdef _DEBUG
+/*Debug*/
+/*
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes);
+LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes);
+*/
+#endif
Index: /trunk/abdev/BasicCompiler_Common/common_msg_eng.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/common_msg_eng.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/common_msg_eng.h	(revision 147)
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////
+// アプリケーションで使用する汎用テキストを定義しています
+//
+// 英語
+///////////////////////////////////////////////////////////////
+
+
+////////
+// 汎用
+////////
+#define STRING_COMPILE			"Compile"
+#define STRING_STOP				"Stop"
+#define STRING_CLOSE			"Close"
+#define STRING_CONTINUE			"Continue"
+#define STRING_NOERROR			"No Error"
+#define STRING_NODEBUGMSG		"No Debug Message"
+#define STRING_OBJECT			"object"
+#define STRING_POINTEROFOBJECT	"pointer of object"
+#define STRING_ARRAY			"array"
+#define STRING_CANNOTACCESS		"cannot access"
+
+#define STRING_PARENTHESIS	"parenthesis \'( )\'"
+
+
+/////////////////////////////////////
+// コンパイラ及びデバッガ メッセージ
+/////////////////////////////////////
+#define STRING_COMPILE_CHECK_CODECONDOTION	"Checking code condition..."
+#define STRING_COMPILE_OPTIMIZING			"Optimizing..."
+#define STRING_COMPILE_INTERMEDIATE			"Creating intermediate code..."
+#define STRING_COMPILE_COMPILING			"Compiling..."
+
+#define STRING_COMPILE_STOP					"Compiling was stopped."
+#define STRING_COMPILE_SUCCESS				"Compiling was successful."
+#define STRING_COMPILE_ERROR				"Compile Error（Number of Errors:%d）"
+
+#define STRING_DEBUGGING					"Debugging the program."
+#define STRING_DEBUG_FINISH					"Debugging was finished."
+#define STRING_DEBUG_THREADFINISH			"Thread(&H%X) exited with code &H%X.\r\n"
+#define STRING_DEBUG_PROCESSFINISH			"Program exited with code &H%X.\r\n"
+#define STRING_DEBUG_THREAD_INVALID_HANDLE	"Handle violation.   Thread=&H%X   EPI=&H%08X\r\n"
+#define STRING_DEBUG_THREAD_ACCESSVIOLATION	"Access violation.   Thread=&H%X   EPI=&H%08X\r\n"
+#define STRING_DEBUG_BREAKPOINT				"Breakpoint.         Thread=&H%X   EPI=&H%08X\r\n"
+#define STRING_DEBUG_DIVIDE_BY_ZERO			"Divided by zero.    Thread=&H%X   EPI=&H%08X\r\n"
+#define STRING_DEBUG_ERROR					"Unknown error.\ncode:%X"
+#define STRING_DEBUG_FAILED					"Failed to read the debug information."
Index: /trunk/abdev/BasicCompiler_Common/common_msg_jpn.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/common_msg_jpn.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/common_msg_jpn.h	(revision 147)
@@ -0,0 +1,47 @@
+///////////////////////////////////////////////////////////////
+// アプリケーションで使用する汎用テキストを定義しています
+//
+// 日本語
+///////////////////////////////////////////////////////////////
+
+
+////////
+// 汎用
+////////
+#define STRING_COMPILE			"コンパイル"
+#define STRING_STOP				"中断"
+#define STRING_CLOSE			"閉じる"
+#define STRING_CONTINUE			"継続"
+#define STRING_NOERROR			"エラー無し"
+#define STRING_NODEBUGMSG		"デバッグ情報無し"
+#define STRING_OBJECT			"オブジェクト"
+#define STRING_POINTEROFOBJECT	"オブジェクト ポインタ"
+#define STRING_ARRAY			"配列"
+#define STRING_CANNOTACCESS		"アクセスできません"
+
+#define STRING_PARENTHESIS	"カッコ \'( )\'"
+
+
+/////////////////////////////////////
+// コンパイラ及びデバッガ メッセージ
+/////////////////////////////////////
+#define STRING_COMPILE_CHECK_CODECONDOTION	"整合性チェック..."
+#define STRING_COMPILE_OPTIMIZING			"最適化中..."
+#define STRING_COMPILE_INTERMEDIATE			"中間コードを抽出中..."
+#define STRING_COMPILE_COMPILING			"コンパイル中..."
+
+#define STRING_COMPILE_STOP					"コンパイルはユーザーにより中断されました。"
+#define STRING_COMPILE_SUCCESS				"コンパイルは正常に完了しました（エラー:%d、警告:%d）。"
+#define STRING_COMPILE_ERROR				"コンパイルは中断されました（エラー:%d、警告:%d）。"
+
+#define STRING_DEBUGGING					"プログラムを実行しています（デバッグ中）。"
+#define STRING_DEBUG_FINISH					"デバッグは正常に終了しました。"
+#define STRING_DEBUG_THREADFINISH			"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+#define STRING_DEBUG_PROCESSFINISH			"プログラムはコード &H%X で終了しました。\r\n"
+#define STRING_DEBUG_THREAD_INVALID_HANDLE	"スレッド(&H%X)でハンドル違反がありました(EPI=&H%08X)。\r\n"
+#define STRING_DEBUG_THREAD_ACCESSVIOLATION	"スレッド(&H%X)でアクセス違反がありました(EPI=&H%08X)。\r\n"
+#define STRING_DEBUG_BREAKPOINT				"スレッド(&H%X)のブレーク ポイント(EPI=&H%08X)。\r\n"
+#define STRING_DEBUG_DIVIDE_BY_ZERO			"0による除算が行われました。スレッド(&H%X) ブレーク ポイント(EPI=&H%08X)。\r\n"
+#define STRING_DEBUG_DIVIDE_NO_MEMORY		"メモリ不足、またはヒープが壊れていることが原因で、メモリの割り当てに失敗しました。スレッド(&H%X) ブレーク ポイント(EPI=&H%08X)。\r\n"
+#define STRING_DEBUG_ERROR					"例外処理(code:&H%08X)\r\n"
+#define STRING_DEBUG_FAILED					"デバッグ情報の取得に失敗"
Index: /trunk/abdev/BasicCompiler_Common/debug.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/debug.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/debug.h	(revision 147)
@@ -0,0 +1,36 @@
+
+class CDebugThreadInfo{
+public:
+	//ソースコードポインタ
+	DWORD *lpdwCp;
+
+	//ネイティブコードポインタ
+	ULONG_PTR *lplpObp;
+
+	//スタックフレームベースポインタ
+	ULONG_PTR *lplpSpBase;
+
+	//プロシージャ呼び出し階層
+	int iProcLevel;
+
+	CDebugThreadInfo();
+	~CDebugThreadInfo();
+
+	BOOL Reflesh(int ThreadNum);
+	void Free();
+};
+
+extern CDebugThreadInfo *pobj_dti;
+
+#define MAX_DEBUG_THREAD 256
+extern DWORD _DebugSys_dwThreadID[MAX_DEBUG_THREAD];
+extern HANDLE array_hDebugThread[MAX_DEBUG_THREAD];
+
+
+#ifdef _AMD64_
+#define EIP_RIP(Context) (Context).Rip
+#define SP_BASE(Context) (Context).Rsp
+#else
+#define EIP_RIP(Context) (Context).Eip
+#define SP_BASE(Context) (Context).Ebp
+#endif
Index: /trunk/abdev/BasicCompiler_Common/error.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/error.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/error.cpp	(revision 147)
@@ -0,0 +1,551 @@
+#include "../BasicCompiler_Common/common.h"
+
+BOOL GetErrorMsg(int num,const char *KeyWord,char *msg,int pos){
+	extern HANDLE hHeap;
+	int i2;
+	char temporary[64];
+
+	char tempKeyWord[1024];
+	if(KeyWord){
+		lstrcpy(tempKeyWord,KeyWord);
+		for(i2=0;;i2++){
+			if(tempKeyWord[i2]=='\0') break;
+			if(tempKeyWord[i2]==1){
+				GetDefaultNameFromES(tempKeyWord[i2+1],temporary);
+				SlideString(tempKeyWord+i2+2,lstrlen(temporary)-2);
+				memcpy(tempKeyWord+i2,temporary,lstrlen(temporary));
+			}
+		}
+	}
+	else{
+		lstrcpy(tempKeyWord,"");
+	}
+
+	if(num==-1||num==-2) lstrcpy(msg,tempKeyWord);	//部分エラー
+
+	if(num==3){
+		temporary[0]=tempKeyWord[0];
+		for(i2=1;;i2++){
+			if((!IsVariableChar(tempKeyWord[i2]))||i2>=255){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=tempKeyWord[i2];
+		}
+
+		extern char **SynonymErrorWords;
+		extern int SynonymErrorNum;
+		for(i2=0;i2<SynonymErrorNum;i2++){
+			if(lstrcmp(SynonymErrorWords[i2],temporary)==0) return 0;
+		}
+
+#if defined(JPN)
+		//日本語
+		sprintf(msg,"\"%s\" 無効な識別子です",temporary);
+#else
+		//英語
+		sprintf(msg,"\"%s\" Invalid identifier.",temporary);
+#endif
+
+		//重複エラー情報を追加
+		SynonymErrorWords=(char **)HeapReAlloc(hHeap,0,SynonymErrorWords,(SynonymErrorNum+1)*sizeof(char *));
+		SynonymErrorWords[SynonymErrorNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(SynonymErrorWords[SynonymErrorNum],temporary);
+		SynonymErrorNum++;
+	}
+	if(num==30){
+#if defined(JPN)
+		//日本語
+		if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
+		else lstrcpy(msg,"文法が間違っています");
+#else
+		//英語
+		if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",tempKeyWord);
+		else lstrcpy(msg,"Syntax Error.");
+#endif
+	}
+
+
+	/////////////////////
+	// ワーニングエラー
+	/////////////////////
+#if defined(JPN)
+	////////////////////
+	//日本語
+	////////////////////
+	if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",tempKeyWord);
+	if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",tempKeyWord);
+	if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",tempKeyWord);
+	if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",tempKeyWord);
+	if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",tempKeyWord);
+	if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",tempKeyWord);
+	if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",tempKeyWord);
+	if(num==-120) sprintf(msg,"[警告] VarPtr関数の引数にオブジェクト インスタンスが指定されました。オブジェクトの先頭アドレスを取得したいときはObjPtr関数に切り替えをお願いします。m(__)m（この警告はVarPtr→ObjPtrへの切り替えが完了したら消します（切り替えは \"適材箇所に限り\" ですので、ご注意ください！））",tempKeyWord);
+#else
+#endif
+
+
+	///////////////
+	// 一般エラー
+	///////////////
+
+#if defined(JPN)
+	////////////////////
+	//日本語
+	////////////////////
+	if(num==1) lstrcpy(msg,"文法が間違っています。");
+	if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません。");
+	//num==3は予約されています
+	if(num==4) sprintf(msg,"%sの相互関係が一致しません。",tempKeyWord);
+	if(num==5) sprintf(msg,"ダブルクォートの数が一致しません。");
+	if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です。",tempKeyWord);
+	if(num==7) lstrcpy(msg,"DLL名が長すぎます（拡張子を含め、16文字以下にして下さい）。");
+	if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています。");
+	if(num==9) sprintf(msg,"型が違います。");
+	if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています。",tempKeyWord);
+	if(num==11) sprintf(msg,"\"%s\" 型が違います。",tempKeyWord);
+	if(num==12) sprintf(msg,"\"%s\" の使い方が不正です。",tempKeyWord);
+	if(num==13) sprintf(msg,"\"%s\" を参照できません。",tempKeyWord);
+	if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です。",tempKeyWord);
+	if(num==15) sprintf(msg,"\"%s\" はすでに定義されています。",tempKeyWord);
+	if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています。",tempKeyWord);
+	if(num==17) sprintf(msg,"リソース データが不正です。");
+	if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません。",tempKeyWord);
+	if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません。",tempKeyWord);
+	if(num==20) lstrcpy(msg,"全角スペースが含まれています（全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください）。");
+	if(num==21) sprintf(msg,"If制御のブロック指定が不正です。");
+	if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません。",tempKeyWord,tempKeyWord);
+	if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
+	if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません（BytePtr型などを利用して下さい）。");
+	if(num==25) sprintf(msg,"DLL関数にオブジェクトを引き渡すことはできません(%s)。",tempKeyWord);
+	if(num==26) sprintf(msg,"\"%s\" 戻り値の型が指定されていません。",tempKeyWord);
+	if(num==27) sprintf(msg,"\"%s\" は定義されていません。",tempKeyWord);
+	if(num==28) sprintf(msg,"構造体パラメータは参照渡しにしてください(%s)。",tempKeyWord);
+	if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照（ByRef）にしてください。");
+	//num==30は予約されています
+	if(num==31) sprintf(msg,"\"%s\" は構造体です（メンバの参照はピリオド \".\" で区切ってください）。",tempKeyWord);
+	if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです（メンバの参照は \"->\" で区切ってください）。",tempKeyWord);
+	if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています。");
+	if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい。");
+	if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです。",tempKeyWord);
+	if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません（\"->\" 参照はできません）。",tempKeyWord);
+	if(num==40) lstrcpy(msg,"DLL関数の戻り値としてオブジェクトを受け取ることはできません。");
+	if(num==41) lstrcpy(msg,"初期データが不正です。");
+	if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています。");
+	if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています。");
+	if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません。",tempKeyWord);
+	if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています。");
+	if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています。");
+	if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています。",tempKeyWord);
+	if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています。");
+	if(num==50) sprintf(msg,"%sに変換できません。",tempKeyWord);
+	if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません。");
+	if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません。",tempKeyWord);
+	if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります。",tempKeyWord);
+	if(num==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord);
+	if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord);
+	if(num==56) lstrcpy(msg,"ゼロ割りが行われました。");
+	if(num==57) lstrcpy(msg,"8進数のリテラル表記が不正です。");
+	if(num==58) lstrcpy(msg,"16進数のリテラル表記が不正です。");
+	if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
+	if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。");
+	if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",tempKeyWord);
+	if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",tempKeyWord);
+	if(num==63) lstrcpy(msg,"名前空間が正しく閉じられていません。");
+	if(num==64) sprintf(msg,"\"%s\" 無効な名前空間です。",tempKeyWord);
+	if(num==65) sprintf(msg,"ローカル領域で%sは使用できません。",tempKeyWord);
+
+
+	//オブジェクト関連
+	if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません。",tempKeyWord);
+	if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません。",tempKeyWord);
+	if(num==104) sprintf(msg,"\"%s\" 参照方法が違います。",tempKeyWord);
+	if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません。",tempKeyWord);
+	if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません。",tempKeyWord);
+	if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
+	if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
+	if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
+	if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
+	if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります。");
+	if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません。",tempKeyWord);
+	if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です。",tempKeyWord);
+	if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません。");
+	if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません。");
+	//if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません。");
+	if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません。");
+	if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません。");
+	if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません。",tempKeyWord);
+	if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です。");
+	if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません。");
+	if(num==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています。");
+	if(num==123) lstrcpy(msg,"ループ継承が行われました。");
+	if(num==124) lstrcpy(msg,"循環参照が行われました。");
+	if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord);
+	if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
+	if(num==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。");
+	if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。");
+	if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",tempKeyWord);
+	if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",tempKeyWord);
+	if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
+	if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
+	if(num==133) lstrcpy(msg,"Thisに代入はできません。");
+	if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
+	if(num==135) lstrcpy( msg, "クラスまたはインターフェイス以外の型を継承元として指定することはできません。" );
+
+	//Enum関連
+	if(num==150) sprintf(msg,"\"%s\" 値が定義されていません。",tempKeyWord);
+	if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません。",tempKeyWord);
+
+	//リンカ
+	if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)。",tempKeyWord);
+	if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗。",tempKeyWord);
+
+	//原因不明
+	if(num==300) lstrcpy(msg,"内部エラー");
+
+#else
+	////////////////////
+	//英語
+	////////////////////
+	if(num==1) lstrcpy(msg,"Syntax Error.");
+	if(num==2) sprintf(msg,"Left operand must be l-value.");
+	//num==3は予約されています
+	if(num==4) sprintf(msg,"Correlation of %s is wrong.",tempKeyWord);
+	if(num==5) sprintf(msg,"Correlation of double quotes is wrong.");
+	if(num==6) sprintf(msg,"\"%s\" Label not found.",tempKeyWord);
+	if(num==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less.");
+	if(num==8) lstrcpy(msg,"The inaccurate characters are contained.");
+	if(num==9) sprintf(msg,"Type is wrong.");
+	if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",tempKeyWord);
+	if(num==11) sprintf(msg,"\"%s\" Type is wrong.",tempKeyWord);
+	if(num==12) sprintf(msg,"\"%s\" Not a valid use.",tempKeyWord);
+	if(num==13) sprintf(msg,"Cannot refer to \"%s\".",tempKeyWord);
+	if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",tempKeyWord);
+	if(num==15) sprintf(msg,"\"%s\" is already defined.",tempKeyWord);
+	if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",tempKeyWord);
+	if(num==17) sprintf(msg,"Invalid resource data.");
+	if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",tempKeyWord);
+	if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",tempKeyWord);
+	if(num==21) sprintf(msg,"Wrong structure of \"If\" block.");
+	if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",tempKeyWord,tempKeyWord);
+	if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",tempKeyWord);
+	if(num==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)");
+	if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",tempKeyWord);
+	if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",tempKeyWord);
+	if(num==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)");
+	//num==30は予約されています
+	if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",tempKeyWord);
+	if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",tempKeyWord);
+	if(num==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value.");
+	if(num==34) sprintf(msg,"Constant formula must be defined in the module level.");
+	if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",tempKeyWord);
+	if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",tempKeyWord);
+	if(num==40) lstrcpy(msg,"Cannot set a object to return value.");
+	if(num==41) lstrcpy(msg,"Init data is wrong.");
+	if(num==42) lstrcpy(msg,"The inaccurate characters are contained after the closing parenthesis \")\".");
+	if(num==43) lstrcpy(msg,"The inaccurate characters are contained after the double quote.");
+
+	//オブジェクト関連
+	if(num==102) sprintf(msg,"\"%s\" The object is not defined.",tempKeyWord);
+	if(num==103) sprintf(msg,"\"%s\" The member is not defined.",tempKeyWord);
+	if(num==104) sprintf(msg,"\"%s\" The reference character is different.",tempKeyWord);
+	if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",tempKeyWord);
+	if(num==106) sprintf(msg,"\"%s\" It class is not defined.",tempKeyWord);
+	if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",tempKeyWord);
+	if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",tempKeyWord);
+	if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",tempKeyWord);
+	if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",tempKeyWord);
+	if(num==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module");
+	if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",tempKeyWord);
+	if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",tempKeyWord);
+	if(num==114) lstrcpy(msg,"Destructor cannot have a parameter.");
+	if(num==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value.");
+	if(num==116) lstrcpy(msg,"Constructor and Destructor must be public access.");
+	if(num==117) lstrcpy(msg,"Destructors name must be \"~ClassName\".");
+	if(num==118) lstrcpy(msg,"Super class is not found.");
+	if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",tempKeyWord);
+
+	//Enum関連
+	if(num==150) sprintf(msg,"\"%s\" The value is not set",tempKeyWord);
+	if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",tempKeyWord);
+
+	//リンカ
+	if(num==200) sprintf(msg,"\"%s\" Unknown error.",tempKeyWord);
+#endif
+
+	return 1;
+}
+void SetError(int ErrorNum,const string &keyWord,int pos){
+	SetError( ErrorNum, keyWord.c_str(), pos );
+}
+void SetError(int num,const char *KeyWord,int pos){
+	extern HANDLE hHeap;
+	extern HWND hMainDlg;
+	extern ERRORINFO *pErrorInfo;
+	extern int ErrorNum;
+	char temporary[1024],temp2[1024],temp3[32],FileName[MAX_PATH];
+	BOOL bFirst;
+	int i2;
+
+	extern BOOL bDebugRun;
+	if(bDebugRun) return;
+
+	if(num!=-2){
+		//一般エラーまたは警告
+		i2=0;	//ここにブレークポイントをおく
+
+		if(num>-100){
+			//エラーのみ
+			i2=0;
+		}
+
+	}
+
+	if(!GetErrorMsg(num,KeyWord,temporary,pos)) return;
+
+	if(ErrorNum==0){
+		SetDlgItemText(hMainDlg,IDC_ERRORLIST,"");
+		EnableWindow(GetDlgItem(hMainDlg,IDC_ERRORLIST),1);
+		bFirst=1;
+	}
+	else bFirst=0;
+
+
+	////////////////////
+	// エラー情報を追加
+	pErrorInfo=(ERRORINFO *)HeapReAlloc(hHeap,0,pErrorInfo,(ErrorNum+1)*sizeof(ERRORINFO));
+
+	if(pos==-1){
+		pErrorInfo[ErrorNum].FileName=0;
+		lstrcpy(temp2,temporary);
+	}
+	else{
+		GetLineNum(pos,&pErrorInfo[ErrorNum].line,FileName);
+
+		pErrorInfo[ErrorNum].FileName=(char *)HeapAlloc(hHeap,0,lstrlen(FileName)+1);
+		lstrcpy(pErrorInfo[ErrorNum].FileName,FileName);
+
+		_splitpath(pErrorInfo[ErrorNum].FileName,0,0,temp2,temp3);
+		lstrcat(temp2,temp3);
+
+		if(pErrorInfo[ErrorNum].line==-1)
+			sprintf(temp2+lstrlen(temp2),"(no area) %s",temporary);
+		else
+			sprintf(temp2+lstrlen(temp2),"(%d) - %s",pErrorInfo[ErrorNum].line+1,temporary);
+	}
+
+	i2=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_ERRORLIST));
+	SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
+	if(bFirst==0){
+		SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)"\r\n");
+		i2+=2;
+		SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
+	}
+	SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)temp2);
+
+
+	if(num==-2){
+		//コンパイルメッセージ
+		//※何もしない
+		extern int CompileMsgNum;
+		CompileMsgNum++;
+	}
+	else{
+		if(num>-100){
+			//警告ではなく、エラーの場合はエラーチェックフラグを立てる
+			extern BOOL bError;
+			bError=1;
+
+			// ログに出力
+			trace( "error - " << temp2 );
+		}
+		else{
+			extern int WarningNum;
+			WarningNum++;
+
+			// ログに出力
+			trace( "warning - " << temp2 );
+		}
+	}
+
+	ErrorNum++;
+}
+void SetError(){
+	SetError(300,NULL,cp);
+}
+void CompileMessage(char *buffer){
+	SetError(-2,buffer,-1);
+}
+
+#define STRING_SYSTEM_DECLAREHANDLE "*_System_DeclareHandle_"
+void DifferentTypeError(const int VarType,LONG_PTR VarIndex,const int CalcType,LONG_PTR CalcIndex,const int iWarning,const char *pszFuncName,const int ParmNum){
+	//////////////////////////
+	// キャストに関する警告
+	//////////////////////////
+	char temporary[255],temp2[255],temp3[255];
+
+	if(IS_LITERAL(CalcIndex)) CalcIndex=-1;
+
+	if(pszFuncName)
+		sprintf(temporary,"\"%s\"の第%dパラメータが、",pszFuncName,ParmNum+1);
+	else temporary[0]=0;
+
+	if(!GetTypeName(VarType,VarIndex,temp2)) lstrcpy(temp2,"Any");
+	if(memcmp(temp2,STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0){
+		memmove(temp2,
+			temp2+lstrlen(STRING_SYSTEM_DECLAREHANDLE),
+			lstrlen(temp2+lstrlen(STRING_SYSTEM_DECLAREHANDLE))+1);
+	}
+	if(!GetTypeName(CalcType,CalcIndex,temp3)) lstrcpy(temp3,"Any");
+	if(memcmp(temp3,STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0){
+		memmove(temp3,
+			temp3+lstrlen(STRING_SYSTEM_DECLAREHANDLE),
+			lstrlen(temp3+lstrlen(STRING_SYSTEM_DECLAREHANDLE))+1);
+	}
+	sprintf(temporary+lstrlen(temporary),"%sから%s",temp3,temp2);
+
+	extern int cp;
+	if(iWarning==1) SetError(-101,temporary,cp);
+ 	else if(iWarning==2) SetError(-102,temporary,cp);
+ 	else if(iWarning==3) SetError(50,temporary,cp);
+}
+
+bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum){
+
+	if(VarType==DEF_STRUCT||CalcType==DEF_STRUCT){
+		//いずれかが構造体場合
+		if( VarType != CalcType || lpVarIndex != lpCalcIndex ){
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,3,pszFuncName,ParmNum);
+			return false;
+		}
+	}
+
+	if(VarType==DEF_OBJECT||CalcType==DEF_OBJECT){
+		//いずれかがオブジェクトインスタンスの場合
+		if( VarType != CalcType ){
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,3,pszFuncName,ParmNum);
+			return false;
+		}
+
+		CClass *pClass = (CClass *)lpVarIndex;
+		if( !pClass->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
+			//等しくなく、派生クラスでもないとき
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,3,pszFuncName,ParmNum);
+			return false;
+		}
+	}
+
+	//#strictが指定されていないときは型チェックを行わないようにする
+	extern BOOL bStrict;
+	if(bStrict==0) return true;
+
+	if(CalcType&FLAG_PTR){
+		//配列先頭フラグがたっている場合は、ポインタ型として扱う
+		CalcType=MAKE_PTR_TYPE(NATURAL_TYPE(CalcType),PTR_LEVEL(CalcType)+1);
+	}
+
+	if(IsPtrType(VarType)||IsPtrType(CalcType)){
+		/* 右辺及び左辺のいずれかがポインタ型の場合は、
+			型チェックを行う。
+		・同一の種類のポインタ型以外はエラーとする */
+
+		if(IsPtrType(VarType)&&lpCalcIndex==LITERAL_NULL){
+			//リテラルNULL値の場合
+			return true;
+		}
+
+		if(VarType==DEF_PTR_VOID){
+			//左辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
+			if(IsPtrType(CalcType)) return true;
+		}
+
+		if(CalcType==DEF_PTR_VOID){
+			//右辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
+			if(IsPtrType(VarType)) return true;
+		}
+
+		if(VarType!=CalcType){
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,2,pszFuncName,ParmNum);
+			return true;
+		}
+
+		if(VarType==DEF_PTR_OBJECT){
+			//双方がオブジェクトポインタ型の場合
+			if(lpVarIndex!=lpCalcIndex){
+				const CClass *pobj_tempClass;
+				pobj_tempClass=(CClass *)lpCalcIndex;
+				while(pobj_tempClass&&(!IS_LITERAL((LONG_PTR)pobj_tempClass))){
+					pobj_tempClass=pobj_tempClass->pobj_InheritsClass;
+
+					if(lpVarIndex==(LONG_PTR)pobj_tempClass){
+						//継承先が等しいとき
+						return true;
+					}
+				}
+				DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,2,pszFuncName,ParmNum);
+				return true;
+			}
+		}
+	}
+
+	if(VarType==DEF_DOUBLE){
+		if(Is64Type(CalcType)){
+			//64ビット整数値の場合は警告を出す
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
+		}
+	}
+	else if(VarType==DEF_SINGLE){
+		if(Is64Type(CalcType)||CalcType==DEF_DOUBLE){
+			//64ビット整数値、またはDouble型の場合は警告を出す
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
+		}
+	}
+	else if(GetTypeSize(VarType,lpVarIndex)==sizeof(char)){
+		if(GetTypeSize(CalcType,lpCalcIndex)>sizeof(char)&&
+			lpCalcIndex!=LITERAL_NULL&&
+			lpCalcIndex!=LITERAL_M128_0&&
+			lpCalcIndex!=LITERAL_0_255){
+			//8ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
+		}
+	}
+	else if(GetTypeSize(VarType,lpVarIndex)==sizeof(short)){
+		if(GetTypeSize(CalcType,lpCalcIndex)>sizeof(short)&&
+			lpCalcIndex!=LITERAL_NULL&&
+			lpCalcIndex!=LITERAL_M128_0&&
+			lpCalcIndex!=LITERAL_0_255&&
+			lpCalcIndex!=LITERAL_M32768_0&&
+			lpCalcIndex!=LITERAL_0_65535){
+			//16ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
+		}
+	}
+	else if(GetTypeSize(VarType,lpVarIndex)==sizeof(long)){
+		if(IsRealNumberType(CalcType)||
+			(IsWholeNumberType(CalcType)&&
+			GetTypeSize(CalcType,lpCalcIndex)>sizeof(long)&&
+			lpCalcIndex!=LITERAL_NULL)
+			){
+			/* 32ビット整数値より大きな型、または実数、
+					またはリテラル値でもない場合は警告を出す */
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
+		}
+	}
+	else if(GetTypeSize(VarType,lpVarIndex)==sizeof(_int64)){
+		if(IsRealNumberType(CalcType)){
+			//実数の場合は警告を出す
+			DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
+		}
+	}
+
+	return true;
+}
+bool CheckDifferentType( const Type &varType,const Type &calcType,const char *pszFuncName,const int ParmNum){
+	return CheckDifferentType(
+		varType.GetBasicType(),
+		varType.GetIndex(),
+		calcType.GetBasicType(),
+		calcType.GetIndex(),
+		pszFuncName,
+		ParmNum );
+}
Index: /trunk/abdev/BasicCompiler_Common/gc.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/gc.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/gc.cpp	(revision 147)
@@ -0,0 +1,90 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+int Schedule_GlobalRoot_StartPtr;
+int Schedule_GlobalRoot_Size;
+
+void InitGCVariables(void){
+	char temporary[255];
+
+
+	///////////////////////////////
+	// グローバル変数の開始位置
+	///////////////////////////////
+
+	sprintf(temporary,"_System_gc_GlobalRoot_StartPtr%c%cVoidPtr",1,ESC_AS);
+	OpcodeDim(temporary,0);
+
+	Type type;
+	RELATIVE_VAR RelativeVar;
+	GetVarOffsetReadWrite("_System_gc_GlobalRoot_StartPtr",&RelativeVar,type);
+
+	//mov rax,ptr
+	op_mov_RV(PTR_SIZE,REG_RAX,0);
+	Schedule_GlobalRoot_StartPtr=obp-sizeof(long);
+
+	//mov ptr[offset],rax/eax
+	op_mov_MR(PTR_SIZE,REG_RAX,0,(int)RelativeVar.offset,MOD_DISP32);
+	obp-=sizeof(long);
+	pobj_GlobalVarSchedule->add();
+	obp+=sizeof(long);
+
+
+	///////////////////////////////
+	// グローバル変数の大きさ
+	///////////////////////////////
+
+	sprintf(temporary,"_System_gc_GlobalRoot_Size%c%cLong",1,ESC_AS);
+	OpcodeDim(temporary,0);
+
+	GetVarOffsetReadWrite("_System_gc_GlobalRoot_Size",&RelativeVar,type);
+
+	//mov rax,ptr
+	op_mov_RV(PTR_SIZE,REG_RAX,0);
+	Schedule_GlobalRoot_Size=obp-sizeof(long);
+
+	//mov ptr[offset],rax/eax
+	op_mov_MR(PTR_SIZE,REG_RAX,0,(int)RelativeVar.offset,MOD_DISP32);
+	obp-=sizeof(long);
+	pobj_GlobalVarSchedule->add();
+	obp+=sizeof(long);
+
+
+
+	///////////////////////////////
+	// スタックフレームの開始位置
+	///////////////////////////////
+
+	sprintf(temporary,"_System_gc_StackRoot_StartPtr%c%c*LONG_PTR",1,ESC_AS);
+	OpcodeDim(temporary,0);
+
+	GetVarOffsetReadWrite("_System_gc_StackRoot_StartPtr",&RelativeVar,type);
+
+	//mov rax,rsp
+	op_mov_RR(REG_RAX,REG_RSP);
+
+	//mov ptr[offset],rax/eax
+	op_mov_MR(PTR_SIZE,REG_RAX,0,(int)RelativeVar.offset,MOD_DISP32);
+	obp-=sizeof(long);
+	pobj_GlobalVarSchedule->add();
+	obp+=sizeof(long);
+
+}
+
+void PerformedGcVarSchedule(void){
+	//グローバル変数領域の開始位置
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+	*((long *)(OpBuffer+Schedule_GlobalRoot_StartPtr))=ImageBase+MemPos_RWSection;
+	pobj_Reloc->AddSchedule_CodeSection(Schedule_GlobalRoot_StartPtr);
+
+	//グローバル変数領域のサイズ
+	extern int AllInitGlobalVarSize;
+	extern int AllGlobalVarSize;
+	*((long *)(OpBuffer+Schedule_GlobalRoot_Size))=AllInitGlobalVarSize+AllGlobalVarSize;
+}
Index: /trunk/abdev/BasicCompiler_Common/hash.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/hash.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/hash.cpp	(revision 147)
@@ -0,0 +1,203 @@
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+int hash_default(const char *name){
+	int key;
+
+	for(key=0;*name!='\0';name++){
+		key=((key<<8)+ *name )%MAX_HASH;
+	}
+
+	return key;
+}
+
+CONSTINFO *GetConstHash(const char *name){
+	//ハッシュ値を取得
+	int key;
+	key=hash_default(name);
+
+	//格納位置を取得
+	extern CONSTINFO **ppConstHash;
+	CONSTINFO *pci;
+	pci=ppConstHash[key];
+	while(pci){
+		if(lstrcmp(pci->name,name)==0) break;
+
+		pci=pci->pNextData;
+	}
+
+	return pci;
+}
+
+DllProc *GetDeclareHash(char *fullName){
+	char ObjName[VN_SIZE];		//オブジェクト変数
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	bool isObjectMember = SplitMemberName( fullName, ObjName, NestMember );
+
+	//ハッシュ値を取得
+	int key;
+	key=hash_default(NestMember);
+
+	//格納位置を取得
+	extern DllProc **ppDeclareHash;
+	DllProc *pDllProc;
+	pDllProc=ppDeclareHash[key];
+	while(pDllProc){
+		// TODO: Declare名前空間対応
+		if( pDllProc->IsEqualSymbol( fullName ) ){
+			break;
+		}
+
+		pDllProc=pDllProc->pNextData;
+	}
+
+	return pDllProc;
+}
+
+void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs ){
+	char name[VN_SIZE];
+
+	if(lpszName[0]=='.'){
+		GetWithName(name);
+		lstrcat(name,lpszName);
+	}
+	else lstrcpy(name,lpszName);
+
+	char ObjName[VN_SIZE];		//オブジェクト変数
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
+
+	if(isObjectMember){
+		//オブジェクトのメンバ関数の場合
+
+		bool isStatic = false;
+		const CClass *pobj_c = NULL;
+		if(lstrcmpi(ObjName,"Super")==0){
+			//クラスメンバ関数内から基底クラスの呼び出し
+			pobj_c=pobj_CompilingClass;
+		}
+		else{
+			//"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
+			Type type;
+			if( GetVarType(ObjName,type,0) ){
+				pobj_c = &type.GetClass();
+			}
+			else{
+				pobj_c=pobj_DBClass->Find(ObjName);
+				if( pobj_c ){
+					isStatic = true;
+				}
+			}
+		}
+
+		if( pobj_c && pobj_c != (CClass *)-1 ){
+			if( isStatic ){
+				// 静的メソッドから列挙
+				pobj_c->GetStaticMethods().Enum( NestMember, subs );
+			}
+			else{
+				//動的メソッドから列挙
+				pobj_c->GetMethods().Enum( NestMember, subs );
+			}
+			return;
+		}
+	}
+
+
+	if(pobj_CompilingClass){
+		//自身のオブジェクトのメンバ関数を検索
+
+		// 静的メソッド
+		pobj_CompilingClass->GetStaticMethods().Enum( name, subs );
+
+		// 動的メソッド
+		pobj_CompilingClass->GetMethods().Enum( name, subs );
+	}
+
+
+	///////////////////////////
+	// グローバル関数を検索
+	///////////////////////////
+
+	//ハッシュ値を取得
+	int key;
+	key=hash_default(NestMember);
+
+	//格納位置を取得
+	extern GlobalProc **ppSubHash;
+	GlobalProc *pUserProc;
+	pUserProc=ppSubHash[key];
+	while(pUserProc){
+		if(!pUserProc->GetParentClassPtr()){
+			if( pUserProc->IsEqualSymbol( name ) ){
+				subs.push_back( pUserProc );
+			}
+		}
+
+		pUserProc=pUserProc->pNextData;
+	}
+}
+
+//オーバーロードされていない関数を取得（昔のコンパイラソースコードとの互換性保持）
+UserProc *GetSubHash(const char *lpszName,BOOL bError){
+	std::vector<UserProc *> subs;
+	GetOverloadSubHash(lpszName,subs);
+
+	//関数が存在しないとき
+	if(subs.size() == 0){
+		if(bError){
+			SetError(3,lpszName,cp);
+		}
+		return 0;
+	}
+
+	//一つ以上の関数が存在するときは内部エラー（デバッグ用）
+	if(subs.size() > 1){
+		if(bError) SetError(300,NULL,cp);
+	}
+
+	UserProc *pUserProc;
+	pUserProc = subs[0];
+
+	return pUserProc;
+}
+UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError){
+	char temporary[VN_SIZE];
+	sprintf(temporary,"%s.%s",ObjectName,MethodName);
+
+	std::vector<UserProc *> subs;
+	UserProc *pUserProc;
+	GetOverloadSubHash(temporary,subs);
+
+	//関数が存在しないとき
+	if(subs.size() == 0){
+		return 0;
+	}
+
+	//オーバーロードを解決
+	pUserProc=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName);
+
+	return pUserProc;
+}
+
+UserProc *GetClassMethod( const char *className, const char *methodName ){
+	const CClass *pClass = pobj_DBClass->Find( className );
+	if( pClass ){
+		vector<UserProc *> userProcs;
+		pClass->GetMethods().Enum( methodName, userProcs );
+		if( userProcs.size() == 1 ){
+			return userProcs[0];
+		}
+	}
+
+	char temporary[VN_SIZE];
+	sprintf( temporary, "%s.%s", className, methodName );
+	SetError(3, temporary, -1 );
+
+	return NULL;
+}
Index: /trunk/abdev/BasicCompiler_Common/include/Exception.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Exception.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Exception.h	(revision 147)
@@ -0,0 +1,11 @@
+
+namespace Exception{
+
+	void TryCommand();
+	void CatchCommand();
+	void FinallyCommand();
+	void EndTryCommand();
+
+	void ThrowCommand( const char *Parameter );
+
+}
Index: /trunk/abdev/BasicCompiler_Common/include/Member.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Member.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Member.h	(revision 147)
@@ -0,0 +1,65 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "Type.h"
+
+using namespace std;
+
+class CClass;
+
+class CMember : public MemberPrototype
+{
+	string name;
+	Type type;
+	bool isConst;
+
+	string initializeExpression;
+	string constructParameter;
+public:
+	int SubScripts[MAX_ARRAYDIM];
+
+	int source_code_address;
+
+	const string &GetName() const
+	{
+		return name;
+	}
+	void SetName( const string &name )
+	{
+		this->name = name;
+	}
+
+	Type GetType() const
+	{
+		return type;
+	}
+
+	bool IsConst()
+	{
+		return isConst;
+	}
+
+	const string &GetInitializeExpression() const
+	{
+		return initializeExpression;
+	}
+	const string &GetConstructParameter() const
+	{
+		return constructParameter;
+	}
+
+	CMember( Prototype::Accessibility accessibility, const string &name, const Type &type, bool isConst )
+		: MemberPrototype( accessibility )
+		, name( name )
+		, type( type )
+		, isConst( isConst )
+	{
+	}
+	CMember( CClass *pobj_c, Prototype::Accessibility accessibility, bool idConst, bool isRef, char *buffer, int nowLine=-1 );
+	CMember( CMember &member );
+	~CMember();
+	static void InitStaticMember(void);
+};
+typedef std::vector<CMember *> Members;
Index: /trunk/abdev/BasicCompiler_Common/include/Method.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Method.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Method.h	(revision 147)
@@ -0,0 +1,125 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "../Class.h"
+#include <windows.h>
+
+using namespace std;
+
+class UserProc;
+class CClass;
+void SetError();
+
+class CMethod : public MemberPrototype
+{
+public:
+	UserProc *pUserProc;
+
+	CMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
+		: MemberPrototype( accessibility )
+		, pUserProc( pUserProc )
+	{
+	}
+
+	virtual bool IsAbstract() const = 0;
+	virtual void Override() = 0;
+	virtual bool IsVirtual() const = 0;
+	virtual bool IsConst() const = 0;
+	virtual bool IsStatic() const = 0;
+	virtual const CClass *GetInheritsClassPtr() const = 0;
+	virtual void SetInheritsClassPtr( const CClass *pInheritsClass ) = 0;
+};
+
+class DynamicMethod : public CMethod
+{
+	bool isAbstract;
+	bool isVirtual;
+	bool isConst;
+	const CClass *pInheritsClass;
+
+public:
+	DynamicMethod( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isAbstract, bool isVirtual, bool isConst, const CClass *pInheritsClass = NULL )
+		: CMethod( pUserProc, accessibility )
+		, isAbstract( isAbstract )
+		, isVirtual( isVirtual )
+		, isConst( isConst )
+		, pInheritsClass( pInheritsClass )
+	{
+	}
+	DynamicMethod( const CMethod &method )
+		: CMethod( method.pUserProc, method.GetAccessibility() )
+		, isAbstract( method.IsAbstract() )
+		, isVirtual( method.IsVirtual() )
+		, isConst( method.IsConst() )
+		, pInheritsClass( method.GetInheritsClassPtr() )
+	{
+	}
+
+	virtual bool IsAbstract() const
+	{
+		return isAbstract;
+	}
+	virtual void Override()
+	{
+		isAbstract = false;
+	}
+	virtual bool IsVirtual() const
+	{
+		return isVirtual;
+	}
+	virtual bool IsConst() const
+	{
+		return isConst;
+	}
+	virtual bool IsStatic() const
+	{
+		return false;
+	}
+	virtual const CClass *GetInheritsClassPtr() const
+	{
+		return pInheritsClass;
+	}
+	virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
+	{
+		this->pInheritsClass = pInheritsClass;
+	}
+};
+class StaticMethod : public CMethod
+{
+public:
+	StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
+		: CMethod( pUserProc, accessibility )
+	{
+	}
+
+	virtual bool IsAbstract() const{SetError();return false;}
+	virtual void Override(){SetError();}
+	virtual bool IsVirtual() const{
+		return false;
+	}
+	virtual bool IsConst() const{SetError();return false;}
+	virtual bool IsStatic() const
+	{
+		return true;
+	}
+	virtual const CClass *GetInheritsClassPtr() const{SetError();return NULL;}
+	virtual void SetInheritsClassPtr( const CClass *pInheritsClass ){SetError();}
+};
+
+class Methods : public vector<CMethod *>
+{
+public:
+	Methods();
+	~Methods();
+
+	//メンバ、メソッドの追加
+	void Add( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual );
+	void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
+
+	const CMethod *GetMethodPtr( UserProc *pUserProc ) const;
+	bool IsExist( const char *name ) const;
+	virtual void Enum( const char *methodName, vector<UserProc *> &subs ) const;
+	virtual void Enum( const BYTE idOperatorCalc, vector<UserProc *> &subs ) const;
+};
Index: /trunk/abdev/BasicCompiler_Common/include/Namespace.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Namespace.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Namespace.h	(revision 147)
@@ -0,0 +1,135 @@
+#pragma once
+
+#include <vector>
+#include <string>
+#include <boost/foreach.hpp>
+
+using namespace std;
+
+class NamespaceScopes : public vector<string>
+{
+public:
+	NamespaceScopes(){}
+	NamespaceScopes( const string &namespaceStr );
+	~NamespaceScopes(){}
+
+	string ToString() const
+	{
+		string namespaceStr;
+		const vector<string> &me = *this;
+
+		bool isFirst = true;
+		BOOST_FOREACH( const string &itemStr, me ){
+			if( isFirst ){
+				isFirst = false;
+			}
+			else{
+				namespaceStr += ".";
+			}
+
+			namespaceStr += itemStr;
+		}
+		return namespaceStr;
+	}
+
+	// 等しいかをチェック
+	bool IsEqual( const string &name ) const
+	{
+		if( ToString() == name ){
+			return true;
+		}
+		return false;
+	}
+
+	// 等しいかをチェック
+	bool IsEqual( const NamespaceScopes &namespaceScopes ) const
+	{
+		if( ToString() == namespaceScopes.ToString() ){
+			return true;
+		}
+		return false;
+	}
+
+	// 所属しているかをチェック
+	// 例:
+	// baseNamespaceScopes =  "Discoversoft"
+	// entryNamespaceScopes = "Discoversoft.ActiveBasic"
+	// この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。
+	static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes )
+	{
+		if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){
+			return false;
+		}
+
+		for( int i=0; i<(int)baseNamespaceScopes.size(); i++ ){
+			if( baseNamespaceScopes[i] != entryNamespaceScopes[i] ){
+				return false;
+			}
+		}
+		return true;
+	}
+
+	bool IsImported() const;
+
+	bool IsLiving() const;
+
+	// 包括しているかをチェック
+	// 例:
+	// this =   "Discoversoft.ActiveBasic"
+	// living = "Discoversoft.ActiveBasic"
+	// name =   "ActiveBasic"
+	// この場合、living は name を包括している。
+	bool IsCoverd( const string &name ) const;
+	bool IsCoverd( const NamespaceScopes &namespaceScopes ) const;
+
+	// 指定された名前空間が同一エリアと見なされるかどうかをチェック
+	static bool IsSameArea( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ){
+		if( entryNamespaceScopes.size() ){
+			if( baseNamespaceScopes.IsCoverd( entryNamespaceScopes ) ){
+				// 包括しているときは同一と見なす
+				return true;
+			}
+		}
+		else{
+			if( baseNamespaceScopes.size() ){
+				// 名前空間の判断が必要なとき
+				if( baseNamespaceScopes.IsImported()
+					|| baseNamespaceScopes.IsLiving() ){
+					// Using指定があるとき
+					// または
+					// 指定された名前空間が現在の名前空間スコープと同一のとき
+					return true;
+				}
+			}
+			else{
+				return true;
+			}
+		}
+
+		return false;
+	}
+};
+
+class NamespaceScopesCollection : public vector<NamespaceScopes>
+{
+public:
+	bool IsExist( const NamespaceScopes &namespaceScopes ) const
+	{
+		const NamespaceScopesCollection &namespaceScopesCollection = *this;
+		BOOST_FOREACH( const NamespaceScopes &tempNamespaceScopes, namespaceScopesCollection ){
+			if( tempNamespaceScopes.IsEqual( namespaceScopes ) ){
+				return true;
+			}
+		}
+		return false;
+	}
+	bool IsExist( const string &namespaceStr ) const
+	{
+		return IsExist( NamespaceScopes( namespaceStr ) );
+	}
+	void SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const;
+
+	void Imports( const string &namespaceStr );
+
+	static bool CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection );
+};
Index: /trunk/abdev/BasicCompiler_Common/include/Prototype.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Prototype.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Prototype.h	(revision 147)
@@ -0,0 +1,114 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include <Namespace.h>
+
+using namespace std;
+
+class CMethod;
+class UserProc;
+
+class Prototype
+{
+public:
+	enum Accessibility{
+		None,
+		Private,
+		Protected,
+		Public,
+	};
+
+private:
+	// 名前空間
+	NamespaceScopes namespaceScopes;
+
+	//名前
+	string name;
+
+	mutable bool isUsing;
+
+public:
+
+	Prototype( const NamespaceScopes &namespaceScopes, const string &name )
+		: namespaceScopes( namespaceScopes )
+		, name( name )
+		, isUsing( false )
+	{
+	}
+	~Prototype()
+	{
+	}
+
+	// 名前空間
+	const NamespaceScopes &GetNamespaceScopes() const
+	{
+		return namespaceScopes;
+	}
+
+	const string &GetName() const
+	{
+		return name;
+	}
+
+	//自身と等しいかどうかを確認
+	bool IsEquals( const Prototype *prototype ) const
+	{
+		if( this == prototype ){
+			return true;
+		}
+		return false;
+	}
+
+	// シンボル比較
+	bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const;
+	bool IsEqualSymbol( const Prototype &prototype ) const;
+	bool IsEqualSymbol( const string &name ) const;
+
+	// 利用状況
+	bool IsUsing() const
+	{
+		return isUsing;
+	}
+	void Using() const
+	{
+		isUsing = true;
+	}
+
+};
+
+class MemberPrototype
+{
+	Prototype::Accessibility accessibility;
+public:
+	MemberPrototype( Prototype::Accessibility accessibility )
+		: accessibility( accessibility )
+	{
+	}
+
+	Prototype::Accessibility GetAccessibility() const
+	{
+		return accessibility;
+	}
+	void SetAccessibility( Prototype::Accessibility accessibility ){
+		this->accessibility = accessibility;
+	}
+
+	bool IsNoneAccess() const
+	{
+		return ( accessibility == Prototype::None );
+	}
+	bool IsPrivate() const
+	{
+		return ( accessibility == Prototype::Private );
+	}
+	bool IsProtected() const
+	{
+		return ( accessibility == Prototype::Protected );
+	}
+	bool IsPublic() const
+	{
+		return ( accessibility == Prototype::Public );
+	}
+};
Index: /trunk/abdev/BasicCompiler_Common/include/Smoothie.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Smoothie.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Smoothie.h	(revision 147)
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "Source.h"
+#include "../TypeDef.h"
+#include "Namespace.h"
+
+class Smoothie{
+public:
+
+	class Logger{
+		static string log;
+	public:
+		static void Initialize(){
+#ifdef _DEBUG
+			log = "";
+
+			ofstream ofs( ( (string)BasicSystemDir + "Log\\compile.log" ).c_str(), ios_base::trunc );
+			ofs.close();
+#endif
+		}
+		static void Put( const string &text );
+		static void PutFile( const string &fileName, const string &buffer ){
+			ofstream ofs( ( (string)BasicSystemDir + "Log\\" + fileName ).c_str() );
+			ofs << buffer << endl;
+			ofs.close();
+		}
+	};
+
+	class Lexical{
+	public:
+		static BasicSource source;
+		static NamespaceScopes liveingNamespaceScopes;
+	};
+
+	// プロジェクト中に存在するメタ情報
+	class Meta{
+	public:
+		// 名前空間
+		static NamespaceScopesCollection namespaceScopesCollection;
+
+		// クラス
+
+		// TypeDef
+		static TypeDefCollection typeDefs;
+
+		// 関数ポインタ
+		static vector<ProcPointer *> procPointers;
+
+		// blittable型
+		static BlittableTypes blittableTypes;
+	};
+
+	// コンパイル中に一時的に利用する
+	class Temp{
+	public:
+		// 現在インポートされている名前空間
+		static NamespaceScopesCollection importedNamespaces;
+	};
+
+	static bool isFullCompile;
+};
Index: /trunk/abdev/BasicCompiler_Common/include/Source.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Source.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Source.h	(revision 147)
@@ -0,0 +1,76 @@
+#pragma once
+
+#include <vector>
+#include <string>
+
+#include <windows.h>
+#include <stdlib.h>
+
+using namespace std;
+
+class Text{
+protected:
+	char *buffer;
+	int length;
+
+public:
+
+	Text(){
+		buffer = (char *)calloc( 1, 1 );
+		length = 0;
+	}
+	~Text(){
+		free( buffer );
+	}
+
+	bool ReadFile( const string &filePath );
+};
+
+class BasicSource : public Text
+{
+	static const string generateDirectiveName;
+
+	void Realloc( int newLength ){
+		buffer = (char *)realloc( buffer, newLength + 255 );
+
+		length = newLength;
+
+		extern char *basbuf;
+		basbuf = buffer + 2;
+	}
+
+	void IncludeFiles();
+
+	void ChangeReturnLineChar();
+
+	void RemoveComments();
+
+	bool ReadFile_InIncludeDirective( const string &filePath );
+	void DirectiveIncludeOrRequire();
+
+	void RemoveReturnLineUnderbar();
+
+public:
+	BasicSource(){}
+	~BasicSource(){}
+
+	char *GetBuffer(){
+		return buffer+2;
+	}
+	int GetLength(){
+		return length-2;
+	}
+
+	void SetBuffer( const char *buffer );
+
+	bool ReadFile( const string &filePath );
+
+	bool Generate( const string &genName, const char *buffer );
+
+	void Addition( const char *buffer );
+
+	void operator = ( const BasicSource &source ){
+		Realloc( source.length );
+		lstrcpy( buffer, source.buffer );
+	}
+};
Index: /trunk/abdev/BasicCompiler_Common/include/Symbol.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Symbol.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/Symbol.h	(revision 147)
@@ -0,0 +1,31 @@
+#pragma once
+
+#include <vector>
+#include <string>
+
+#include <Namespace.h>
+
+using namespace std;
+
+class Symbol
+{
+	NamespaceScopes namespaceScopes;
+	string name;
+public:
+	Symbol( const NamespaceScopes &namespaceScopes, const string &name )
+		: namespaceScopes( namespaceScopes )
+		, name( name )
+	{
+	}
+	Symbol( const char *fullName );
+	Symbol( const string &fullName );
+
+	const NamespaceScopes &GetNamespaceScopes() const
+	{
+		return namespaceScopes;
+	}
+	const string &GetName() const
+	{
+		return name;
+	}
+};
Index: /trunk/abdev/BasicCompiler_Common/include/logger.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/logger.h	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/include/logger.h	(revision 147)
@@ -0,0 +1,82 @@
+#pragma once
+
+#include <iomanip>
+#include <ios>//streamsize
+#include <streambuf>//basic_streambuf
+#include <string>//char_traits, basic_string
+#include <tchar.h>//char_traits, basic_string
+#include <sstream>
+
+#include <tchar.h>
+#include <stdarg.h>
+
+#define STDX_DSTREAM_BUFFERING
+
+using namespace std;
+
+extern char BasicSystemDir[MAX_PATH];
+
+
+// VC++ で STLport だと using std::char_traits; みたいなのが必要かも
+template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >
+class basic_dbg_streambuf: public std::basic_stringbuf<Ch_T, Tr_T>
+{
+public:
+  basic_dbg_streambuf()
+    {
+#ifndef STDX_DSTREAM_BUFFERING
+      setbuf(0,0);
+#endif
+    }
+
+  virtual ~basic_dbg_streambuf()
+    {
+      sync();
+    }
+
+protected:
+  int sync(void)
+    {
+      dbg_out(str().c_str());
+      pbump(static_cast<int>(pbase() - pptr()));
+      return 0;
+    }
+
+  void dbg_out(const Ch_T*);
+};
+
+template <>
+inline void basic_dbg_streambuf<char>::dbg_out(const char *str)
+{
+	ofstream ofs( ( (string)BasicSystemDir + "logger.log" ).c_str(), ios_base::app );
+	ofs << str ;
+	ofs.close();
+}
+
+template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >
+class basic_dbg_ostream: public std::basic_ostream<Ch_T, Tr_T>
+{
+public:
+basic_dbg_ostream() : std::basic_ostream<Ch_T, Tr_T>(new \
+    basic_dbg_streambuf<Ch_T, Tr_T>())
+    {
+		ofstream ofs( ( (string)BasicSystemDir + "logger.log" ).c_str(), ios_base::trunc );
+		ofs.close();
+    }
+
+  virtual ~basic_dbg_ostream()
+    {
+      // flush(); // 不要らしい．http://www.tietew.jp/cppll/archive/607
+      delete rdbuf();
+    }
+};
+
+// ログ生成しない場合はこの下の行をコメントアウトする
+#define USE_TRACE
+
+#ifdef USE_TRACE
+static basic_dbg_ostream<_TCHAR> logger;
+#define trace(s) logger << s << endl
+#else
+#define trace(s)
+#endif
Index: /trunk/abdev/BasicCompiler_Common/src/Exception.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Exception.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Exception.cpp	(revision 147)
@@ -0,0 +1,19 @@
+#include <Exception.h>
+
+namespace Exception{
+
+
+void TryCommand(){
+}
+void CatchCommand(){
+}
+void FinallyCommand(){
+}
+void EndTryCommand(){
+}
+
+void ThrowCommand( const char *Parameter ){
+}
+
+
+}	// Exception
Index: /trunk/abdev/BasicCompiler_Common/src/Member.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Member.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Member.cpp	(revision 147)
@@ -0,0 +1,92 @@
+#include "../common.h"
+#ifdef _AMD64_
+#include "../../BasicCompiler64/opcode.h"
+#else
+#include "../../BasicCompiler32/opcode.h"
+#endif
+#include <Member.h>
+
+CMember::CMember( CClass *pobj_c, Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine )
+	: MemberPrototype( accessibility )
+{
+	extern int cp;
+
+	//構文を解析
+	char VarName[VN_SIZE];
+	char initBuffer[VN_SIZE];
+	char lpszConstructParameter[VN_SIZE];
+	GetDimentionFormat(buffer,VarName,SubScripts,type,initBuffer,lpszConstructParameter);
+
+	//重複チェック
+	if(pobj_c->DupliCheckAll(VarName)){
+		SetError(15,VarName,cp);
+	}
+
+	//メンバ名
+	name = VarName;
+
+	//定数扱いかどうか
+	this->isConst = isConst;
+
+	//初期データ
+	initializeExpression = initBuffer;
+
+	//コンストラクタ用のパラメータ
+	constructParameter = lpszConstructParameter;
+
+	//ソースコードの位置
+	source_code_address=nowLine;
+}
+CMember::CMember(CMember &member)
+	: MemberPrototype( member.GetAccessibility() )
+	, name( member.GetName() )
+	, type( member.GetType() )
+	, isConst( member.IsConst() )
+{
+	//SubScripts
+	memcpy(SubScripts,member.SubScripts,MAX_ARRAYDIM*sizeof(int));
+
+	//ソースコードの位置
+	source_code_address=member.source_code_address;
+}
+CMember::~CMember(){
+}
+
+void CMember::InitStaticMember(void){
+	//静的メンバをグローバル領域に作成
+
+	//イテレータをリセット
+	extern CDBClass *pobj_DBClass;
+	pobj_DBClass->Iterator_Reset();
+
+	int back_cp=cp;
+
+	while(pobj_DBClass->Iterator_HasNext()){
+		CClass &objClass = *pobj_DBClass->Iterator_GetNext();
+
+		// 名前空間をセット
+		Smoothie::Lexical::liveingNamespaceScopes = objClass.GetNamespaceScopes();
+
+		int i=0;
+		foreach( CMember *member, objClass.staticMembers ){
+			char temporary[VN_SIZE];
+			sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->GetName().c_str());
+			dim(
+				temporary,
+				member->SubScripts,
+				member->GetType(),
+				member->GetInitializeExpression().c_str(),
+				member->GetConstructParameter().c_str(),
+				0);
+
+			//ネイティブコードバッファの再確保
+			ReallocNativeCodeBuffer();
+
+			i++;
+		}
+	}
+
+	Smoothie::Lexical::liveingNamespaceScopes.clear();
+
+	cp=back_cp;
+}
Index: /trunk/abdev/BasicCompiler_Common/src/Method.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Method.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Method.cpp	(revision 147)
@@ -0,0 +1,70 @@
+#include "../common.h"
+#include <Method.h>
+
+
+Methods::Methods()
+{
+}
+Methods::~Methods()
+{
+	Methods &methods = *this;
+	BOOST_FOREACH( CMethod *pMethod, methods ){
+		delete pMethod;
+	}
+}
+
+void Methods::Add( UserProc *pUserProc,Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual ){
+	CMethod *pMethod = new DynamicMethod( pUserProc, accessibility, isAbstract, isVirtual, isConst );
+	this->push_back( pMethod );
+	pUserProc->SetMethod( pMethod );
+}
+void Methods::AddStatic(UserProc *pUserProc, Prototype::Accessibility accessibility ){
+	CMethod *pMethod = new StaticMethod( pUserProc, accessibility );
+	this->push_back( pMethod );
+	pUserProc->SetMethod( pMethod );
+}
+
+const CMethod *Methods::GetMethodPtr( UserProc *pUserProc ) const
+{
+	const Methods &methods = *this;
+	for( int i=(int)methods.size()-1; i>=0; i-- ){
+		if( pUserProc == methods[i]->pUserProc ){
+			return methods[i];
+		}
+	}
+	return NULL;
+}
+bool Methods::IsExist( const char *name ) const
+{
+	const Methods &methods = *this;
+	foreach( const CMethod *pMethod, methods ){
+		if( pMethod->pUserProc->GetName() == name ) return true;
+	}
+	return false;
+}
+void Methods::Enum( const char *methodName, vector<UserProc *> &subs ) const
+{
+	//オブジェクトのメンバ関数の場合
+	//※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
+	const Methods &methods = *this;
+	for( int i=(int)methods.size()-1; i>=0; i-- ){
+		if( methods[i]->pUserProc->GetName() == methodName ){
+			subs.push_back( methods[i]->pUserProc );
+		}
+	}
+}
+void Methods::Enum( const BYTE idOperatorCalc, vector<UserProc *> &subs ) const
+{
+	//オブジェクトのメンバ関数の場合
+	//※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
+	const Methods &methods = *this;
+	for( int i=(int)methods.size()-1; i>=0; i-- ){
+		UserProc *pUserProc = methods[i]->pUserProc;
+		const char *temp = pUserProc->GetName().c_str();
+		if(temp[0]==1&&temp[1]==ESC_OPERATOR){
+			if((BYTE)temp[2]==idOperatorCalc){
+				subs.push_back( pUserProc );
+			}
+		}
+	}
+}
Index: /trunk/abdev/BasicCompiler_Common/src/Namespace.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Namespace.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Namespace.cpp	(revision 147)
@@ -0,0 +1,161 @@
+#include "../common.h"
+
+
+NamespaceScopes::NamespaceScopes( const string &namespaceStr ){
+	if( namespaceStr.size() == 0 ){
+		return;
+	}
+
+	string::size_type i = 0;
+	while( true ){
+		string::size_type i2 = namespaceStr.find( '.', i );
+
+		string tempName = namespaceStr.substr( i, i2-i );
+
+		push_back( tempName );
+
+		if( i2 == string::npos ){
+			break;
+		}
+
+		i = i2 + 1;
+	}
+}
+
+bool NamespaceScopes::IsImported() const
+{
+	BOOST_FOREACH( const NamespaceScopes &namespaceScopes, Smoothie::Temp::importedNamespaces ){
+		if( this->IsEqual( namespaceScopes ) ){
+			return true;
+		}
+	}
+	return false;
+}
+bool NamespaceScopes::IsLiving() const
+{
+	if( IsBelong( *this, Smoothie::Lexical::liveingNamespaceScopes ) ){
+		return true;
+	}
+	return false;
+}
+
+// 包括しているかをチェック
+// 例:
+// this =   "Discoversoft.ActiveBasic"
+// living = "Discoversoft.ActiveBasic"
+// name =   "ActiveBasic"
+// この場合、living は name を包括している。
+bool NamespaceScopes::IsCoverd( const string &name ) const
+{
+	if( IsEqual( name ) ){
+		return true;
+	}
+
+	string thisStr = ToString();
+
+	NamespaceScopes tempLivingNamespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
+
+	while( tempLivingNamespaceScopes.size() ){
+		NamespaceScopes tempNamespaceScopes = tempLivingNamespaceScopes;
+
+		string tempStr = tempNamespaceScopes.ToString() + "." + name;
+		if( thisStr == tempStr ){
+			return true;
+		}
+
+		tempLivingNamespaceScopes.pop_back();
+	}
+	return false;
+}
+bool NamespaceScopes::IsCoverd( const NamespaceScopes &namespaceScopes ) const
+{
+	return IsCoverd( namespaceScopes.ToString() );
+}
+
+
+void NamespaceScopesCollection::SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const
+{
+	NamespaceScopes namespaceScopes( fullName );
+	bool hasSimpleName = false;
+	while( namespaceScopes.size() > 0 ){
+		if( IsExist( namespaceScopes ) ){
+			break;
+		}
+		namespaceScopes.pop_back();
+
+		hasSimpleName = true;
+	}
+
+	lstrcpy( namespaceStr, namespaceScopes.ToString().c_str() );
+
+	bool hasNamespace = false;
+	if( namespaceStr[0] ){
+		hasNamespace = true;
+	}
+
+	int dotLength = 0;
+	if( hasSimpleName && hasNamespace ){
+		dotLength = 1;
+	}
+
+	lstrcpy( simpleName, fullName + lstrlen( namespaceStr ) + dotLength );
+}
+void NamespaceScopesCollection::Imports( const string &namespaceStr ){
+	NamespaceScopes namespaceScopes( namespaceStr );
+	if( !Smoothie::Meta::namespaceScopesCollection.IsExist( namespaceScopes ) ){
+		SetError(64,namespaceStr.c_str(),cp );
+		return;
+	}
+
+	this->push_back( namespaceScopes );
+}
+bool NamespaceScopesCollection::CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection )
+{
+	int i, i2;
+	char temporary[VN_SIZE];
+
+	bool isSuccessful = true;
+
+	// 名前空間管理
+	NamespaceScopes namespaceScopes;
+
+	for(i=0;;i++){
+		if(source[i]=='\0') break;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			if( !namespaceScopesCollection.IsExist( namespaceScopes ) ){
+				namespaceScopesCollection.push_back( namespaceScopes );
+			}
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				SetError(12, "End Namespace", i );
+				isSuccessful = false;
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+	}
+
+	if( namespaceScopes.size() > 0 ){
+		SetError(63,NULL,-1);
+		isSuccessful = false;
+	}
+
+	return isSuccessful;
+}
Index: /trunk/abdev/BasicCompiler_Common/src/Prototype.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Prototype.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Prototype.cpp	(revision 147)
@@ -0,0 +1,23 @@
+#include "../common.h"
+#include <Prototype.h>
+
+bool Prototype::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
+{
+	if( GetName() != name ){
+		return false;
+	}
+
+	return NamespaceScopes::IsSameArea( GetNamespaceScopes(), namespaceScopes );
+}
+bool Prototype::IsEqualSymbol( const Prototype &prototype ) const
+{
+	return IsEqualSymbol( prototype.GetNamespaceScopes(), prototype.GetName() );
+}
+bool Prototype::IsEqualSymbol( const string &fullName ) const
+{
+	char AreaName[VN_SIZE] = "";		//オブジェクト変数
+	char NestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
+
+	return IsEqualSymbol( NamespaceScopes( AreaName ), NestName );
+}
Index: /trunk/abdev/BasicCompiler_Common/src/Smoothie.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Smoothie.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Smoothie.cpp	(revision 147)
@@ -0,0 +1,27 @@
+#include <..\common.h>
+
+string Smoothie::Logger::log = "";
+
+void Smoothie::Logger::Put( const string &text )
+{
+//#ifdef _DEBUG
+	log += text + "\r\n";
+
+	{
+		ofstream ofs( ( (string)BasicSystemDir + "Log\\compile.log" ).c_str(), ios_base::app );
+		ofs << text << endl;
+		ofs.close();
+	}
+//#endif
+}
+
+BasicSource Smoothie::Lexical::source;
+NamespaceScopes Smoothie::Lexical::liveingNamespaceScopes;
+
+TypeDefCollection Smoothie::Meta::typeDefs;
+vector<ProcPointer *> Smoothie::Meta::procPointers;
+NamespaceScopesCollection Smoothie::Meta::namespaceScopesCollection;
+NamespaceScopesCollection Smoothie::Temp::importedNamespaces;
+BlittableTypes Smoothie::Meta::blittableTypes;
+
+bool Smoothie::isFullCompile = false;
Index: /trunk/abdev/BasicCompiler_Common/src/Source.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Source.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Source.cpp	(revision 147)
@@ -0,0 +1,913 @@
+#include <Source.h>
+
+#include "../common.h"
+#include <windows.h>
+
+
+const string BasicSource::generateDirectiveName = "#generate";
+
+
+class CDefine{
+	vector<string> names;
+public:
+	CDefine();
+	~CDefine();
+	void Free();
+	void Init();
+
+	BOOL add(char *name);
+	BOOL undef(char *name);
+	BOOL check(char *name);
+	void preprocessor_ifdef(char *buffer,bool isNot);
+	void DirectiveIfdef(char *buffer);
+};
+CDefine objDefine;
+
+
+//////////////////////////////////////
+// #requireの管理
+//////////////////////////////////////
+class CRequireFiles{
+	char **ppFilePath;
+	int count;
+public:
+	CRequireFiles(){
+		ppFilePath = (char **)malloc( 1 );
+		count = 0;
+	}
+	~CRequireFiles(){
+		for( int i = 0; i < count; i++ ){
+			free( ppFilePath[i] );
+		}
+		free( ppFilePath );
+	}
+	void clear(){
+		for( int i = 0; i < count; i++ ){
+			free( ppFilePath[i] );
+		}
+		free( ppFilePath );
+
+		ppFilePath = (char **)malloc( 1 );
+		count = 0;
+	}
+	bool IsIncluded( const char *includeFilePath ){
+		// '/' → '\\'
+		char tempPath[MAX_PATH];
+		lstrcpy( tempPath, includeFilePath );
+		for( int i=0; tempPath[i]; i++ ){
+			if( tempPath[i] == '/' ){
+				tempPath[i] = '\\';
+			}
+		}
+
+		for( int i=0; i<count; i++ ){
+			if( lstrcmpi( ppFilePath[i], tempPath ) == 0 ){
+				return true;
+			}
+		}
+		return false;
+	}
+	void Add( const char *includeFilePath ){
+		// '/' → '\\'
+		char tempPath[MAX_PATH];
+		lstrcpy( tempPath, includeFilePath );
+		for( int i=0; tempPath[i]; i++ ){
+			if( tempPath[i] == '/' ){
+				tempPath[i] = '\\';
+			}
+		}
+
+		//既に読み込まれているとき
+		if( IsIncluded( tempPath ) ) return;
+
+		//追加
+		ppFilePath = (char **)realloc(ppFilePath, ( count + 1 ) * sizeof(char *) );
+		ppFilePath[count] = (char *)malloc( lstrlen(tempPath) + 1 );
+		lstrcpy( ppFilePath[count], tempPath );
+		count++;
+	}
+};
+CRequireFiles requireFiles;
+
+
+//////////////////////////////////////
+// #define間するクラス
+//////////////////////////////////////
+
+CDefine::CDefine(){
+	Init();
+}
+CDefine::~CDefine(){
+}
+void CDefine::Init(){
+	names.clear();
+
+	extern BOOL bDebugCompile;
+	if(bDebugCompile) add("_DEBUG");
+
+#ifdef _AMD64_
+	add("_WIN64");
+#endif
+
+	extern BOOL bDll;
+	if( bDll ){
+		add("_DLL");
+	}
+
+	extern bool isUnicode;
+	if( isUnicode ){
+		add( "UNICODE" );
+	}
+
+	char temporary[255];
+	sprintf(temporary,"_AB_VER%d",MAJOR_VER);
+	add(temporary);
+}
+BOOL CDefine::add(char *name){
+	extern HANDLE hHeap;
+
+	//重複チェック
+	if(check(name)) return 0;
+
+	//追加
+	names.push_back( name );
+
+	return 1;
+}
+BOOL CDefine::undef(char *name){
+	vector<string>::iterator i = names.begin();
+	foreach( const string &temp, names ){
+		if( temp == name ){
+			names.erase( i );
+			return 1;
+		}
+		i++;
+	}
+
+	return 0;
+}
+BOOL CDefine::check(char *name){
+
+	//重複チェック
+	foreach( const string &temp, names ){
+		if( temp == name ){
+			return 1;
+		}
+	}
+	return 0;
+}
+
+int Search_endif(char *buffer,int i, int *pLine = 0){
+	for(;;i++){
+		if(buffer[i]=='\0') break;
+
+		if( buffer[i] == '\n' ){
+			if( pLine ){
+				(*pLine)++;
+			}
+		}
+
+		if(buffer[i-1]=='\n'){
+			if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
+				i=Search_endif(buffer,i+6, pLine);
+				if(buffer[i]=='\0') break;
+				continue;
+			}
+			else if(memicmp(buffer+i,"#endif",6)==0){
+				break;
+			}
+		}
+	}
+	return i;
+}
+
+void CDefine::preprocessor_ifdef(char *buffer,bool isNot){
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+
+	if(isNot) i=lstrlen("#ifndef");
+	else i=lstrlen("#ifdef");
+	while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+	for(i2=0;;i++,i2++){
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			temporary[i2]=0;
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+	int sw=0;
+	if(check(temporary)) sw=1;
+
+	if(isNot){
+		//#ifndefのとき（反対にする）
+		if(sw) sw=0;
+		else sw=1;
+	}
+
+	//#ifdefの行を消去
+	SlideString(buffer+i,-i);
+	i=0;
+
+	BOOL bElse=0;
+	if(sw){
+		//TRUEのとき
+
+		//#else、#endifを探索
+		for(;;i++){
+			if(buffer[i]=='\0') break;
+
+			if(i==0||buffer[i-1]=='\n'){
+				if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
+					i=Search_endif(buffer,i+6);
+					if(buffer[i]=='\0') break;
+					continue;
+				}
+				else if(memicmp(buffer+i,"#else",5)==0){
+					i2=5;
+					bElse=1;
+					break;
+				}
+				else if(memicmp(buffer+i,"#endif",6)==0){
+					i2=6;
+					bElse=0;
+					break;
+				}
+			}
+		}
+
+		//行を消去
+		SlideString(buffer+i+i2,-i2);
+
+		if(bElse){
+			//#elseがある場合はその区間を消去
+
+			for(i2=i,i3=0;;i2++){
+				if(buffer[i2]=='\0') break;
+
+				if(buffer[i2]=='\n') i3++;
+
+				if(i2==0||buffer[i2-1]=='\n'){
+					if(memicmp(buffer+i2,"#ifdef",6)==0||memicmp(buffer+i2,"#ifndef",7)==0){
+						i2=Search_endif(buffer,i2+6, &i3 );
+						if(buffer[i2]=='\0') break;
+						continue;
+					}
+					if(memicmp(buffer+i2,"#endif",6)==0){
+						i2+=6;
+						break;
+					}
+				}
+			}
+
+			//ソースコード区間を消去し、改行コードを挿入
+			SlideString(buffer+i2,i-i2+i3);
+			memset(buffer+i,'\n',i3);
+		}
+	}
+	else{
+		//FALSEのとき
+
+		//#else、#endifを探索
+		for(i2=i,i3=0;;i2++){
+			if(buffer[i2]=='\0') break;
+
+			if(buffer[i2]=='\n') i3++;
+
+			if(i2==0||buffer[i2-1]=='\n'){
+				if(memicmp(buffer+i2,"#ifdef",6)==0||memicmp(buffer+i2,"#ifndef",7)==0){
+					i2=Search_endif(buffer,i2+6, &i3 );
+					if(buffer[i2]=='\0') break;
+					continue;
+				}
+				else if(memicmp(buffer+i2,"#else",5)==0){
+					i2+=5;
+					bElse=1;
+					break;
+				}
+				else if(memicmp(buffer+i2,"#endif",6)==0){
+					i2+=6;
+					bElse=0;
+					break;
+				}
+			}
+		}
+
+		//ソースコード区間を消去し、改行コードを挿入
+		SlideString(buffer+i2,i-i2+i3);
+		memset(buffer+i,'\n',i3);
+
+		if(bElse){
+			//#endifを探索
+			for(;;i++){
+				if(buffer[i]=='\0') break;
+
+				if(i==0||buffer[i-1]=='\n'){
+					if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
+						i=Search_endif(buffer,i+6);
+						if(buffer[i]=='\0') break;
+						continue;
+					}
+					else if(memicmp(buffer+i,"#endif",6)==0){
+						i2=6;
+						bElse=0;
+						break;
+					}
+				}
+			}
+
+			//行を消去
+			SlideString(buffer+i+i2,-i2);
+		}
+	}
+}
+
+
+void CDefine::DirectiveIfdef(char *buffer){
+	int i,i2,i3,sw;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+
+		if(i==0||(i>=1&&buffer[i-1]=='\n')){
+			sw=0;
+			if(memicmp(buffer+i,"#define",7)==0){
+				i2=i+7;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+				for(i3=0;;i2++,i3++){
+					if(buffer[i2]=='\n'||buffer[i2]=='\0'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=buffer[i2];
+				}
+
+				add(temporary);
+
+				i2-=i;
+
+				//ディレクティブを消去
+				SlideString(buffer+i+i2,-i2);
+			}
+			if(memicmp(buffer+i,"#undef",6)==0){
+				i2=i+7;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+				for(i3=0;;i2++,i3++){
+					if(buffer[i2]=='\n'||buffer[i2]=='\0'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=buffer[i2];
+				}
+
+				undef(temporary);
+
+				i2-=i;
+
+				//ディレクティブを消去
+				SlideString(buffer+i+i2,-i2);
+			}
+			else if(memicmp(buffer+i,"#ifdef",6)==0){
+				preprocessor_ifdef(buffer+i,false);
+				continue;
+			}
+			else if(memicmp(buffer+i,"#ifndef",7)==0){
+				preprocessor_ifdef(buffer+i,true);
+				continue;
+			}
+			else continue;
+		}
+	}
+}
+
+
+
+
+bool Text::ReadFile( const string &filePath ){
+	//ファイルオープン
+	HANDLE hFile=CreateFile(filePath.c_str(),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		return false;
+	}
+
+	length = GetFileSize( hFile, NULL );
+
+	buffer = (char *)realloc( buffer, length + 1 );
+
+	//読み込み
+	DWORD dwAccBytes;
+	::ReadFile(hFile,buffer,length,&dwAccBytes,0);
+	buffer[dwAccBytes]=0;
+
+	//ファイルクローズ
+	CloseHandle(hFile);
+
+	return true;
+}
+
+void BasicSource::ChangeReturnLineChar(){
+	int i,i2;
+
+#ifdef _DEBUG
+	//改行コードの整合性チェック
+	for( i=0; ; i++ ){
+		if( buffer[i] == '\0' ){
+			break;
+		}
+		if( buffer[i]!='\r' && buffer[i+1]=='\n'
+			||  buffer[i]=='\r' && buffer[i+1]!='\n' ){
+				char temporary[255];
+				strncpy( temporary, buffer + i-100, 130 );
+				temporary[130] = 0;
+				for(int i2=0; ;i2++){
+					if(temporary[i2]=='\r') temporary[i2]='A';
+					if(temporary[i2]=='\n') temporary[i2]='B';
+					if(temporary[i2]=='\0') break;
+				}
+
+				extern HWND hOwnerEditor;
+				MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION );
+		}
+	}
+#endif
+
+	//改行コードのCRLFをLFに変換
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
+		buffer[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+
+	length = i;
+}
+
+void BasicSource::RemoveComments(){
+	int i,i2,i3,IsStr;
+	char *temporary;
+	temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
+	for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+
+			if(i3){
+				//複数行に渡る注釈文の中に改行が存在するとき
+				memset(temporary+i2,'\n',i3);
+				i2+=i3;
+				i3=0;
+			}
+		}
+		if(buffer[i]=='\''&&IsStr==0){
+			//注釈文
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+			while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
+		}
+		if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
+			//注釈文（複数行）
+			i+=2;
+			i3=0;
+			while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
+				if(buffer[i]=='\n') i3++;
+				if(buffer[i]=='\0') break;
+				i++;
+			}
+			if(buffer[i]){
+				i+=2;
+			}
+			i--;
+			i2--;
+			continue;
+		}
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	lstrcpy(buffer,temporary);
+	GlobalFree(temporary);
+}
+
+bool BasicSource::ReadFile_InIncludeDirective( const string &filePath ){
+	if( !Text::ReadFile( filePath ) ){
+		return false;
+	}
+
+	// 改行コードをCRLFからLFに変換
+	ChangeReturnLineChar();
+
+	// コメントを削除
+	RemoveComments();
+
+	// #ifdefディレクティブを処理
+	objDefine.DirectiveIfdef( buffer );
+
+	// アンダーバーによる改行を正規表現に戻す
+	RemoveReturnLineUnderbar();
+
+	// ダミー改行をセット
+	Realloc( length + 2 );
+	SlideString( buffer, 2 );
+	buffer[0] = '\n';
+	buffer[1] = '\n';
+
+	return true;
+}
+
+void BasicSource::DirectiveIncludeOrRequire(){
+	extern HANDLE hHeap;
+	extern char szIncludeDir[MAX_PATH];
+	extern char BasicCurDir[MAX_PATH];
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	int i,i2,i3,sw1,LineNum,FileLayer[255],layer,LastFileByte[255];
+	char temporary[MAX_PATH],temp2[MAX_PATH+255],*LayerDir[255];
+
+	IncludeFileInfo.ppFileNames=(char **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(char *));
+	extern char SourceFileName[MAX_PATH];
+	IncludeFileInfo.ppFileNames[0]=(char *)HeapAlloc(hHeap,0,lstrlen(SourceFileName)+1);
+	lstrcpy(IncludeFileInfo.ppFileNames[0],SourceFileName);
+	IncludeFileInfo.FilesNum=1;
+
+	layer=0;
+	FileLayer[layer]=0;
+	LastFileByte[layer]=GetLength();
+	LineNum=0;
+
+	//参照ディレクトリ
+	LayerDir[0]=(char *)HeapAlloc(hHeap,0,lstrlen(BasicCurDir)+1);
+	lstrcpy(LayerDir[0],BasicCurDir);
+
+	for(i=0;;i++){
+		if(buffer[i]=='\0'){
+			IncludeFileInfo.LineOfFile[LineNum]=-1;
+			break;
+		}
+		if(buffer[i]=='\n'){
+			IncludeFileInfo.LineOfFile[LineNum]=FileLayer[layer];
+			LineNum++;
+		}
+		if(i>LastFileByte[layer]){
+			HeapDefaultFree(LayerDir[layer]);
+			LayerDir[layer]=0;
+			layer--;
+		}
+		if((buffer[i-1]=='\n'||i==0)&&buffer[i]=='#'){
+			bool isRequire = false;
+			if(memcmp( buffer + i + 1, "include", 7 ) == 0
+				|| memcmp( buffer + i + 1, "require", 7 ) == 0){
+
+					//#requireの場合
+					if( buffer[i + 1] == 'r' ) isRequire = true;
+
+					i2=i+8;
+					while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+					if(buffer[i2]=='\"') sw1=0;
+					else if(buffer[i2]=='<') sw1=1;
+					i2++;
+
+					for(i3=0;;i2++,i3++){
+						if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){
+							temporary[i3]=0;
+							break;
+						}
+						temporary[i3]=buffer[i2];
+					}
+					while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++;
+
+					if(sw1){
+						sprintf(temp2,"%s%s",szIncludeDir,temporary);
+						lstrcpy(temporary,temp2);
+					}
+					else GetFullPath(temporary,LayerDir[layer]);
+			}
+			else if(memcmp(buffer+i+1,"prompt",6)==0){
+				i2=i+7;
+				sprintf(temporary,"%sbasic\\prompt.sbp",szIncludeDir);
+			}
+			else if(memcmp(buffer+i+1,"N88BASIC",8)==0){
+				i2=i+9;
+				sprintf(temporary,"%sbasic\\prompt.sbp",szIncludeDir);
+			}
+			else if(memcmp(buffer+i+1,"console",7)==0){
+				//サブシステム タイプをCUIに変更
+				extern unsigned short TypeOfSubSystem;
+				TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_CUI;
+
+				i2=i+8;
+				sprintf(temporary,"%sbasic\\dos_console.sbp",szIncludeDir);
+			}
+			else continue;
+
+			if(i){
+				//ディレクティブが消えるため、一行減ってしまうのを防ぐ（basic.sbpを除く）
+				SlideString(buffer+i2,1);
+				buffer[i2]='\n';
+				for(i3=0;i3<=layer;i3++) LastFileByte[i3]++;
+			}
+
+			IncludeFileInfo.ppFileNames=(char **)HeapReAlloc(hHeap,0,IncludeFileInfo.ppFileNames,(IncludeFileInfo.FilesNum+1)*sizeof(char *));
+			IncludeFileInfo.ppFileNames[IncludeFileInfo.FilesNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(IncludeFileInfo.ppFileNames[IncludeFileInfo.FilesNum],temporary);
+
+			layer++;
+			FileLayer[layer]=IncludeFileInfo.FilesNum;
+			IncludeFileInfo.FilesNum++;
+
+			//#requireの場合では、既に読み込まれているファイルは読み込まないようにする
+			bool isFake = false;
+			if( isRequire ){
+				if( requireFiles.IsIncluded( temporary ) ){
+					//既に読み込まれているとき
+					isFake = true;
+				}
+			}
+
+			BasicSource source;
+
+			if( isFake ){
+				//既に読み込まれているときは空データ
+				source.SetBuffer( "" );
+			}
+			else{
+				//取り込まれたファイルを収集する
+				requireFiles.Add( temporary );
+
+				//インクルードファイルを読み込む
+				if( !source.ReadFile_InIncludeDirective( temporary ) ){
+					sprintf(temp2,"インクルードファイル \"%s\" をオープンできません",temporary);
+					SetError(-1,temp2,i);
+					break;
+				}
+			}
+
+			i3=lstrlen(buffer)+source.GetLength();
+			Realloc( i3 );
+			SlideString(buffer+i2,source.GetLength()+(i-i2));
+			memcpy(buffer+i,source.GetBuffer(),source.GetLength());
+
+			//新しい参照ディレクトリをセット
+			char temp4[MAX_PATH];
+			_splitpath(temporary,temp2,temp4,0,0);
+			lstrcat(temp2,temp4);
+			LayerDir[layer]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+			lstrcpy(LayerDir[layer],temp2);
+
+			//ファイル範囲をスライド
+			LastFileByte[layer]=i+source.GetLength()-1;
+			for(i3=0;i3<layer;i3++) LastFileByte[i3]+=source.GetLength()+(i-i2);
+
+			i--;
+		}
+	}
+
+	HeapDefaultFree(LayerDir[0]);
+
+	length = lstrlen(buffer);
+}
+
+int KillReturnCode_InParameter(char *buffer,int *pRnum,char cBeginPare,char cEndPare){
+	int i,i2,i3,IsStr;
+
+	//カッコ'('直下の改行
+	while(buffer[0]=='\n'){
+		SlideString(buffer+1,-1);
+		(*pRnum)++;
+	}
+
+	for(i=0,IsStr=0;;i++){
+		if(IsDBCSLeadByte(buffer[i])&&buffer[i+1]){
+			i++;
+			continue;
+		}
+
+		if(buffer[i]=='\"') IsStr^=1;
+
+		if(buffer[i]=='\0') break;	//エラー
+		if(buffer[i]=='\n'){
+			i2=0;
+			i3=0;
+			while(buffer[i+i2]=='\n'){
+				i2++;
+				i3++;
+				while(buffer[i+i2]==' '||buffer[i+i2]=='\t') i2++;
+			}
+			while(buffer[i+i2]==' '||buffer[i+i2]=='\t') i2++;
+
+			if(buffer[i+i2]==cEndPare){
+				SlideString(buffer+i+i2,-i2);
+				(*pRnum)+=i3;
+				break;
+			}
+
+			//エラー
+			break;
+		}
+
+		if(buffer[i]==cBeginPare&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,pRnum,cBeginPare,cEndPare);
+			i+=i2;
+			if(buffer[i]!=cEndPare) break;
+			continue;
+		}
+		if(buffer[i]==cEndPare&&IsStr==0) break;
+
+		if(buffer[i]==','&&buffer[i+1]=='\n'&&IsStr==0){
+			i++;
+			while(buffer[i]=='\n'){
+				SlideString(buffer+i+1,-1);
+				(*pRnum)++;
+			}
+			i--;
+		}
+	}
+	return i;
+}
+void BasicSource::RemoveReturnLineUnderbar(){
+	int i,i2;
+
+	//アンダーバーによる改行
+	for(i=0;;i++){
+		i2=0;
+		while(buffer[i]=='_'&&buffer[i+1]=='\n'){
+			i2++;
+			SlideString(buffer+i+2,-2);
+			while(buffer[i]=='\n'){
+				SlideString(buffer+i+1,-1);
+				i2++;
+			}
+			for(;;i++){
+				if(buffer[i]=='_'&&buffer[i+1]=='\n') break;
+				if(buffer[i]=='\n'||buffer[i]=='\0'){
+					SlideString(buffer+i,i2);
+					memset(buffer+i,'\n',i2);
+					break;
+				}
+			}
+		}
+		if(buffer[i]=='\0') break;
+	}
+
+	//カッコ内パラメータの改行
+	int IsStr,rnum;
+	for(i=0,IsStr=0,rnum=0;;i++){
+		if(IsDBCSLeadByte(buffer[i])&&buffer[i+1]){
+			i++;
+			continue;
+		}
+		if(buffer[i]=='\0') break;
+		if(buffer[i]=='\n'){
+			if(rnum){
+				SlideString(buffer+i+1,rnum);
+				memset(buffer+i+1,'\n',rnum);
+				rnum=0;
+			}
+		}
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='('&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,&rnum,'(',')');
+			i+=i2;
+			if(buffer[i]!=')') break;
+		}
+		if(buffer[i]=='['&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,&rnum,'[',']');
+			i+=i2;
+			if(buffer[i]!=']') break;
+		}
+	}
+
+	length = lstrlen(buffer);
+}
+
+void BasicSource::SetBuffer( const char *buffer ){
+	this->buffer = (char *)calloc( lstrlen(buffer) + 1, 1 );
+	lstrcpy( this->buffer, buffer );
+	length = lstrlen(buffer);
+
+	// ダミー改行をセット
+	Realloc( length + 2 );
+	SlideString( this->buffer, 2 );
+	this->buffer[0] = '\n';
+	this->buffer[1] = '\n';
+}
+
+bool BasicSource::ReadFile( const string &filePath ){
+	if( !Text::ReadFile( filePath ) ){
+		return false;
+	}
+
+	// 改行コードをCRLFからLFに変換
+	ChangeReturnLineChar();
+
+	// basic.sbpをインクルード
+	const char *headCode = "#include <basic.sbp>\n";
+	Realloc( length + lstrlen(headCode) );
+	SlideString( buffer, lstrlen(headCode) );
+	memcpy( buffer, headCode, lstrlen(headCode) );
+
+	// #defineと#requireを初期化
+	objDefine.Init();
+	requireFiles.clear();
+
+	// コメントを削除
+	RemoveComments();
+
+	// #ifdefディレクティブを処理
+	objDefine.DirectiveIfdef( buffer );
+
+	//最終行には文字を含ませないようにする
+	Realloc( length + 1 );
+	lstrcat( buffer, "\n" );
+
+	// #include / #require ディレクティブを処理
+	DirectiveIncludeOrRequire();
+
+	// アンダーバーによる改行を正規表現に戻す
+	RemoveReturnLineUnderbar();
+
+	// ダミー改行をセット
+	Realloc( length + 2 );
+	SlideString( buffer, 2 );
+	buffer[0] = '\n';
+	buffer[1] = '\n';
+
+	extern char *basbuf;
+	basbuf = GetBuffer();
+
+	return true;
+}
+
+bool BasicSource::Generate( const string &genName, const char *genBuffer ){
+	const int genBufferLength = lstrlen( genBuffer );
+
+#ifdef _DEBUG
+	// 挿入ソースに改行コードが含まれていないかを検査する
+	for( int i=0; genBuffer[i] ; i++ ){
+		if( genBuffer[i] == '\n' ){
+			SetError();
+			break;
+		}
+	}
+#endif
+
+	bool isFound = false;
+
+	for( int i=0; ; i++ ){
+		if( i == 0 || buffer[i] == '\n' ){
+			if( buffer[i] == '\n' ){
+				i++;
+			}
+			while( IsBlank( buffer[i] ) ){
+				i++;
+			}
+
+			int startIndex = i;
+
+			if( memicmp( buffer + i, generateDirectiveName.c_str(), generateDirectiveName.size() ) == 0 ){
+				i += (int)generateDirectiveName.size();
+				while( IsBlank( buffer[i] ) ){
+					i++;
+				}
+
+				char temporary[VN_SIZE];
+				for( int i2=0; ; i++, i2++ ){
+					if( buffer[i] == '\n' ){
+						temporary[i2] = 0;
+						break;
+					}
+					temporary[i2] = buffer[i];
+				}
+				if( genName == temporary ){
+					// 一致
+
+					int endIndex = i;
+
+					int lengthOffset = genBufferLength - ( endIndex - startIndex );
+
+					Realloc( length + lengthOffset );
+					SlideString( buffer + endIndex, lengthOffset );
+					memcpy( buffer + startIndex, genBuffer, genBufferLength );
+
+					isFound = true;
+
+					break;
+				}
+			}
+		}
+	}
+
+	return isFound;
+}
+
+void BasicSource::Addition( const char *buffer ){
+	Realloc( length + lstrlen(buffer) );
+	lstrcat( this->buffer, buffer );
+}
Index: /trunk/abdev/BasicCompiler_Common/src/Symbol.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Symbol.cpp	(revision 147)
+++ /trunk/abdev/BasicCompiler_Common/src/Symbol.cpp	(revision 147)
@@ -0,0 +1,21 @@
+#include <../common.h>
+#include <Symbol.h>
+
+Symbol::Symbol( const char *fullName )
+{
+	char areaName[VN_SIZE] = "";		//オブジェクト変数
+	char nestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName, areaName, nestName );
+
+	namespaceScopes = NamespaceScopes( areaName );
+	name = nestName;
+}
+Symbol::Symbol( const string &fullName )
+{
+	char areaName[VN_SIZE] = "";		//オブジェクト変数
+	char nestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName.c_str(), areaName, nestName );
+
+	namespaceScopes = NamespaceScopes( areaName );
+	name = nestName;
+}
