source: dev/trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp@ 389

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

Foreach文のパラメータをInで区切るようにした。

File size: 14.7 KB
Line 
1#include "stdafx.h"
2
3#include <jenga/include/smoothie/Smoothie.h>
4#include <jenga/include/smoothie/LexicalAnalysis.h>
5
6#include <Compiler.h>
7
8#include "../BasicCompiler_Common/common.h"
9
10
11void AddConstEnum( const NamespaceScopes &namespaceScopes, char *buffer){
12 extern int cp;
13 int i=0,i2;
14
15 if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
16 i+=2;
17
18 //列挙体の名前を取得
19 char temporary[VN_SIZE];
20 for(i2=0;;i++,i2++){
21 if(IsCommandDelimitation(buffer[i])){
22 temporary[i2]=0;
23 break;
24 }
25 if(!IsVariableChar(buffer[i])){
26 SetError(1,NULL,i);
27 break;
28 }
29 temporary[i2]=buffer[i];
30 }
31
32 if(buffer[i]=='\0'){
33 SetError(22,"Enum",cp);
34 return;
35 }
36
37 int NextValue=0;
38 while(1){
39 i++;
40
41 if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break;
42
43 for(i2=0;;i2++,i++){
44 if(IsCommandDelimitation(buffer[i])){
45 temporary[i2]=0;
46 break;
47 }
48 if(buffer[i]=='='){
49 temporary[i2]=0;
50 break;
51 }
52 temporary[i2]=buffer[i];
53 }
54 if(temporary[0]=='\0'){
55 if(buffer[i]=='\0'){
56 SetError(22,"Enum",cp);
57 break;
58 }
59 continue;
60 }
61
62 if(buffer[i]!='='){
63 NextValue++;
64 }
65 else{
66 char temp2[VN_SIZE];
67 for(i++,i2=0;;i2++,i++){
68 if(IsCommandDelimitation(buffer[i])){
69 temp2[i2]=0;
70 break;
71 }
72 temp2[i2]=buffer[i];
73 }
74
75 _int64 i64data;
76 StaticCalculation(true, temp2,DEF_LONG,&i64data,Type());
77 NextValue=(int)i64data;
78 }
79
80 //定数を追加
81 compiler.GetObjectModule().meta.GetGlobalConsts().Add( namespaceScopes, temporary, NextValue);
82 }
83}
84bool GetConstInfo(void){
85 ////////////////////////////////////////////
86 // Const命令の情報を取得
87 ////////////////////////////////////////////
88
89 int i2;
90 char temporary[1024];
91
92 // 名前空間管理
93 NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
94 namespaceScopes.clear();
95
96 extern char *basbuf;
97 for(int i=0;;i++){
98 if( basbuf[i] == '\0' ) break;
99
100 if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){
101 for(i+=2,i2=0;;i2++,i++){
102 if( IsCommandDelimitation( basbuf[i] ) ){
103 temporary[i2]=0;
104 break;
105 }
106 temporary[i2]=basbuf[i];
107 }
108 namespaceScopes.push_back( temporary );
109
110 continue;
111 }
112 else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){
113 if( namespaceScopes.size() <= 0 ){
114 SetError(12, "End Namespace", i );
115 }
116 else{
117 namespaceScopes.pop_back();
118 }
119
120 i += 2;
121 continue;
122 }
123
124 if( basbuf[i] == 1 ){
125 if(basbuf[i]==1&&basbuf[i+1]==ESC_CONST){
126 i+=2;
127
128 extern int cp;
129 cp=i; //エラー用
130
131
132 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENUM){
133 AddConstEnum( namespaceScopes, basbuf+i);
134 continue;
135 }
136
137 for(i2=0;;i++,i2++){
138 if(basbuf[i]=='\"'){
139 temporary[i2]=basbuf[i];
140 for(i++,i2++;;i++,i2++){
141 temporary[i2]=basbuf[i];
142 if(basbuf[i]=='\"') break;
143 }
144 continue;
145 }
146 if(IsCommandDelimitation(basbuf[i])){
147 temporary[i2]=0;
148 break;
149 }
150 temporary[i2]=basbuf[i];
151 }
152 AddConst( namespaceScopes, temporary);
153 if(basbuf[i]=='\0') break;
154 }
155 else{
156 int result = JumpStatement( basbuf, i );
157 if( result == -1 ){
158 //エラー
159 return false;
160 }
161 else if( result == 1 ){
162 //ジャンプした場合
163 i--;
164 }
165 }
166 }
167 }
168
169 // イテレータを初期化
170 compiler.GetObjectModule().meta.GetGlobalConsts().Iterator_Init();
171 compiler.GetObjectModule().meta.GetGlobalConstMacros().Iterator_Init();
172
173 return true;
174}
175
176char ConstructorDestructorSchedule[MAX_PATH];
177void MakeConstructorAndDestructor(char *buffer,int nowLine,char *ClassName){
178 int i,i2;
179 char temporary[MAX_PATH],*pTemp;
180 BOOL bConstructor,bDestructor;
181
182 ConstructorDestructorSchedule[0]=0;
183 bConstructor=0;
184 bDestructor=0;
185
186 for(i=nowLine;;i++){
187 if(buffer[i]=='\0') break;
188 if(buffer[i]==1&&buffer[i+1]==ESC_ENDCLASS){
189 if((!bConstructor)||(!bDestructor)){
190 pTemp=ConstructorDestructorSchedule;
191
192 lstrcpy(pTemp,"Public:");
193
194 if(!bConstructor){
195 //コンストラクタが無いときは生成する
196 sprintf(pTemp+lstrlen(pTemp),"%c%c%s():%c%c:",
197 1,ESC_SUB,
198 ClassName,
199 1,ESC_ENDSUB);
200 }
201
202 if(!bDestructor){
203 //デストラクタが無いときは生成する
204 sprintf(pTemp+lstrlen(pTemp),"%c%c~%s():%c%c:",
205 1,ESC_SUB,
206 ClassName,
207 1,ESC_ENDSUB);
208 }
209 }
210 break;
211 }
212
213 if(buffer[i]==1&&(buffer[i+1]==ESC_SUB||buffer[i+1]==ESC_FUNCTION)){
214 i+=2;
215 while(IsBlank(buffer[i])) i++;
216 if(buffer[i]=='~'){
217 //デストラクタ
218 bDestructor=1;
219 }
220 else{
221 //コンストラクタかどうかをチェック
222 for(i2=0;;i++,i2++){
223 if(!IsVariableChar(buffer[i])){
224 temporary[i2]=0;
225 break;
226 }
227 temporary[i2]=buffer[i];
228 }
229 if(lstrcmp(temporary,ClassName)==0) bConstructor=1;
230 }
231 }
232 }
233}
234void ChangeCommand(char *buffer,int nowLine,char *Command){
235 int i,i2,IsStr;
236 unsigned _int16 ComNum;
237 char com[8192],pam[8192];
238
239 static int nCountOfNonGlobalScope = 0;
240
241 if(Command[0]==1){
242 switch(Command[1]){
243 case ESC_SELECTCASE:
244 case ESC_CASE:
245 KillStringSpaces(Command+2);
246 break;
247 case ESC_WITH:
248 KillStringSpaces(Command+2);
249 break;
250 case ESC_TYPEDEF:
251 KillStringSpaces(Command+2);
252 break;
253 case ESC_DECLARE:
254 KillStringSpaces(Command+2);
255 break;
256 case ESC_IF:
257 KillStringSpaces(Command+2);
258 break;
259
260 case ESC_CLASS:
261 KillStringSpaces(Command+2);
262 i2 = 2;
263 if( Command[i2] == 1 && Command[i2+1] == ESC_ENUM )
264 {
265 i2 += 2;
266 }
267 else if( Command[i2] == 1 && Command[i2+1] == ESC_DELEGATE )
268 {
269 i2 += 2;
270 }
271 else if( memicmp( Command + i2, "Blittable(", 10 ) == 0 )
272 {
273 i2 += 10;
274 i2 = JumpStringInPare(Command,i2)+1;
275 }
276
277 // クラス名を取得
278 char className[VN_SIZE];
279 GetIdentifierToken( className, Command, i2 );
280
281 //コンストラクタ、デストラクタを暗黙的に生成
282 MakeConstructorAndDestructor(buffer,nowLine,className);
283 break;
284 case ESC_INTERFACE:
285 KillStringSpaces(Command+2);
286 break;
287 case ESC_ENDCLASS:
288 if(ConstructorDestructorSchedule[0]){
289 //生成されたコンストラクタ、デストラクタを挿入
290 sprintf(Command,"%s%c%c",ConstructorDestructorSchedule,1,ESC_ENDCLASS);
291 }
292 break;
293
294 case ESC_TYPE:
295 KillStringSpaces(Command+2);
296 break;
297
298 case ESC_CONST:
299 KillStringSpaces(Command+2);
300 if( Command[2] == 1 && Command[3] == ESC_ENUM ){
301 nCountOfNonGlobalScope++;
302 }
303 break;
304
305 case ESC_ENUM:
306 nCountOfNonGlobalScope++;
307 KillStringSpaces(Command+2);
308 break;
309
310 case ESC_ENDENUM:
311 nCountOfNonGlobalScope--;
312 break;
313
314 case ESC_INHERITS:
315 case ESC_IMPLEMENTS:
316 case ESC_VIRTUAL:
317 case ESC_OVERRIDE:
318 case ESC_ABSTRACT:
319 case ESC_SUB:
320 case ESC_FUNCTION:
321 case ESC_MACRO:
322 case ESC_STATIC:
323 case ESC_NAMESPACE:
324 case ESC_IMPORTS:
325 case ESC_DELEGATE:
326 case ESC_CATCH:
327 case ESC_THROW:
328 KillStringSpaces(Command+2);
329 break;
330 }
331 return;
332 }
333
334 bool isPare = false;
335 for(i=0;;i++){
336 if(Command[i]==' '||Command[i]=='\t'||Command[i]=='('||Command[i]=='\"'||Command[i]=='@'||Command[i]=='-'){
337 com[i]=0;
338 while(Command[i]==' '||Command[i]=='\t') i++;
339 if( Command[i] == '(' ) isPare = true;
340 break;
341 }
342 if(Command[i]=='='){
343 KillStringSpaces(Command);
344 return;
345 }
346 com[i]=Command[i];
347 if(Command[i]=='\0') break;
348 }
349
350 //マクロによるコマンド
351 i2=1;
352 if( nCountOfNonGlobalScope == 0 ){
353 //グローバル
354 if(lstrcmpi(com,"Open")==0) ComOpen(Command+i,pam,nowLine);
355 else if(lstrcmpi(com,"Close")==0) ComClose(Command+i,pam);
356 else if(lstrcmpi(com,"Field")==0||
357 lstrcmpi(com,"Get")==0||
358 lstrcmpi(com,"Put")==0) ComField(Command+i,pam);
359 else if(lstrcmpi(com,"Line")==0) ComLine(Command+i,pam,nowLine);
360 else if(lstrcmpi(com,"Circle")==0) ComCircle(Command+i,pam,nowLine);
361 else if(lstrcmpi(com,"PSet")==0) ComPSet(Command+i,pam,nowLine);
362 else if(lstrcmpi(com,"Paint")==0) ComPaint(Command+i,pam,nowLine);
363
364 else if(
365 lstrcmpi(com,"EXEC")==0||
366 lstrcmpi(com,"INPUT")==0||
367 lstrcmpi(com,"PRINT")==0||
368 lstrcmpi(com,"RANDOMIZE")==0||
369 ( lstrcmpi(com,"WRITE")==0 && isPare == false )||
370 lstrcmpi(com,"MSGBOX")==0||
371 lstrcmpi(com,"WINDOW")==0||
372 lstrcmpi(com,"DELWND")==0||
373 lstrcmpi(com,"INSMENU")==0||
374 lstrcmpi(com,"CHDIR")==0||
375 lstrcmpi(com,"MKDIR")==0||
376 lstrcmpi(com,"KILL")==0||
377 lstrcmpi(com,"CLS")==0||
378 lstrcmpi(com,"COLOR")==0||
379 lstrcmpi(com,"LOCATE")==0
380 ){
381 KillSpaces(Command+i,pam);
382
383 //大文字に変換
384 CharUpper(com);
385
386 sprintf(Command,"%s(%s)",com,pam);
387 return;
388 }
389
390 else i2=0;
391 }
392 else i2=0;
393 if(i2){
394 //大文字に変換
395 CharUpper(com);
396
397 sprintf(Command,"%s(%s)",com,pam);
398 return;
399 }
400
401
402
403 //コンパイラに搭載されるコマンド
404 if(lstrcmpi(com,"Do")==0){
405 KillSpaces(Command+i,pam);
406 ComNum=COM_DO;
407 }
408 else if(lstrcmpi(com,"goto")==0){
409 KillSpaces(Command+i,pam);
410 ComNum=COM_GOTO;
411 }
412 else if(lstrcmpi(com,"gosub")==0){
413 KillSpaces(Command+i,pam);
414 ComNum=COM_GOSUB;
415 }
416 else if(lstrcmpi(com,"Loop")==0){
417 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')){
418 lstrcpy(pam,"0,");
419 KillSpaces(Command+i+5,pam+2);
420 }
421 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')){
422 lstrcpy(pam,"1,");
423 KillSpaces(Command+i+5,pam+2);
424 }
425 else pam[0]=0;
426 ComNum=COM_LOOP;
427 }
428 else if(lstrcmpi(com,"For")==0){
429 for(i2=0,IsStr=0;;i++,i2++){
430 while(Command[i]==' '||Command[i]=='\t') i++;
431 if(Command[i]=='\"') IsStr^=1;
432 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){
433 pam[i2]=',';
434 break;
435 }
436 pam[i2]=Command[i];
437 if(Command[i]=='\0') break;
438 }
439 if(Command[i]){
440 for(i+=3,i2++,IsStr=0;;i++,i2++){
441 while(Command[i]==' '||Command[i]=='\t') i++;
442 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')){
443 pam[i2]=',';
444 i+=4;
445 continue;
446 }
447 pam[i2]=Command[i];
448 if(Command[i]=='\0') break;
449 }
450 }
451 ComNum=COM_FOR;
452 }
453 else if(lstrcmpi(com,"Foreach")==0)
454 {
455 for(i2=0,IsStr=0;;i++,i2++)
456 {
457 while(Command[i]==' '||Command[i]=='\t') i++;
458 if(Command[i]=='\"') IsStr^=1;
459 if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='i'||Command[i]=='I')&&(Command[i+1]=='n'||Command[i+1]=='N')&&(Command[i+2]==' '||Command[i+2]=='\t')&&IsStr==0){
460 pam[i2++] = 1;
461 pam[i2] = ESC_IN;
462 break;
463 }
464 pam[i2]=Command[i];
465 if(Command[i]=='\0') break;
466 }
467 if(Command[i])
468 {
469 lstrcpy( pam + i2 + 1, Command + i + 3 );
470 }
471 ComNum=COM_FOREACH;
472 }
473 else if(lstrcmpi(com,"Next")==0){
474 KillSpaces(Command+i,pam);
475 ComNum=COM_NEXT;
476 }
477 else if(lstrcmpi(com,"Return")==0){
478 KillSpaces(Command+i,pam);
479 ComNum=COM_RETURN;
480 }
481 else if(lstrcmpi(com,"While")==0){
482 KillSpaces(Command+i,pam);
483 ComNum=COM_WHILE;
484 }
485 else if(lstrcmpi(com,"Wend")==0){
486 pam[0]=0;
487 ComNum=COM_WEND;
488 }
489
490 //変数、データ操作
491 else if(lstrcmpi(com,"dim")==0){
492 KillSpaces(Command+i,pam);
493 ComNum=COM_DIM;
494 }
495 else if(lstrcmpi(com,"Delete")==0){
496 KillSpaces(Command+i,pam);
497 ComNum=COM_DELETE;
498 }
499 else if( lstrcmpi( com, "_System_SweepingDelete" ) == 0 ){
500 KillSpaces(Command+i,pam);
501 ComNum=COM_SWEEPINGDELETE;
502 }
503
504 //その他
505 else if(lstrcmpi(com,"Debug")==0){
506 pam[0]=0;
507 ComNum=COM_DEBUG;
508 }
509 else if(lstrcmpi(com,"let")==0){
510 KillSpaces(Command+i,pam);
511 ComNum=COM_LET;
512 }
513 else if(lstrcmpi(com,"rem")==0){
514 Command[0]=0;
515 return;
516 }
517
518 //ポインタ
519 else if(lstrcmpi(com,"SetDouble")==0){
520 KillSpaces(Command+i,pam);
521 ComNum=COM_SETDOUBLE;
522 }
523 else if(lstrcmpi(com,"SetSingle")==0){
524 KillSpaces(Command+i,pam);
525 ComNum=COM_SETSINGLE;
526 }
527 else if(lstrcmpi(com,"SetQWord")==0){
528 KillSpaces(Command+i,pam);
529 ComNum=COM_SETQWORD;
530 }
531 else if(lstrcmpi(com,"SetDWord")==0){
532 KillSpaces(Command+i,pam);
533 ComNum=COM_SETDWORD;
534 }
535 else if(lstrcmpi(com,"SetWord")==0){
536 KillSpaces(Command+i,pam);
537 ComNum=COM_SETWORD;
538 }
539 else if(lstrcmpi(com,"SetByte")==0){
540 KillSpaces(Command+i,pam);
541 ComNum=COM_SETBYTE;
542 }
543
544 else{
545 //その他のコマンド(一般コード)
546 lstrcpy(com,Command);
547 KillSpaces(com,Command);
548 return;
549 }
550
551 i=lstrlen(pam);
552 while(pam[i-1]==' '||pam[i-1]=='\t') i--;
553 pam[i]=0;
554 if(pam[0]) sprintf(Command,"%c%c%s",HIBYTE(ComNum),LOBYTE(ComNum),pam);
555 else sprintf(Command,"%c%c",HIBYTE(ComNum),LOBYTE(ComNum));
556
557 return;
558}
559
560void ChangeCommandToCode(char *buffer){
561 extern HANDLE hHeap;
562 int i,i2,i3,IsStr,CommandBufferSize;
563 char *temporary,*tempBase,temp2[VN_SIZE],*lpCommand;
564
565 tempBase=(char *)HeapAlloc(hHeap,0,(lstrlen(buffer)+1)*2+8192);
566 temporary=tempBase+1;
567 temporary[0]=0;
568 i=0;
569 i3=0;
570
571 CommandBufferSize=512;
572 lpCommand=(char *)HeapAlloc(hHeap,0,CommandBufferSize);
573
574 while(1){
575 i2=0;
576 while(buffer[i]==' '||buffer[i]=='\t') i++;
577 while(buffer[i]>='0'&&buffer[i]<='9'){
578 temp2[i2]=buffer[i];
579 i++;
580 i2++;
581 }
582 temp2[i2]=0;
583 while(buffer[i]==' '||buffer[i]=='\t') i++;
584 for(i2=0,IsStr=0;;i++,i2++){
585 if(i2>=CommandBufferSize){ //バッファ領域が足りなくなった場合はバッファを増量する
586 CommandBufferSize+=512;
587 lpCommand=(char *)HeapReAlloc(hHeap,0,lpCommand,CommandBufferSize);
588 }
589 if(buffer[i]=='\"') IsStr^=1;
590 if(buffer[i]=='\n'||(buffer[i]==':'&&IsStr==0)||buffer[i]=='\0'){
591 lpCommand[i2]=0;
592
593 if(temp2[0]){
594 //行番号ラベル
595 sprintf(temporary+i3,"%c%c%s,",1,ESC_LINENUM,temp2);
596 i3+=lstrlen(temporary+i3);
597
598 temp2[0]=0;
599 }
600
601 //命令コードへ変換
602 if(i2){
603 //エラー用
604 extern int cp;
605 cp=i;
606
607 ChangeCommand(buffer,i,lpCommand);
608
609 lstrcpy(temporary+i3,lpCommand);
610 i3+=lstrlen(temporary+i3);
611 }
612
613 if(!(lpCommand[0]=='\0'&&buffer[i]==':')){
614 temporary[i3++]=buffer[i];
615 temporary[i3]=0;
616 }
617
618 if(buffer[i]=='\n'){
619 i++;
620 break;
621 }
622 else if(buffer[i]==':'){
623 while(buffer[i+1]==' '||buffer[i+1]=='\t') i++;
624 }
625 if(buffer[i]=='\0') break;
626 i2=-1;
627 continue;
628 }
629 lpCommand[i2]=buffer[i];
630 }
631 if(buffer[i]=='\0') break;
632 }
633 HeapDefaultFree(lpCommand);
634 lstrcpy(buffer,temporary);
635
636 HeapDefaultFree(tempBase);
637}
Note: See TracBrowser for help on using the repository browser.