source: dev/BasicCompiler_Common/MakeExe.cpp@ 14

Last change on this file since 14 was 14, checked in by dai_9181, 17 years ago

LexicalAnalysisのベース部分を用意。

File size: 6.5 KB
Line 
1#include "common.h"
2
3void StepCompileProgress(void){
4 extern HWND hMainDlg;
5 PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_STEPIT,0,0);
6}
7
8void Delete_ci(CONSTINFO *pci){
9 int i;
10
11 HeapDefaultFree(pci->name);
12 if(pci->StrValue) HeapDefaultFree(pci->StrValue);
13 if(pci->ParmNum){
14 for(i=0;i<pci->ParmNum;i++)
15 HeapDefaultFree(pci->ppParm[i]);
16 HeapDefaultFree(pci->ppParm);
17 }
18
19 if(pci->pNextData){
20 Delete_ci(pci->pNextData);
21 }
22
23 HeapDefaultFree(pci);
24}
25void DeleteConstInfo(CONSTINFO **ppConstHash){
26 int i;
27
28 for(i=0;i<MAX_HASH;i++){
29 if(ppConstHash[i]){
30 Delete_ci(ppConstHash[i]);
31 }
32 }
33 HeapDefaultFree(ppConstHash);
34}
35
36void OutputExe(void){
37 extern HANDLE hHeap;
38 extern char *basbuf;
39 extern int ErrorNum;
40 extern BOOL bStopCompile;
41 extern HWND hMainDlg;
42 int i2,i3;
43 char temp2[MAX_PATH];
44
45 //プログレスバーの設定
46 PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETRANGE,0,MAKELPARAM(0,6));
47 PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETSTEP,1,0);
48
49 //"中断"
50 SetDlgItemText(hMainDlg,IDOK,STRING_STOP);
51
52 //中断フラグを初期化
53 bStopCompile=0;
54
55 //サブシステムのタイプ
56 extern unsigned short TypeOfSubSystem;
57 TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_GUI;
58
59 //プログラムをファイルから読み込む
60 extern char SourceFileName[MAX_PATH];
61 CSource::obj.OpenFile(SourceFileName);
62
63 //未完成
64 basbuf = CSource::obj.SourceCode;
65
66 //イメージベースの設定
67 extern DWORD ImageBase;
68 extern BOOL bDll;
69 if(bDll) ImageBase=0x10000000;
70 else ImageBase=0x00400000;
71
72 extern BOOL bError;
73 if(bError||bStopCompile) goto EndCompile;
74
75
76 //////////////////////////
77 // 中間コードの生成を開始
78 extern BOOL bClipCompileView;
79
80 //"最適化中..."
81 CompileMessage(STRING_COMPILE_OPTIMIZING);
82
83 //アンダーバーによる改行を正規表現に戻す
84 KillReturnCode(basbuf);
85
86 //カッコを相互チェック(ダブルクォートチェックチェックを含む)
87 CheckParenthesis(basbuf);
88
89 if(bError||bStopCompile) goto EndCompile;
90
91 //コンパイルダイアログのプログレスバーを上げる
92 StepCompileProgress();
93
94 //ディレクティブ
95 DirectiveCheck();
96
97 //Next命令語を正規表現に変換
98 //NextCommandFormat(basbuf);
99
100 //エスケープシーケンス設定
101 SetEscapeSequenceFormat(basbuf);
102
103 //Def命令語をFunction命令語に変換
104 DefCommandFormat(basbuf);
105
106 //すべてのIf命令語をブロック形式に変換
107 IfCommandFormat(basbuf);
108
109 //対になる命令語を相互チェック
110 //CheckPareCommand();
111
112 if(bError||bStopCompile) goto EndCompile;
113
114 /*未完成
115 //定数に関する情報
116 extern CONSTINFO **ppConstHash;
117 ppConstHash=(CONSTINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(CONSTINFO *));
118 */
119
120 //TypeDef情報を初期化
121 pobj_DBTypeDef=new CDBTypeDef();
122
123 //コンパイルダイアログのプログレスバーを上げる
124 StepCompileProgress();
125
126 //重複エラー情報管理のメモリを確保
127 extern char **SynonymErrorWords;
128 extern int SynonymErrorNum;
129 SynonymErrorNum=0;
130 SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
131
132 ChangeCommandToCode(basbuf);
133
134 //重複エラー情報管理のメモリを解放
135 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);
136 HeapDefaultFree(SynonymErrorWords);
137
138 if(bError||bStopCompile){
139 //定数に関する情報を解放
140 goto EndCompile;
141 }
142
143 StepCompileProgress();
144
145
146 //字句解析
147 CSource::obj.LexicalAnalysis(0);
148
149
150 ///////////////////////
151 // コンパイル開始
152
153 //"コンパイル中..."
154 CompileMessage(STRING_COMPILE_COMPILING);
155
156 //グローバル変数に関する情報
157 extern VARIABLE *GlobalVar;
158 extern int MaxGlobalVarNum;
159 extern int AllGlobalVarSize;
160 extern int AllInitGlobalVarSize;
161 GlobalVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
162 MaxGlobalVarNum=0;
163 AllGlobalVarSize=0;
164 AllInitGlobalVarSize=0;
165
166
167 /*
168 int t,t2;
169 t=GetTickCount();
170 Compile();
171 t2=GetTickCount();
172 t2-=t;
173 char s[100];
174 sprintf(s,"%d",t2);
175 MessageBox(0,s,"test",0);*/
176 Compile();
177
178 //リソース情報を解放
179 extern RESOURCEDATAINFO *pCursorResourceInfo;
180 extern RESOURCEDATAINFO *pIconResourceInfo;
181 extern RESOURCEDATAINFO *pBitmapResourceInfo;
182 HeapDefaultFree(pCursorResourceInfo);
183 HeapDefaultFree(pBitmapResourceInfo);
184 HeapDefaultFree(pIconResourceInfo);
185
186 //コードと行番号の関係情報を解放
187 extern LINEINFO *pLineInfo;
188 HeapDefaultFree(pLineInfo);
189
190 //グローバル変数に関する情報を解放
191 int i;
192 for(i=0;i<MaxGlobalVarNum;i++){
193 if(GlobalVar[i].ConstractParameter)
194 HeapDefaultFree(GlobalVar[i].ConstractParameter);
195 }
196 HeapDefaultFree(GlobalVar);
197
198 //ローカル変数に関する情報を解放
199 extern SUBINFO **ppSubHash;
200 SUBINFO *psi;
201 for(i2=0;i2<MAX_HASH;i2++){
202 psi=ppSubHash[i2];
203 while(psi){
204 if(psi->bCompile) HeapDefaultFree(psi->pVar);
205 psi=psi->pNextData;
206 }
207 }
208
209 //TypeDef情報を初期化
210 delete pobj_DBTypeDef;
211 pobj_DBTypeDef=0;
212
213 //サブルーチン(ユーザー定義)情報のメモリ解放
214 extern SUBINFO **ppSubHash;
215 extern char **ppMacroNames;
216 extern int MacroNum;
217 DeleteSubInfo(ppSubHash,ppMacroNames,MacroNum);
218
219 //Declare(DLL関数)情報のメモリ解放
220 DeleteDeclareInfo();
221
222 //関数ポインタ情報のメモリ解放
223 DeleteProcPtrInfo();
224
225 //定数に関する情報を解放
226 extern CONSTINFO **ppConstHash;
227 DeleteConstInfo(ppConstHash);
228
229 //コンパイルダイアログのプログレスバーを上げる
230 StepCompileProgress();
231
232
233 //////////////////////////
234 // 終了処理
235EndCompile:
236 if(bStopCompile){
237 PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETPOS,0,0);
238
239 //"コンパイルはユーザーにより中断されました。"
240 CompileMessage(STRING_COMPILE_STOP);
241 }
242 else{
243 extern int CompileMsgNum;
244 extern int WarningNum;
245 if(bError==0){
246 //"コンパイルは正常に完了しました(エラー:%d、警告:%d)"
247 sprintf(temp2,STRING_COMPILE_SUCCESS,ErrorNum-CompileMsgNum-WarningNum,WarningNum);
248 }
249 else{
250 //"コンパイルは中断されました(エラー:%d、警告:%d)"
251 sprintf(temp2,STRING_COMPILE_ERROR,ErrorNum-CompileMsgNum-WarningNum,WarningNum);
252 }
253
254 CompileMessage("");
255 CompileMessage("-----------------------------------------------------");
256 CompileMessage(temp2);
257 }
258
259 //"閉じる"
260 SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
261
262 //#include情報を解放
263 extern INCLUDEFILEINFO IncludeFileInfo;
264 for(i2=0;i2<IncludeFileInfo.FilesNum;i2++)
265 HeapDefaultFree(IncludeFileInfo.ppFileNames[i2]);
266 HeapDefaultFree(IncludeFileInfo.ppFileNames);
267}
268int MainThread(DWORD dummy){
269 extern BOOL bDebugCompile;
270 extern BOOL bDebugRun;
271 extern int bError;
272
273 if(bDebugRun){
274 if(bDebugCompile){
275 bDebugRun=0;
276
277 //デバッグコンパイル
278 OutputExe();
279
280 bDebugRun=1;
281 }
282
283 //デバッグ実行
284 if(bError==0) DebugProgram();
285 }
286 else{
287 //リリースコンパイル
288 OutputExe();
289 }
290
291 return 0;
292}
Note: See TracBrowser for help on using the repository browser.