#include "stdafx.h" #include #include #include #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\" で区切ってください)。",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, "クラスまたはインターフェイス以外の型を継承元として指定することはできません。" ); if(num==136) 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]; 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{ std::string dummyStr; compiler.GetObjectModule().GetCurrentSource().GetLineInfo( pos, pErrorInfo[ErrorNum].line, dummyStr ); pErrorInfo[ErrorNum].FileName=(char *)HeapAlloc(hHeap,0,lstrlen(dummyStr.c_str())+1); lstrcpy(pErrorInfo[ErrorNum].FileName,dummyStr.c_str()); _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(const char *buffer){ SetError(-2,buffer,-1); } #define STRING_SYSTEM_DECLAREHANDLE "*_System_DeclareHandle_" void DifferentTypeError( const Type &varType, const Type &calcFormalType, const int iWarning,const char *pszFuncName,const int ParmNum){ ////////////////////////// // キャストに関する警告 ////////////////////////// char temporary[255]; Type calcType( calcFormalType ); if(IS_LITERAL(calcType.GetIndex())) { calcType.SetIndex( -1 ); } if(pszFuncName) sprintf(temporary,"\"%s\"の第%dパラメータが、",pszFuncName,ParmNum+1); else temporary[0]=0; std::string varTypeName = compiler.TypeToString( varType ); if(memcmp( varTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0) { varTypeName = varTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) ); } std::string calcTypeName = compiler.TypeToString( calcType ); if(memcmp( calcTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0) { calcTypeName = calcTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) ); } sprintf(temporary+lstrlen(temporary),"%sから%s",calcTypeName.c_str(),varTypeName.c_str()); 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 Type &varType,const Type &calcFormalType,const char *pszFuncName,const int ParmNum) { Type calcType( calcFormalType ); if( varType.IsStruct() || calcType.IsStruct() ) { //いずれかが構造体場合 if( !varType.Equals( calcType ) ) { DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum); return false; } } if( varType.IsObject() || calcType.IsObject() ) { //いずれかがオブジェクトの場合 if( varType.GetBasicType() != calcType.GetBasicType() ) { DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum); return false; } if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ) { //等しくなく、派生クラスでもないとき DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum); return false; } } //#strictが指定されていないときは型チェックを行わないようにする extern BOOL bStrict; if(bStrict==0) return true; if( calcType.GetBasicType() & FLAG_PTR ) { //配列先頭フラグがたっている場合は、ポインタ型として扱う calcType.SetBasicType( MAKE_PTR_TYPE(NATURAL_TYPE(calcType.GetBasicType()),PTR_LEVEL(calcType.GetBasicType())+1) ); } if( varType.IsPointer() || calcType.IsPointer() ) { /* 右辺及び左辺のいずれかがポインタ型の場合は、 型チェックを行う。 ・同一の種類のポインタ型以外はエラーとする */ if( varType.IsPointer() && calcType.GetIndex() == LITERAL_NULL ) { //リテラルNULL値の場合 return true; } if( varType.IsVoidPtr() ) { //左辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる if( calcType.IsPointer() ) { return true; } } if( calcType.IsVoidPtr() ) { //右辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる if( varType.IsPointer() ) { return true; } } if( varType.GetBasicType() != calcType.GetBasicType() ) { DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum); return true; } if( varType.IsObjectPtr() ) { //双方がオブジェクトポインタ型の場合 if( varType.GetIndex() != calcType.GetIndex() ) { const CClass *pobj_tempClass = &calcType.GetClass(); while(pobj_tempClass&&(!IS_LITERAL((LONG_PTR)pobj_tempClass))){ pobj_tempClass=&pobj_tempClass->GetSuperClass(); if( &varType.GetClass() == pobj_tempClass ) { //継承先が等しいとき return true; } } DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum); return true; } } } if( varType.IsDouble() ) { if( calcType.Is64() ) { //64ビット整数値の場合は警告を出す DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum); } } else if( varType.IsSingle() ) { if( calcType.Is64() || calcType.IsDouble() ) { //64ビット整数値、またはDouble型の場合は警告を出す DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum); } } else if( varType.GetSize() == sizeof(char) ) { if( calcType.GetSize() > sizeof(char) && calcType.GetIndex() != LITERAL_NULL && calcType.GetIndex() != LITERAL_M128_0 && calcType.GetIndex() != LITERAL_0_255 ) { //8ビット整数値より大きな型で、リテラル値でもない場合は警告を出す DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum); } } else if( varType.GetSize() == sizeof(short) ) { if( calcType.GetSize() > sizeof(short) && calcType.GetIndex() != LITERAL_NULL && calcType.GetIndex() != LITERAL_M128_0 && calcType.GetIndex() != LITERAL_0_255 && calcType.GetIndex() != LITERAL_M32768_0 && calcType.GetIndex() != LITERAL_0_65535 ) { //16ビット整数値より大きな型で、リテラル値でもない場合は警告を出す DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum); } } else if( varType.GetSize() == sizeof(long) ) { if( calcType.IsReal() || ( calcType.IsWhole() && calcType.GetSize() > sizeof(long) && calcType.GetIndex() != LITERAL_NULL ) ) { /* 32ビット整数値より大きな型、または実数、 またはリテラル値でもない場合は警告を出す */ DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum); } } else if( varType.GetSize() == sizeof(_int64) ) { if( calcType.IsReal() ) { //実数の場合は警告を出す DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum); } } return true; }