[206] | 1 | #include "stdafx.h"
|
---|
| 2 |
|
---|
[182] | 3 | #include <jenga/include/smoothie/LexicalAnalysis.h>
|
---|
| 4 |
|
---|
[167] | 5 | #include <Program.h>
|
---|
[279] | 6 | #include <Compiler.h>
|
---|
[165] | 7 |
|
---|
[4] | 8 | #include "../BasicCompiler_Common/common.h"
|
---|
| 9 |
|
---|
[40] | 10 | BOOL GetErrorMsg(int num,const char *KeyWord,char *msg,int pos){
|
---|
[4] | 11 | extern HANDLE hHeap;
|
---|
| 12 | int i2;
|
---|
| 13 | char temporary[64];
|
---|
| 14 |
|
---|
[40] | 15 | char tempKeyWord[1024];
|
---|
[4] | 16 | if(KeyWord){
|
---|
[40] | 17 | lstrcpy(tempKeyWord,KeyWord);
|
---|
[4] | 18 | for(i2=0;;i2++){
|
---|
[40] | 19 | if(tempKeyWord[i2]=='\0') break;
|
---|
| 20 | if(tempKeyWord[i2]==1){
|
---|
| 21 | GetDefaultNameFromES(tempKeyWord[i2+1],temporary);
|
---|
| 22 | SlideString(tempKeyWord+i2+2,lstrlen(temporary)-2);
|
---|
| 23 | memcpy(tempKeyWord+i2,temporary,lstrlen(temporary));
|
---|
[4] | 24 | }
|
---|
| 25 | }
|
---|
| 26 | }
|
---|
[40] | 27 | else{
|
---|
| 28 | lstrcpy(tempKeyWord,"");
|
---|
| 29 | }
|
---|
[4] | 30 |
|
---|
[40] | 31 | if(num==-1||num==-2) lstrcpy(msg,tempKeyWord); //部分エラー
|
---|
[4] | 32 |
|
---|
| 33 | if(num==3){
|
---|
[40] | 34 | temporary[0]=tempKeyWord[0];
|
---|
[4] | 35 | for(i2=1;;i2++){
|
---|
[40] | 36 | if((!IsVariableChar(tempKeyWord[i2]))||i2>=255){
|
---|
[4] | 37 | temporary[i2]=0;
|
---|
| 38 | break;
|
---|
| 39 | }
|
---|
[40] | 40 | temporary[i2]=tempKeyWord[i2];
|
---|
[4] | 41 | }
|
---|
| 42 |
|
---|
| 43 | extern char **SynonymErrorWords;
|
---|
| 44 | extern int SynonymErrorNum;
|
---|
| 45 | for(i2=0;i2<SynonymErrorNum;i2++){
|
---|
| 46 | if(lstrcmp(SynonymErrorWords[i2],temporary)==0) return 0;
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | #if defined(JPN)
|
---|
| 50 | //日本語
|
---|
| 51 | sprintf(msg,"\"%s\" 無効な識別子です",temporary);
|
---|
| 52 | #else
|
---|
| 53 | //英語
|
---|
| 54 | sprintf(msg,"\"%s\" Invalid identifier.",temporary);
|
---|
| 55 | #endif
|
---|
| 56 |
|
---|
| 57 | //重複エラー情報を追加
|
---|
| 58 | SynonymErrorWords=(char **)HeapReAlloc(hHeap,0,SynonymErrorWords,(SynonymErrorNum+1)*sizeof(char *));
|
---|
| 59 | SynonymErrorWords[SynonymErrorNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
|
---|
| 60 | lstrcpy(SynonymErrorWords[SynonymErrorNum],temporary);
|
---|
| 61 | SynonymErrorNum++;
|
---|
| 62 | }
|
---|
| 63 | if(num==30){
|
---|
| 64 | #if defined(JPN)
|
---|
| 65 | //日本語
|
---|
[40] | 66 | if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
|
---|
[4] | 67 | else lstrcpy(msg,"文法が間違っています");
|
---|
| 68 | #else
|
---|
| 69 | //英語
|
---|
[40] | 70 | if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",tempKeyWord);
|
---|
[4] | 71 | else lstrcpy(msg,"Syntax Error.");
|
---|
| 72 | #endif
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 |
|
---|
| 76 | /////////////////////
|
---|
| 77 | // ワーニングエラー
|
---|
| 78 | /////////////////////
|
---|
| 79 | #if defined(JPN)
|
---|
| 80 | ////////////////////
|
---|
| 81 | //日本語
|
---|
| 82 | ////////////////////
|
---|
[40] | 83 | if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",tempKeyWord);
|
---|
| 84 | if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",tempKeyWord);
|
---|
| 85 | if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",tempKeyWord);
|
---|
| 86 | if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",tempKeyWord);
|
---|
| 87 | if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",tempKeyWord);
|
---|
| 88 | if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",tempKeyWord);
|
---|
| 89 | if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",tempKeyWord);
|
---|
[110] | 90 | if(num==-120) sprintf(msg,"[警告] VarPtr関数の引数にオブジェクト インスタンスが指定されました。オブジェクトの先頭アドレスを取得したいときはObjPtr関数に切り替えをお願いします。m(__)m(この警告はVarPtr→ObjPtrへの切り替えが完了したら消します(切り替えは \"適材箇所に限り\" ですので、ご注意ください!))",tempKeyWord);
|
---|
[4] | 91 | #else
|
---|
| 92 | #endif
|
---|
| 93 |
|
---|
| 94 |
|
---|
| 95 | ///////////////
|
---|
| 96 | // 一般エラー
|
---|
| 97 | ///////////////
|
---|
| 98 |
|
---|
| 99 | #if defined(JPN)
|
---|
| 100 | ////////////////////
|
---|
| 101 | //日本語
|
---|
| 102 | ////////////////////
|
---|
[75] | 103 | if(num==1) lstrcpy(msg,"文法が間違っています。");
|
---|
| 104 | if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません。");
|
---|
[4] | 105 | //num==3は予約されています
|
---|
[75] | 106 | if(num==4) sprintf(msg,"%sの相互関係が一致しません。",tempKeyWord);
|
---|
| 107 | if(num==5) sprintf(msg,"ダブルクォートの数が一致しません。");
|
---|
| 108 | if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です。",tempKeyWord);
|
---|
| 109 | if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)。");
|
---|
| 110 | if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています。");
|
---|
| 111 | if(num==9) sprintf(msg,"型が違います。");
|
---|
| 112 | if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています。",tempKeyWord);
|
---|
| 113 | if(num==11) sprintf(msg,"\"%s\" 型が違います。",tempKeyWord);
|
---|
| 114 | if(num==12) sprintf(msg,"\"%s\" の使い方が不正です。",tempKeyWord);
|
---|
| 115 | if(num==13) sprintf(msg,"\"%s\" を参照できません。",tempKeyWord);
|
---|
| 116 | if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です。",tempKeyWord);
|
---|
| 117 | if(num==15) sprintf(msg,"\"%s\" はすでに定義されています。",tempKeyWord);
|
---|
| 118 | if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています。",tempKeyWord);
|
---|
| 119 | if(num==17) sprintf(msg,"リソース データが不正です。");
|
---|
| 120 | if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません。",tempKeyWord);
|
---|
| 121 | if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません。",tempKeyWord);
|
---|
| 122 | if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)。");
|
---|
| 123 | if(num==21) sprintf(msg,"If制御のブロック指定が不正です。");
|
---|
| 124 | if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません。",tempKeyWord,tempKeyWord);
|
---|
| 125 | if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
|
---|
| 126 | if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)。");
|
---|
| 127 | if(num==25) sprintf(msg,"DLL関数にオブジェクトを引き渡すことはできません(%s)。",tempKeyWord);
|
---|
| 128 | if(num==26) sprintf(msg,"\"%s\" 戻り値の型が指定されていません。",tempKeyWord);
|
---|
| 129 | if(num==27) sprintf(msg,"\"%s\" は定義されていません。",tempKeyWord);
|
---|
| 130 | if(num==28) sprintf(msg,"構造体パラメータは参照渡しにしてください(%s)。",tempKeyWord);
|
---|
| 131 | if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください。");
|
---|
[4] | 132 | //num==30は予約されています
|
---|
[75] | 133 | if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)。",tempKeyWord);
|
---|
| 134 | if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)。",tempKeyWord);
|
---|
| 135 | if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています。");
|
---|
| 136 | if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい。");
|
---|
| 137 | if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです。",tempKeyWord);
|
---|
| 138 | if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)。",tempKeyWord);
|
---|
| 139 | if(num==40) lstrcpy(msg,"DLL関数の戻り値としてオブジェクトを受け取ることはできません。");
|
---|
| 140 | if(num==41) lstrcpy(msg,"初期データが不正です。");
|
---|
| 141 | if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています。");
|
---|
| 142 | if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています。");
|
---|
| 143 | if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません。",tempKeyWord);
|
---|
| 144 | if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています。");
|
---|
| 145 | if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています。");
|
---|
| 146 | if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています。",tempKeyWord);
|
---|
| 147 | if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています。");
|
---|
| 148 | if(num==50) sprintf(msg,"%sに変換できません。",tempKeyWord);
|
---|
[353] | 149 | if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は 1, 2, 4, 8, 16 のいずれかでなければなりません。");
|
---|
[75] | 150 | if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません。",tempKeyWord);
|
---|
| 151 | if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります。",tempKeyWord);
|
---|
[40] | 152 | if(num==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord);
|
---|
| 153 | if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord);
|
---|
[4] | 154 | if(num==56) lstrcpy(msg,"ゼロ割りが行われました。");
|
---|
| 155 | if(num==57) lstrcpy(msg,"8進数のリテラル表記が不正です。");
|
---|
| 156 | if(num==58) lstrcpy(msg,"16進数のリテラル表記が不正です。");
|
---|
[40] | 157 | if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
|
---|
[4] | 158 | if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。");
|
---|
[40] | 159 | if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",tempKeyWord);
|
---|
| 160 | if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",tempKeyWord);
|
---|
[103] | 161 | if(num==63) lstrcpy(msg,"名前空間が正しく閉じられていません。");
|
---|
[107] | 162 | if(num==64) sprintf(msg,"\"%s\" 無効な名前空間です。",tempKeyWord);
|
---|
[113] | 163 | if(num==65) sprintf(msg,"ローカル領域で%sは使用できません。",tempKeyWord);
|
---|
[337] | 164 | if(num==66) sprintf(msg,"%s 要求されている関数ポインタのパラメータまたは戻り値が一致しません。", tempKeyWord );
|
---|
| 165 | if(num==67) sprintf(msg,"%s 要求されているデリゲートのパラメータまたは戻り値が一致しません。", tempKeyWord );
|
---|
[353] | 166 | if(num==68) sprintf(msg,"\"%s\" 不正な関数名です。", tempKeyWord);
|
---|
| 167 | if(num==69) sprintf(msg,"\"%s\" 不正なメソッド名です。", tempKeyWord);
|
---|
[4] | 168 |
|
---|
| 169 |
|
---|
| 170 | //オブジェクト関連
|
---|
[75] | 171 | if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません。",tempKeyWord);
|
---|
| 172 | if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません。",tempKeyWord);
|
---|
| 173 | if(num==104) sprintf(msg,"\"%s\" 参照方法が違います。",tempKeyWord);
|
---|
| 174 | if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません。",tempKeyWord);
|
---|
[318] | 175 | if(num==106) sprintf(msg,"\"%s\" 存在しないクラスです。",tempKeyWord);
|
---|
[75] | 176 | if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
|
---|
| 177 | if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
|
---|
| 178 | if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
|
---|
| 179 | if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
|
---|
| 180 | if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります。");
|
---|
| 181 | if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません。",tempKeyWord);
|
---|
| 182 | if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です。",tempKeyWord);
|
---|
| 183 | if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません。");
|
---|
| 184 | if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません。");
|
---|
[85] | 185 | //if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません。");
|
---|
[75] | 186 | if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません。");
|
---|
| 187 | if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません。");
|
---|
| 188 | if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません。",tempKeyWord);
|
---|
| 189 | if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です。");
|
---|
| 190 | if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません。");
|
---|
| 191 | if(num==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています。");
|
---|
| 192 | if(num==123) lstrcpy(msg,"ループ継承が行われました。");
|
---|
| 193 | if(num==124) lstrcpy(msg,"循環参照が行われました。");
|
---|
[40] | 194 | if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord);
|
---|
[4] | 195 | if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
|
---|
| 196 | if(num==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。");
|
---|
| 197 | if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。");
|
---|
[40] | 198 | if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",tempKeyWord);
|
---|
| 199 | if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",tempKeyWord);
|
---|
[18] | 200 | if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
|
---|
[20] | 201 | if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
|
---|
[64] | 202 | if(num==133) lstrcpy(msg,"Thisに代入はできません。");
|
---|
[109] | 203 | if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
|
---|
[131] | 204 | if(num==135) lstrcpy( msg, "クラスまたはインターフェイス以外の型を継承元として指定することはできません。" );
|
---|
[305] | 205 | if(num==136) lstrcpy( msg, "非仮想関数に対してオーバーライドしようとしました。" );
|
---|
[340] | 206 | if(num==137) lstrcpy(msg,"ImplementsはClass定義内の先頭に記述する必要があります。");
|
---|
[342] | 207 | if(num==138) sprintf(msg,"%s はインターフェイスではありません。Implementsできるのはインターフェイスに限ります。",tempKeyWord);
|
---|
[353] | 208 | if(num==139) sprintf(msg,"%s はインターフェイスではありません。",tempKeyWord);
|
---|
[4] | 209 |
|
---|
| 210 | //Enum関連
|
---|
[75] | 211 | if(num==150) sprintf(msg,"\"%s\" 値が定義されていません。",tempKeyWord);
|
---|
| 212 | if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません。",tempKeyWord);
|
---|
[4] | 213 |
|
---|
| 214 | //リンカ
|
---|
[75] | 215 | if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)。",tempKeyWord);
|
---|
| 216 | if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗。",tempKeyWord);
|
---|
[4] | 217 |
|
---|
| 218 | //原因不明
|
---|
| 219 | if(num==300) lstrcpy(msg,"内部エラー");
|
---|
| 220 |
|
---|
[351] | 221 | // ベースライブラリ不整合
|
---|
| 222 | if( num == 400 ) sprintf( msg, "\"%s\" が存在しません。標準ライブラリの内容が古い可能性があります。", tempKeyWord );
|
---|
| 223 |
|
---|
[4] | 224 | #else
|
---|
| 225 | ////////////////////
|
---|
| 226 | //英語
|
---|
| 227 | ////////////////////
|
---|
| 228 | if(num==1) lstrcpy(msg,"Syntax Error.");
|
---|
| 229 | if(num==2) sprintf(msg,"Left operand must be l-value.");
|
---|
| 230 | //num==3は予約されています
|
---|
[40] | 231 | if(num==4) sprintf(msg,"Correlation of %s is wrong.",tempKeyWord);
|
---|
[4] | 232 | if(num==5) sprintf(msg,"Correlation of double quotes is wrong.");
|
---|
[40] | 233 | if(num==6) sprintf(msg,"\"%s\" Label not found.",tempKeyWord);
|
---|
[4] | 234 | if(num==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less.");
|
---|
| 235 | if(num==8) lstrcpy(msg,"The inaccurate characters are contained.");
|
---|
| 236 | if(num==9) sprintf(msg,"Type is wrong.");
|
---|
[40] | 237 | if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",tempKeyWord);
|
---|
| 238 | if(num==11) sprintf(msg,"\"%s\" Type is wrong.",tempKeyWord);
|
---|
| 239 | if(num==12) sprintf(msg,"\"%s\" Not a valid use.",tempKeyWord);
|
---|
| 240 | if(num==13) sprintf(msg,"Cannot refer to \"%s\".",tempKeyWord);
|
---|
| 241 | if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",tempKeyWord);
|
---|
| 242 | if(num==15) sprintf(msg,"\"%s\" is already defined.",tempKeyWord);
|
---|
| 243 | if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",tempKeyWord);
|
---|
[4] | 244 | if(num==17) sprintf(msg,"Invalid resource data.");
|
---|
[40] | 245 | if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",tempKeyWord);
|
---|
| 246 | if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",tempKeyWord);
|
---|
[4] | 247 | if(num==21) sprintf(msg,"Wrong structure of \"If\" block.");
|
---|
[40] | 248 | if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",tempKeyWord,tempKeyWord);
|
---|
| 249 | if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",tempKeyWord);
|
---|
[4] | 250 | if(num==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)");
|
---|
[40] | 251 | if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",tempKeyWord);
|
---|
| 252 | if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",tempKeyWord);
|
---|
[4] | 253 | if(num==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)");
|
---|
| 254 | //num==30は予約されています
|
---|
[40] | 255 | if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",tempKeyWord);
|
---|
| 256 | if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",tempKeyWord);
|
---|
[4] | 257 | if(num==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value.");
|
---|
| 258 | if(num==34) sprintf(msg,"Constant formula must be defined in the module level.");
|
---|
[40] | 259 | if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",tempKeyWord);
|
---|
| 260 | if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",tempKeyWord);
|
---|
[4] | 261 | if(num==40) lstrcpy(msg,"Cannot set a object to return value.");
|
---|
| 262 | if(num==41) lstrcpy(msg,"Init data is wrong.");
|
---|
| 263 | if(num==42) lstrcpy(msg,"The inaccurate characters are contained after the closing parenthesis \")\".");
|
---|
| 264 | if(num==43) lstrcpy(msg,"The inaccurate characters are contained after the double quote.");
|
---|
| 265 |
|
---|
| 266 | //オブジェクト関連
|
---|
[40] | 267 | if(num==102) sprintf(msg,"\"%s\" The object is not defined.",tempKeyWord);
|
---|
| 268 | if(num==103) sprintf(msg,"\"%s\" The member is not defined.",tempKeyWord);
|
---|
| 269 | if(num==104) sprintf(msg,"\"%s\" The reference character is different.",tempKeyWord);
|
---|
| 270 | if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",tempKeyWord);
|
---|
| 271 | if(num==106) sprintf(msg,"\"%s\" It class is not defined.",tempKeyWord);
|
---|
| 272 | if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",tempKeyWord);
|
---|
| 273 | if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",tempKeyWord);
|
---|
| 274 | if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",tempKeyWord);
|
---|
| 275 | if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",tempKeyWord);
|
---|
[4] | 276 | if(num==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module");
|
---|
[40] | 277 | if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",tempKeyWord);
|
---|
| 278 | if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",tempKeyWord);
|
---|
[4] | 279 | if(num==114) lstrcpy(msg,"Destructor cannot have a parameter.");
|
---|
| 280 | if(num==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value.");
|
---|
| 281 | if(num==116) lstrcpy(msg,"Constructor and Destructor must be public access.");
|
---|
| 282 | if(num==117) lstrcpy(msg,"Destructors name must be \"~ClassName\".");
|
---|
| 283 | if(num==118) lstrcpy(msg,"Super class is not found.");
|
---|
[40] | 284 | if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",tempKeyWord);
|
---|
[4] | 285 |
|
---|
| 286 | //Enum関連
|
---|
[40] | 287 | if(num==150) sprintf(msg,"\"%s\" The value is not set",tempKeyWord);
|
---|
| 288 | if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",tempKeyWord);
|
---|
[4] | 289 |
|
---|
| 290 | //リンカ
|
---|
[40] | 291 | if(num==200) sprintf(msg,"\"%s\" Unknown error.",tempKeyWord);
|
---|
[4] | 292 | #endif
|
---|
| 293 |
|
---|
| 294 | return 1;
|
---|
| 295 | }
|
---|
[75] | 296 | void SetError(int ErrorNum,const string &keyWord,int pos){
|
---|
| 297 | SetError( ErrorNum, keyWord.c_str(), pos );
|
---|
| 298 | }
|
---|
[40] | 299 | void SetError(int num,const char *KeyWord,int pos){
|
---|
[4] | 300 | extern HANDLE hHeap;
|
---|
| 301 | extern HWND hMainDlg;
|
---|
| 302 | extern ERRORINFO *pErrorInfo;
|
---|
| 303 | extern int ErrorNum;
|
---|
[279] | 304 | char temporary[1024],temp2[1024],temp3[32];
|
---|
[4] | 305 | BOOL bFirst;
|
---|
| 306 | int i2;
|
---|
| 307 |
|
---|
| 308 | extern BOOL bDebugRun;
|
---|
| 309 | if(bDebugRun) return;
|
---|
| 310 |
|
---|
| 311 | if(num!=-2){
|
---|
| 312 | //一般エラーまたは警告
|
---|
| 313 | i2=0; //ここにブレークポイントをおく
|
---|
[28] | 314 |
|
---|
| 315 | if(num>-100){
|
---|
| 316 | //エラーのみ
|
---|
[206] | 317 |
|
---|
[28] | 318 | i2=0;
|
---|
| 319 | }
|
---|
| 320 |
|
---|
[4] | 321 | }
|
---|
| 322 |
|
---|
| 323 | if(!GetErrorMsg(num,KeyWord,temporary,pos)) return;
|
---|
| 324 |
|
---|
| 325 | if(ErrorNum==0){
|
---|
| 326 | SetDlgItemText(hMainDlg,IDC_ERRORLIST,"");
|
---|
| 327 | EnableWindow(GetDlgItem(hMainDlg,IDC_ERRORLIST),1);
|
---|
| 328 | bFirst=1;
|
---|
| 329 | }
|
---|
| 330 | else bFirst=0;
|
---|
| 331 |
|
---|
| 332 |
|
---|
| 333 | ////////////////////
|
---|
| 334 | // エラー情報を追加
|
---|
| 335 | pErrorInfo=(ERRORINFO *)HeapReAlloc(hHeap,0,pErrorInfo,(ErrorNum+1)*sizeof(ERRORINFO));
|
---|
| 336 |
|
---|
| 337 | if(pos==-1){
|
---|
| 338 | pErrorInfo[ErrorNum].FileName=0;
|
---|
| 339 | lstrcpy(temp2,temporary);
|
---|
| 340 | }
|
---|
| 341 | else{
|
---|
[279] | 342 | std::string dummyStr;
|
---|
[280] | 343 | compiler.GetObjectModule().GetCurrentSource().GetLineInfo( pos, pErrorInfo[ErrorNum].line, dummyStr );
|
---|
[4] | 344 |
|
---|
[279] | 345 | pErrorInfo[ErrorNum].FileName=(char *)HeapAlloc(hHeap,0,lstrlen(dummyStr.c_str())+1);
|
---|
| 346 | lstrcpy(pErrorInfo[ErrorNum].FileName,dummyStr.c_str());
|
---|
[4] | 347 |
|
---|
| 348 | _splitpath(pErrorInfo[ErrorNum].FileName,0,0,temp2,temp3);
|
---|
| 349 | lstrcat(temp2,temp3);
|
---|
| 350 |
|
---|
| 351 | if(pErrorInfo[ErrorNum].line==-1)
|
---|
| 352 | sprintf(temp2+lstrlen(temp2),"(no area) %s",temporary);
|
---|
| 353 | else
|
---|
| 354 | sprintf(temp2+lstrlen(temp2),"(%d) - %s",pErrorInfo[ErrorNum].line+1,temporary);
|
---|
| 355 | }
|
---|
| 356 |
|
---|
| 357 | i2=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_ERRORLIST));
|
---|
| 358 | SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
|
---|
| 359 | if(bFirst==0){
|
---|
| 360 | SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)"\r\n");
|
---|
| 361 | i2+=2;
|
---|
| 362 | SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
|
---|
| 363 | }
|
---|
| 364 | SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)temp2);
|
---|
| 365 |
|
---|
[140] | 366 |
|
---|
[4] | 367 | if(num==-2){
|
---|
| 368 | //コンパイルメッセージ
|
---|
| 369 | //※何もしない
|
---|
| 370 | extern int CompileMsgNum;
|
---|
| 371 | CompileMsgNum++;
|
---|
| 372 | }
|
---|
| 373 | else{
|
---|
| 374 | if(num>-100){
|
---|
| 375 | //警告ではなく、エラーの場合はエラーチェックフラグを立てる
|
---|
| 376 | extern BOOL bError;
|
---|
| 377 | bError=1;
|
---|
[140] | 378 |
|
---|
| 379 | // ログに出力
|
---|
| 380 | trace( "error - " << temp2 );
|
---|
[4] | 381 | }
|
---|
| 382 | else{
|
---|
| 383 | extern int WarningNum;
|
---|
| 384 | WarningNum++;
|
---|
[140] | 385 |
|
---|
| 386 | // ログに出力
|
---|
| 387 | trace( "warning - " << temp2 );
|
---|
[4] | 388 | }
|
---|
| 389 | }
|
---|
| 390 |
|
---|
| 391 | ErrorNum++;
|
---|
| 392 | }
|
---|
[64] | 393 | void SetError(){
|
---|
| 394 | SetError(300,NULL,cp);
|
---|
| 395 | }
|
---|
[287] | 396 | void CompileMessage(const char *buffer){
|
---|
[4] | 397 | SetError(-2,buffer,-1);
|
---|
| 398 | }
|
---|
| 399 |
|
---|
| 400 | #define STRING_SYSTEM_DECLAREHANDLE "*_System_DeclareHandle_"
|
---|
[290] | 401 | void DifferentTypeError( const Type &varType, const Type &calcFormalType, const int iWarning,const char *pszFuncName,const int ParmNum){
|
---|
[4] | 402 | //////////////////////////
|
---|
| 403 | // キャストに関する警告
|
---|
| 404 | //////////////////////////
|
---|
[290] | 405 | char temporary[255];
|
---|
| 406 | Type calcType( calcFormalType );
|
---|
[4] | 407 |
|
---|
[290] | 408 | if(IS_LITERAL(calcType.GetIndex()))
|
---|
| 409 | {
|
---|
| 410 | calcType.SetIndex( -1 );
|
---|
| 411 | }
|
---|
[4] | 412 |
|
---|
| 413 | if(pszFuncName)
|
---|
| 414 | sprintf(temporary,"\"%s\"の第%dパラメータが、",pszFuncName,ParmNum+1);
|
---|
| 415 | else temporary[0]=0;
|
---|
| 416 |
|
---|
[299] | 417 | std::string varTypeName = compiler.TypeToString( varType );
|
---|
[290] | 418 | if(memcmp( varTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0)
|
---|
| 419 | {
|
---|
| 420 | varTypeName = varTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) );
|
---|
[4] | 421 | }
|
---|
[290] | 422 |
|
---|
[299] | 423 | std::string calcTypeName = compiler.TypeToString( calcType );
|
---|
[290] | 424 | if(memcmp( calcTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0)
|
---|
| 425 | {
|
---|
| 426 | calcTypeName = calcTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) );
|
---|
[4] | 427 | }
|
---|
[290] | 428 | sprintf(temporary+lstrlen(temporary),"%sから%s",calcTypeName.c_str(),varTypeName.c_str());
|
---|
[4] | 429 |
|
---|
| 430 | extern int cp;
|
---|
| 431 | if(iWarning==1) SetError(-101,temporary,cp);
|
---|
| 432 | else if(iWarning==2) SetError(-102,temporary,cp);
|
---|
[45] | 433 | else if(iWarning==3) SetError(50,temporary,cp);
|
---|
[4] | 434 | }
|
---|
| 435 |
|
---|
[290] | 436 | bool CheckDifferentType( const Type &varType,const Type &calcFormalType,const char *pszFuncName,const int ParmNum)
|
---|
| 437 | {
|
---|
| 438 | Type calcType( calcFormalType );
|
---|
[4] | 439 |
|
---|
[290] | 440 | if( varType.IsStruct() || calcType.IsStruct() )
|
---|
| 441 | {
|
---|
[64] | 442 | //いずれかが構造体場合
|
---|
[290] | 443 | if( !varType.Equals( calcType ) )
|
---|
| 444 | {
|
---|
| 445 | DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
|
---|
[64] | 446 | return false;
|
---|
| 447 | }
|
---|
| 448 | }
|
---|
| 449 |
|
---|
[290] | 450 | if( varType.IsObject() || calcType.IsObject() )
|
---|
| 451 | {
|
---|
| 452 | //いずれかがオブジェクトの場合
|
---|
| 453 | if( varType.GetBasicType() != calcType.GetBasicType() )
|
---|
| 454 | {
|
---|
| 455 | DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
|
---|
[45] | 456 | return false;
|
---|
[4] | 457 | }
|
---|
[59] | 458 |
|
---|
[290] | 459 | if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) )
|
---|
| 460 | {
|
---|
[59] | 461 | //等しくなく、派生クラスでもないとき
|
---|
[290] | 462 | DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
|
---|
[59] | 463 | return false;
|
---|
| 464 | }
|
---|
[4] | 465 | }
|
---|
| 466 |
|
---|
| 467 | //#strictが指定されていないときは型チェックを行わないようにする
|
---|
| 468 | extern BOOL bStrict;
|
---|
[45] | 469 | if(bStrict==0) return true;
|
---|
[4] | 470 |
|
---|
[290] | 471 | if( calcType.GetBasicType() & FLAG_PTR )
|
---|
| 472 | {
|
---|
[4] | 473 | //配列先頭フラグがたっている場合は、ポインタ型として扱う
|
---|
[290] | 474 | calcType.SetBasicType( MAKE_PTR_TYPE(NATURAL_TYPE(calcType.GetBasicType()),PTR_LEVEL(calcType.GetBasicType())+1) );
|
---|
[4] | 475 | }
|
---|
| 476 |
|
---|
[290] | 477 | if( varType.IsPointer() || calcType.IsPointer() )
|
---|
| 478 | {
|
---|
[4] | 479 | /* 右辺及び左辺のいずれかがポインタ型の場合は、
|
---|
| 480 | 型チェックを行う。
|
---|
| 481 | ・同一の種類のポインタ型以外はエラーとする */
|
---|
| 482 |
|
---|
[290] | 483 | if( varType.IsPointer() && calcType.GetIndex() == LITERAL_NULL )
|
---|
| 484 | {
|
---|
[4] | 485 | //リテラルNULL値の場合
|
---|
[45] | 486 | return true;
|
---|
[4] | 487 | }
|
---|
| 488 |
|
---|
[290] | 489 | if( varType.IsVoidPtr() )
|
---|
| 490 | {
|
---|
[4] | 491 | //左辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
|
---|
[290] | 492 | if( calcType.IsPointer() )
|
---|
| 493 | {
|
---|
| 494 | return true;
|
---|
| 495 | }
|
---|
[4] | 496 | }
|
---|
| 497 |
|
---|
[290] | 498 | if( calcType.IsVoidPtr() )
|
---|
| 499 | {
|
---|
[4] | 500 | //右辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
|
---|
[290] | 501 | if( varType.IsPointer() )
|
---|
| 502 | {
|
---|
| 503 | return true;
|
---|
| 504 | }
|
---|
[4] | 505 | }
|
---|
| 506 |
|
---|
[290] | 507 | if( varType.GetBasicType() != calcType.GetBasicType() )
|
---|
| 508 | {
|
---|
| 509 | DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum);
|
---|
[45] | 510 | return true;
|
---|
[4] | 511 | }
|
---|
| 512 |
|
---|
[290] | 513 | if( varType.IsObjectPtr() )
|
---|
| 514 | {
|
---|
[4] | 515 | //双方がオブジェクトポインタ型の場合
|
---|
[290] | 516 | if( varType.GetIndex() != calcType.GetIndex() )
|
---|
| 517 | {
|
---|
| 518 | const CClass *pobj_tempClass = &calcType.GetClass();
|
---|
[4] | 519 | while(pobj_tempClass&&(!IS_LITERAL((LONG_PTR)pobj_tempClass))){
|
---|
[204] | 520 | pobj_tempClass=&pobj_tempClass->GetSuperClass();
|
---|
[4] | 521 |
|
---|
[290] | 522 | if( &varType.GetClass() == pobj_tempClass )
|
---|
| 523 | {
|
---|
[4] | 524 | //継承先が等しいとき
|
---|
[45] | 525 | return true;
|
---|
[4] | 526 | }
|
---|
| 527 | }
|
---|
[290] | 528 | DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum);
|
---|
[45] | 529 | return true;
|
---|
[4] | 530 | }
|
---|
| 531 | }
|
---|
| 532 | }
|
---|
| 533 |
|
---|
[290] | 534 | if( varType.IsDouble() )
|
---|
| 535 | {
|
---|
| 536 | if( calcType.Is64() )
|
---|
| 537 | {
|
---|
[4] | 538 | //64ビット整数値の場合は警告を出す
|
---|
[290] | 539 | DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
|
---|
[4] | 540 | }
|
---|
| 541 | }
|
---|
[290] | 542 | else if( varType.IsSingle() )
|
---|
| 543 | {
|
---|
| 544 | if( calcType.Is64() || calcType.IsDouble() )
|
---|
| 545 | {
|
---|
[4] | 546 | //64ビット整数値、またはDouble型の場合は警告を出す
|
---|
[290] | 547 | DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
|
---|
[4] | 548 | }
|
---|
| 549 | }
|
---|
[290] | 550 | else if( varType.GetSize() == sizeof(char) )
|
---|
| 551 | {
|
---|
| 552 | if( calcType.GetSize() > sizeof(char)
|
---|
| 553 | && calcType.GetIndex() != LITERAL_NULL
|
---|
| 554 | && calcType.GetIndex() != LITERAL_M128_0
|
---|
| 555 | && calcType.GetIndex() != LITERAL_0_255 )
|
---|
| 556 | {
|
---|
[4] | 557 | //8ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
|
---|
[290] | 558 | DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
|
---|
[4] | 559 | }
|
---|
| 560 | }
|
---|
[290] | 561 | else if( varType.GetSize() == sizeof(short) )
|
---|
| 562 | {
|
---|
| 563 | if( calcType.GetSize() > sizeof(short)
|
---|
| 564 | && calcType.GetIndex() != LITERAL_NULL
|
---|
| 565 | && calcType.GetIndex() != LITERAL_M128_0
|
---|
| 566 | && calcType.GetIndex() != LITERAL_0_255
|
---|
| 567 | && calcType.GetIndex() != LITERAL_M32768_0
|
---|
| 568 | && calcType.GetIndex() != LITERAL_0_65535 )
|
---|
| 569 | {
|
---|
[4] | 570 | //16ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
|
---|
[290] | 571 | DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
|
---|
[4] | 572 | }
|
---|
| 573 | }
|
---|
[290] | 574 | else if( varType.GetSize() == sizeof(long) )
|
---|
| 575 | {
|
---|
| 576 | if( calcType.IsReal()
|
---|
| 577 | || ( calcType.IsWhole() && calcType.GetSize() > sizeof(long) && calcType.GetIndex() != LITERAL_NULL ) )
|
---|
| 578 | {
|
---|
[4] | 579 | /* 32ビット整数値より大きな型、または実数、
|
---|
| 580 | またはリテラル値でもない場合は警告を出す */
|
---|
[290] | 581 | DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
|
---|
[4] | 582 | }
|
---|
| 583 | }
|
---|
[290] | 584 | else if( varType.GetSize() == sizeof(_int64) )
|
---|
| 585 | {
|
---|
| 586 | if( calcType.IsReal() )
|
---|
| 587 | {
|
---|
[4] | 588 | //実数の場合は警告を出す
|
---|
[290] | 589 | DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
|
---|
[4] | 590 | }
|
---|
| 591 | }
|
---|
[45] | 592 |
|
---|
| 593 | return true;
|
---|
[4] | 594 | }
|
---|