source: dev/trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp@ 287

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

Binaryクラスを追加

File size: 28.5 KB
Line 
1#include "stdafx.h"
2
3#include <jenga/include/common/Path.h>
4
5#include <jenga/include/smoothie/Smoothie.h>
6#include <jenga/include/smoothie/LexicalAnalysis.h>
7
8#include <Compiler.h>
9
10#include "../BasicCompiler_Common/common.h"
11
12void ChangeReturnCode(char *buffer){
13
14#ifdef _DEBUG
15 //改行コードの整合性チェック
16 for( int i=0; ; i++ ){
17 if( buffer[i] == '\0' ){
18 break;
19 }
20 if( buffer[i]!='\r' && buffer[i+1]=='\n'
21 || buffer[i]=='\r' && buffer[i+1]!='\n' ){
22 char temporary[255];
23 strncpy( temporary, buffer + i-100, 130 );
24 temporary[130] = 0;
25 for(int i2=0; ;i2++){
26 if(temporary[i2]=='\r') temporary[i2]='A';
27 if(temporary[i2]=='\n') temporary[i2]='B';
28 if(temporary[i2]=='\0') break;
29 }
30 MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION );
31 }
32 }
33#endif
34
35 //改行コードのCRLFをLFに変換
36 for(int i=0,i2=0;;i++,i2++){
37 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
38 buffer[i2]=buffer[i];
39 if(buffer[i]=='\0') break;
40 }
41}
42void DeleteComment(char *buffer){ //注釈「'」の取り除き
43 int i,i2,i3,IsStr;
44 char *temporary;
45 temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
46 for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
47 if(buffer[i]=='\"') IsStr^=1;
48 if(buffer[i]=='\n'||buffer[i]=='\0'){
49 i2--;
50 while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
51 i2++;
52
53 if(i3){
54 //複数行に渡る注釈文の中に改行が存在するとき
55 memset(temporary+i2,'\n',i3);
56 i2+=i3;
57 i3=0;
58 }
59 }
60 if(buffer[i]=='\''&&IsStr==0){
61 //注釈文
62 i2--;
63 while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
64 i2++;
65 while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
66 }
67 if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
68 //注釈文(複数行)
69 i+=2;
70 i3=0;
71 while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
72 if(buffer[i]=='\n') i3++;
73 if(buffer[i]=='\0') break;
74 i++;
75 }
76 if(buffer[i]){
77 i+=2;
78 }
79 i--;
80 i2--;
81 continue;
82 }
83 temporary[i2]=buffer[i];
84 if(buffer[i]=='\0') break;
85 }
86 lstrcpy(buffer,temporary);
87 GlobalFree(temporary);
88}
89void CheckParenthesis(char *buffer){
90 int i,IsStr,PareNum,sw;
91 _int8 bracket[1024];
92
93 for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
94 if(buffer[i]=='\"'){
95 IsStr^=1;
96 continue;
97 }
98
99 else if(buffer[i]=='('&&IsStr==0){
100 bracket[PareNum]=0;
101 PareNum++;
102 }
103 else if(buffer[i]=='['&&IsStr==0){
104 bracket[PareNum]=1;
105 PareNum++;
106 }
107
108 else if(buffer[i]==')'&&IsStr==0){
109 PareNum--;
110 if(bracket[PareNum]!=0||PareNum<0){
111 //"カッコ \'( )\'"
112 SetError(4,STRING_PARENTHESIS,i);
113 return;
114 }
115 }
116 else if(buffer[i]==']'&&IsStr==0){
117 PareNum--;
118 if(bracket[PareNum]!=1||PareNum<0){
119 //"カッコ \'( )\'"
120 SetError(4,STRING_PARENTHESIS,i);
121 return;
122 }
123 }
124
125 else if(buffer[i]=='\n'||buffer[i]=='\0'){
126
127 //"カッコ \'( )\'"
128 if(PareNum!=0) SetError(4,STRING_PARENTHESIS,i);
129
130 if(IsStr!=0) SetError(5,NULL,i);
131 if(buffer[i]=='\0') break;
132 PareNum=0;
133 IsStr=0;
134
135 sw=0;
136 }
137
138 else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
139 //不正な文字コード
140 if(sw==0){
141 //全角スペース
142 if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40)
143 SetError(20,NULL,i);
144
145 //その他の全角文字
146 else SetError(8,NULL,i);
147 sw=1;
148 }
149 }
150 }
151}
152BOOL CheckParenthesis2(char *buffer){
153 int i,IsStr,PareNum,sw;
154 _int8 bracket[1024];
155
156 for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
157 if(buffer[i]=='\"'){
158 IsStr^=1;
159 continue;
160 }
161
162 else if(buffer[i]=='('&&IsStr==0){
163 bracket[PareNum]=0;
164 PareNum++;
165 }
166 else if(buffer[i]=='['&&IsStr==0){
167 bracket[PareNum]=1;
168 PareNum++;
169 }
170
171 else if(buffer[i]==')'&&IsStr==0){
172 PareNum--;
173 if(bracket[PareNum]!=0||PareNum<0){
174 //"カッコ \'( )\'"
175 return 0;
176 }
177 }
178 else if(buffer[i]==']'&&IsStr==0){
179 PareNum--;
180 if(bracket[PareNum]!=1||PareNum<0){
181 //"カッコ \'( )\'"
182 return 0;
183 }
184 }
185
186 else if(buffer[i]=='\n'||buffer[i]=='\0'){
187
188 //"カッコ \'( )\'"
189 if(PareNum!=0){
190 return 0;
191 }
192
193 if(IsStr!=0){
194 return 0;
195 }
196 if(buffer[i]=='\0') break;
197 PareNum=0;
198 IsStr=0;
199
200 sw=0;
201 }
202
203 else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
204 //不正な文字コード
205 if(sw==0){
206 //全角スペース
207 if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40){
208 return 0;
209 }
210
211 //その他の全角文字
212 else return 0;
213 sw=1;
214 }
215 }
216 }
217 return 1;
218}
219void DirectiveCheck(void){
220 extern char *basbuf;
221 extern char BasicCurDir[MAX_PATH];
222 int i,i2,i3;
223 char temporary[VN_SIZE];
224
225 extern BOOL bStrict;
226 bStrict=1;
227
228 for(i=0;;i++){
229 if(basbuf[i]=='\0') break;
230 if(((basbuf[i-2]==0&&basbuf[i-1]==-1)||basbuf[i-1]=='\n')&&
231 basbuf[i]=='#'){
232 for(i2=i+1,i3=0;;i2++,i3++){
233 if(!IsVariableChar(basbuf[i2])){
234 temporary[i3]=0;
235 break;
236 }
237 temporary[i3]=basbuf[i2];
238 }
239 if( lstrcmp( temporary, "static_link" ) == 0 )
240 {
241 // 静的リンクライブラリ
242 while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++;
243 if(basbuf[i2]!='\"'){
244 SetError(1,NULL,i2);
245 return;
246 }
247 for(i3=0,i2++;;i2++,i3++){
248 if(basbuf[i2]=='\"'){
249 temporary[i3]=0;
250 break;
251 }
252 temporary[i3]=basbuf[i2];
253 }
254 GetFullPath(temporary,BasicCurDir);
255
256 compiler.staticLibraryFilePaths.push_back( temporary );
257
258 compiler.staticLibraries.push_back( new ObjectModule() );
259
260 Jenga::Common::Path path( temporary );
261 CompileMessage( ((string)"\"" + path.GetFileName() + path.GetExt() + "\" を読み込みました。").c_str() );
262 compiler.staticLibraries.back()->Read( temporary );
263
264 for(;;i2++){
265 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
266 }
267 SlideString(basbuf+i2,i-i2);
268 }
269 else if(lstrcmpi(temporary,"noprompt")==0){
270 //#noprompt
271 //旧機能なので、無視
272 for(;;i2++){
273 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
274 }
275 SlideString(basbuf+i2,i-i2);
276 }
277 else if(lstrcmpi(temporary,"strict")==0){
278 //#strict
279 //旧機能なので、無視
280 for(;;i2++){
281 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
282 }
283 SlideString(basbuf+i2,i-i2);
284 }
285 else if(lstrcmpi(temporary,"struct")==0){
286 //#struct code
287 //旧機能なので、無視
288 for(;;i2++){
289 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
290 }
291 SlideString(basbuf+i2,i-i2);
292 }
293 else if( lstrcmpi( temporary, "_fullcompile" ) == 0 ){
294 // すべての関数・メソッドをコンパイルする(デバッグ用)
295 for(;;i2++){
296 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
297 }
298 SlideString(basbuf+i2,i-i2);
299
300 Smoothie::isFullCompile = true;
301 }
302 else if(lstrcmpi(temporary,"resource")==0){
303 //#resource
304 while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++;
305 if(basbuf[i2]!='\"'){
306 SetError(1,NULL,i2);
307 return;
308 }
309 for(i3=0,i2++;;i2++,i3++){
310 if(basbuf[i2]=='\"'){
311 temporary[i3]=0;
312 break;
313 }
314 temporary[i3]=basbuf[i2];
315 }
316 GetFullPath(temporary,BasicCurDir);
317
318 extern char ResourceFileName[MAX_PATH];
319 lstrcpy(ResourceFileName,temporary);
320
321 for(;;i2++){
322 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
323 }
324 SlideString(basbuf+i2,i-i2);
325 }
326 }
327 }
328}
329void NextCommandFormat(char *buffer){
330 int i,i2,i3;
331 char temporary[255];
332
333 //Next命令語のフォーマット
334 for(i=0;;i++){
335 if(buffer[i]=='\n'||buffer[i]==':'||i==0){
336 if(buffer[i]=='\n'||buffer[i]==':') i++;
337 while(buffer[i]==' '||buffer[i]=='\t') i++;
338 while(buffer[i]>='0'&&buffer[i]<='9') i++;
339 while(buffer[i]==' '||buffer[i]=='\t') i++;
340 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')&&
341 (buffer[i+4]==' '||buffer[i+4]=='\t')){
342 i2=i+5;
343 while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
344 if(buffer[i2]!='\n'){
345 lstrcpy(temporary,"NEXT");
346 for(i3=0;;i2++){
347 if(buffer[i2]=='\n'||buffer[i2]==':'||buffer[i2]=='\0') break;
348 if(buffer[i2]==','){
349 lstrcat(temporary,":NEXT");
350 i3=1;
351 }
352 }
353 if(i3){
354 i3=lstrlen(temporary);
355 SlideString(buffer+i2,i-i2+i3);
356 memcpy(buffer+i,temporary,i3);
357 }
358 }
359 }
360 }
361 if(buffer[i]=='\0') break;
362 }
363}
364void SetEscapeSequenceFormat(char *buffer){
365 /*「MOD」「AND」「OR」
366 その他制御文字をエスケープシーケンスを使用した記号へ変換 */
367 int i,i2,i3,i4,i5,i6,sw1,IsStr;
368 char *temporary,temp2[VN_SIZE];
369
370 bool isBeforeCharDelimitation = false;
371 temporary=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,(lstrlen(buffer)+255)*2);
372 for(i=0,i2=0,IsStr=0;;i++,i2++){
373 if(buffer[i]=='\"') IsStr^=1;
374 if(buffer[i]=='-'&&buffer[i+1]=='>'&&IsStr==0){
375 buffer[i]=1;
376 buffer[i+1]=ESC_PSMEM;
377 }
378
379 if( buffer[i] && IsCommandDelimitation( buffer[i] ) ){
380 isBeforeCharDelimitation = true;
381
382 temporary[i2]=buffer[i];
383 continue;
384 }
385
386 if(IsVariableChar(buffer[i])&&IsStr==0){
387
388 i3=i2;
389 for(;;i++,i2++){
390 if(!IsVariableChar(buffer[i])){
391 temporary[i2]=0;
392 break;
393 }
394 temporary[i2]=buffer[i];
395 }
396
397 bool isAfterCharBlank = false;
398 if( IsBlank( buffer[i] ) ){
399 isAfterCharBlank = true;
400 }
401
402 if(lstrcmpi(temporary+i3,"End")==0) i6=1;
403 else if(lstrcmpi(temporary+i3,"Exit")==0) i6=2;
404 else if(lstrcmpi(temporary+i3,"Select")==0) i6=3;
405 else if(lstrcmpi(temporary+i3,"Case")==0) i6=4;
406 else if(lstrcmpi(temporary+i3,"Else")==0) i6=5;
407 else i6=0;
408 if(i6){
409 i4=i;
410 while(buffer[i4]==' '||buffer[i4]=='\t') i4++;
411 for(i5=0;;i4++,i5++){
412 if(!IsVariableChar(buffer[i4])){
413 temp2[i5]=0;
414 break;
415 }
416 temp2[i5]=buffer[i4];
417 }
418 sw1=0;
419 if(i6==3){
420 //Select~
421 if(lstrcmpi(temp2,"Case")==0) sw1=1;
422 }
423 else if(i6==4){
424 //Case~
425 if(lstrcmpi(temp2,"Else")==0) sw1=1;
426 }
427 else if(i6==5){
428 //Else If
429 if(lstrcmpi(temp2,"If")==0) sw1=1;
430 }
431 else if(i6==1){
432 //End~
433 switch(temp2[0]){
434 case 'c':
435 case 'C':
436 if(lstrcmpi(temp2,"Class")==0) sw1=1;
437 break;
438 case 'e':
439 case 'E':
440 if(lstrcmpi(temp2,"Enum")==0) sw1=1;
441 break;
442 case 'i':
443 case 'I':
444 if(lstrcmpi(temp2,"If")==0) sw1=1;
445 else if(lstrcmpi(temp2,"Interface")==0) sw1=1;
446 break;
447 case 'f':
448 case 'F':
449 if(lstrcmpi(temp2,"Function")==0) sw1=1;
450 break;
451 case 'm':
452 case 'M':
453 if(lstrcmpi(temp2,"Macro")==0) sw1=1;
454 break;
455 case 'n':
456 case 'N':
457 if(lstrcmpi(temp2,"Namespace")==0) sw1=1;
458 break;
459 case 's':
460 case 'S':
461 if(lstrcmpi(temp2,"Sub")==0) sw1=1;
462 else if(lstrcmpi(temp2,"Select")==0) sw1=1;
463 break;
464 case 't':
465 case 'T':
466 if(lstrcmpi(temp2,"Type")==0) sw1=1;
467 break;
468 case 'w':
469 case 'W':
470 if(lstrcmpi(temp2,"With")==0) sw1=1;
471 break;
472 }
473 }
474 else if(i6==2){
475 //Exit~
476 if(
477 lstrcmpi(temp2,"For")==0||
478 lstrcmpi(temp2,"While")==0||
479 lstrcmpi(temp2,"Do")==0||
480 lstrcmpi(temp2,"Function")==0||
481 lstrcmpi(temp2,"Sub")==0||
482 lstrcmpi(temp2,"Macro")==0
483 ) sw1=1;
484 }
485
486 if(sw1){
487 i=i4;
488 memcpy(temporary+i2,temp2,i5);
489 i2+=i5;
490 temporary[i2]=0;
491 }
492 }
493 i--;
494 i2--;
495
496 switch(temporary[i3]){
497 case '_':
498 if(lstrcmpi(temporary+i3,"_ClearNamespaceImported")==0){
499 i2=i3;
500 temporary[i2++]=1;
501 temporary[i2]=ESC_CLEARNAMESPACEIMPORTED;
502 }
503 break;
504 case 'a':
505 case 'A':
506 if(lstrcmpi(temporary+i3,"And")==0){
507 i2=i3;
508 temporary[i2++]=1;
509 temporary[i2]=ESC_AND;
510 }
511 else if(lstrcmpi(temporary+i3,"Abstract")==0){
512 i2=i3;
513 temporary[i2++]=1;
514 temporary[i2]=ESC_ABSTRACT;
515 }
516 else if(lstrcmpi(temporary+i3,"As")==0){
517 i2=i3;
518 temporary[i2++]=1;
519 temporary[i2]=ESC_AS;
520 }
521 break;
522 case 'b':
523 case 'B':
524 if(lstrcmpi(temporary+i3,"ByVal")==0){
525 i2=i3;
526 temporary[i2++]=1;
527 temporary[i2]=ESC_BYVAL;
528 }
529 else if(lstrcmpi(temporary+i3,"ByRef")==0){
530 i2=i3;
531 temporary[i2++]=1;
532 temporary[i2]=ESC_BYREF;
533 }
534 break;
535 case 'c':
536 case 'C':
537 if(lstrcmpi(temporary+i3,"Catch")==0){
538 i2=i3;
539 temporary[i2++]=1;
540 temporary[i2]=ESC_CATCH;
541 }
542 else if(lstrcmpi(temporary+i3,"Continue")==0){
543 i2=i3;
544 temporary[i2++]=1;
545 temporary[i2]=ESC_CONTINUE;
546 }
547 else if(lstrcmpi(temporary+i3,"cdecl")==0){
548 i2=i3;
549 temporary[i2++]=1;
550 temporary[i2]=ESC_CDECL;
551 }
552 else if(lstrcmpi(temporary+i3,"Case")==0){
553 i2=i3;
554 temporary[i2++]=1;
555 temporary[i2]=ESC_CASE;
556 }
557 else if(lstrcmpi(temporary+i3,"CaseElse")==0){
558 i2=i3;
559 temporary[i2++]=1;
560 temporary[i2]=ESC_CASEELSE;
561 }
562 else if(lstrcmpi(temporary+i3,"Const")==0){
563 i2=i3;
564 temporary[i2++]=1;
565 temporary[i2]=ESC_CONST;
566 }
567 else if(lstrcmpi(temporary+i3,"Class")==0){
568 i2=i3;
569 temporary[i2++]=1;
570 temporary[i2]=ESC_CLASS;
571 }
572 break;
573 case 'd':
574 case 'D':
575 if(lstrcmpi(temporary+i3,"Declare")==0){
576 i2=i3;
577 int i9=i2;
578 temporary[i2]=1;
579 temporary[++i2]=ESC_DECLARE;
580 i++;
581 while(buffer[i]==' '||buffer[i]=='\t') i++;
582
583 // Sub/Function
584 for(i4=0;;i++,i4++){
585 if(!IsVariableChar(buffer[i])){
586 temp2[i4]=0;
587 break;
588 }
589 temp2[i4]=buffer[i];
590 }
591 if(lstrcmpi(temp2,"Sub")==0) temporary[++i2]=ESC_SUB;
592 else if(lstrcmpi(temp2,"Function")==0) temporary[++i2]=ESC_FUNCTION;
593 while(buffer[i]==' '||buffer[i]=='\t') i++;
594
595 // 関数名
596 for(i2++;;i++,i2++){
597 if(!IsVariableChar(buffer[i])){
598 i2--;
599 break;
600 }
601 temporary[i2]=buffer[i];
602 }
603 while(buffer[i]==' '||buffer[i]=='\t') i++;
604
605 for(i4=0;;i++,i4++){
606 if(!IsVariableChar(buffer[i])){
607 temp2[i4]=0;
608 break;
609 }
610 temp2[i4]=buffer[i];
611 }
612 if(lstrcmpi(temp2,"cdecl")==0){
613 temporary[++i2]=1;
614 temporary[++i2]=ESC_CDECL;
615
616 while(buffer[i]==' '||buffer[i]=='\t') i++;
617 for(i4=0;;i++,i4++){
618 if(!IsVariableChar(buffer[i])){
619 temp2[i4]=0;
620 break;
621 }
622 temp2[i4]=buffer[i];
623 }
624 }
625 if(lstrcmpi(temp2,"Lib")==0) temporary[++i2]=',';
626 while(buffer[i]==' '||buffer[i]=='\t') i++;
627
628 if(buffer[i]=='\"'){
629 temporary[++i2]=buffer[i];
630 for(i++,i2++;;i++,i2++){
631 temporary[i2]=buffer[i];
632 if(buffer[i]=='\"'){
633 i++;
634 break;
635 }
636 if(buffer[i]=='\0') break;
637 }
638 }
639 else{
640 for(i2++;;i++,i2++){
641 if(!IsVariableChar(buffer[i])){
642 i2--;
643 break;
644 }
645 temporary[i2]=buffer[i];
646 }
647 }
648 while(buffer[i]==' '||buffer[i]=='\t') i++;
649
650 temporary[++i2]=',';
651
652 if( memicmp( buffer + i, "Alias", 5 ) ==0 ){
653 i+=5;
654 for(i++,i2++;;i++,i2++){
655 temporary[i2]=buffer[i];
656 if(buffer[i]=='('){
657 i2--;
658 break;
659 }
660 if(buffer[i]=='\0') break;
661 }
662 }
663
664 temporary[++i2]=',';
665
666 i--;
667 }
668 else if(lstrcmpi(temporary+i3,"Def")==0){
669 i2=i3;
670 temporary[i2++]=1;
671 temporary[i2]=ESC_DEF;
672 }
673 break;
674 case 'e':
675 case 'E':
676 if(lstrcmpi(temporary+i3,"ElseIf")==0){
677 i2=i3;
678 temporary[i2++]=1;
679 temporary[i2]=ESC_ELSEIF;
680 }
681 else if(lstrcmpi(temporary+i3,"Else")==0){
682 i2=i3;
683 temporary[i2++]=1;
684 temporary[i2]=ESC_ELSE;
685 }
686 else if(lstrcmpi(temporary+i3,"Export")==0){
687 i2=i3;
688 temporary[i2++]=1;
689 temporary[i2]=ESC_EXPORT;
690 }
691 else if(lstrcmpi(temporary+i3,"Enum")==0){
692 i2=i3;
693 temporary[i2++]=1;
694 temporary[i2]=ESC_ENUM;
695 }
696
697 else if(temporary[i3+1]=='n'||temporary[i3+1]=='N'){
698 //終了記述
699 if(lstrcmpi(temporary+i3,"EndIf")==0){
700 i2=i3;
701 temporary[i2++]=1;
702 temporary[i2]=ESC_ENDIF;
703 }
704 else if(lstrcmpi(temporary+i3,"EndFunction")==0){
705 i2=i3;
706 temporary[i2++]=1;
707 temporary[i2]=ESC_ENDFUNCTION;
708 }
709 else if(lstrcmpi(temporary+i3,"EndSub")==0){
710 i2=i3;
711 temporary[i2++]=1;
712 temporary[i2]=ESC_ENDSUB;
713 }
714 else if(lstrcmpi(temporary+i3,"EndMacro")==0){
715 i2=i3;
716 temporary[i2++]=1;
717 temporary[i2]=ESC_ENDMACRO;
718 }
719 else if(lstrcmpi(temporary+i3,"EndNamespace")==0){
720 i2=i3;
721 temporary[i2++]=1;
722 temporary[i2]=ESC_ENDNAMESPACE;
723 }
724 else if(lstrcmpi(temporary+i3,"EndClass")==0){
725 i2=i3;
726 temporary[i2++]=1;
727 temporary[i2]=ESC_ENDCLASS;
728 }
729 else if(lstrcmpi(temporary+i3,"EndInterface")==0){
730 i2=i3;
731 temporary[i2++]=1;
732 temporary[i2]=ESC_ENDINTERFACE;
733 }
734 else if(lstrcmpi(temporary+i3,"EndTry")==0){
735 i2=i3;
736 temporary[i2++]=1;
737 temporary[i2]=ESC_ENDTRY;
738 }
739 else if(lstrcmpi(temporary+i3,"EndType")==0){
740 i2=i3;
741 temporary[i2++]=1;
742 temporary[i2]=ESC_ENDTYPE;
743 }
744 else if(lstrcmpi(temporary+i3,"EndEnum")==0){
745 i2=i3;
746 temporary[i2++]=1;
747 temporary[i2]=ESC_ENDENUM;
748 }
749 else if(lstrcmpi(temporary+i3,"EndSelect")==0){
750 i2=i3;
751 temporary[i2++]=1;
752 temporary[i2]=ESC_ENDSELECT;
753 }
754 else if(lstrcmpi(temporary+i3,"EndWith")==0){
755 i2=i3;
756 temporary[i2++]=1;
757 temporary[i2]=ESC_ENDWITH;
758 }
759 }
760 else if(temporary[i3+1]=='x'||temporary[i3+1]=='X'){
761 if(lstrcmpi(temporary+i3,"ExitFor")==0){
762 i2=i3;
763 temporary[i2++]=1;
764 temporary[i2]=ESC_EXITFOR;
765 }
766 else if(lstrcmpi(temporary+i3,"ExitWhile")==0){
767 i2=i3;
768 temporary[i2++]=1;
769 temporary[i2]=ESC_EXITWHILE;
770 }
771 else if(lstrcmpi(temporary+i3,"ExitDo")==0){
772 i2=i3;
773 temporary[i2++]=1;
774 temporary[i2]=ESC_EXITDO;
775 }
776 else if(lstrcmpi(temporary+i3,"ExitFunction")==0){
777 i2=i3;
778 temporary[i2++]=1;
779 temporary[i2]=ESC_EXITFUNCTION;
780 }
781 else if(lstrcmpi(temporary+i3,"ExitSub")==0){
782 i2=i3;
783 temporary[i2++]=1;
784 temporary[i2]=ESC_EXITSUB;
785 }
786 else if(lstrcmpi(temporary+i3,"ExitMacro")==0){
787 i2=i3;
788 temporary[i2++]=1;
789 temporary[i2]=ESC_EXITMACRO;
790 }
791 }
792 break;
793 case 'f':
794 case 'F':
795 if(lstrcmpi(temporary+i3,"Finally")==0){
796 i2=i3;
797 temporary[i2++]=1;
798 temporary[i2]=ESC_FINALLY;
799 }
800 else if(lstrcmpi(temporary+i3,"Function")==0){
801 i2=i3;
802 temporary[i2++]=1;
803 temporary[i2]=ESC_FUNCTION;
804 }
805 break;
806 case 'i':
807 case 'I':
808 if(lstrcmpi(temporary+i3,"If")==0){
809 i2=i3;
810 temporary[i2++]=1;
811 temporary[i2]=ESC_IF;
812 }
813 else if(lstrcmpi(temporary+i3,"Imports")==0){
814 i2=i3;
815 temporary[i2++]=1;
816 temporary[i2]=ESC_IMPORTS;
817 }
818 else if(lstrcmpi(temporary+i3,"Inherits")==0){
819 i2=i3;
820 temporary[i2++]=1;
821 temporary[i2]=ESC_INHERITS;
822 }
823 else if(lstrcmpi(temporary+i3,"Interface")==0){
824 i2=i3;
825 temporary[i2++]=1;
826 temporary[i2]=ESC_INTERFACE;
827 }
828 break;
829 case 'm':
830 case 'M':
831 if(lstrcmpi(temporary+i3,"Mod")==0){
832 i2=i3;
833 temporary[i2++]=1;
834 temporary[i2]=ESC_MOD;
835 }
836 else if(lstrcmpi(temporary+i3,"Macro")==0){
837 i2=i3;
838 temporary[i2++]=1;
839 temporary[i2]=ESC_MACRO;
840 }
841 break;
842 case 'n':
843 case 'N':
844 if(isBeforeCharDelimitation
845 && lstrcmpi(temporary+i3,"Namespace")==0
846 && isAfterCharBlank ){
847 i2=i3;
848 temporary[i2++]=1;
849 temporary[i2]=ESC_NAMESPACE;
850 }
851 else if(lstrcmpi(temporary+i3,"New")==0){
852 i2=i3;
853 temporary[i2++]=1;
854 temporary[i2]=ESC_NEW;
855 }
856 else if(lstrcmpi(temporary+i3,"Not")==0){
857 i2=i3;
858 temporary[i2++]=1;
859 temporary[i2]=ESC_NOT;
860 }
861 break;
862 case 'o':
863 case 'O':
864 if(lstrcmpi(temporary+i3,"Or")==0){
865 i2=i3;
866 temporary[i2++]=1;
867 temporary[i2]=ESC_OR;
868 }
869 else if(lstrcmpi(temporary+i3,"Override")==0){
870 i2=i3;
871 temporary[i2++]=1;
872 temporary[i2]=ESC_OVERRIDE;
873 }
874 else if(lstrcmpi(temporary+i3,"Operator")==0){
875 i2=i3;
876 temporary[i2++]=1;
877 temporary[i2]=ESC_OPERATOR;
878 }
879 break;
880 case 's':
881 case 'S':
882 if(lstrcmpi(temporary+i3,"Sub")==0){
883 i2=i3;
884 temporary[i2++]=1;
885 temporary[i2]=ESC_SUB;
886 }
887 else if(lstrcmpi(temporary+i3,"SelectCase")==0){
888 i2=i3;
889 temporary[i2++]=1;
890 temporary[i2]=ESC_SELECTCASE;
891 }
892 else if(lstrcmpi(temporary+i3,"Static")==0){
893 i2=i3;
894 temporary[i2++]=1;
895 temporary[i2]=ESC_STATIC;
896 }
897 break;
898 case 't':
899 case 'T':
900 if(lstrcmpi(temporary+i3,"Then")==0){
901 i2=i3;
902 temporary[i2++]=1;
903 temporary[i2]=ESC_THEN;
904 }
905 else if(lstrcmpi(temporary+i3,"Throw")==0){
906 i2=i3;
907 temporary[i2++]=1;
908 temporary[i2]=ESC_THROW;
909 }
910 else if(lstrcmpi(temporary+i3,"Try")==0){
911 i2=i3;
912 temporary[i2++]=1;
913 temporary[i2]=ESC_TRY;
914 }
915 else if(lstrcmpi(temporary+i3,"Type")==0){
916 i2=i3;
917 temporary[i2++]=1;
918 temporary[i2]=ESC_TYPE;
919 }
920 else if(lstrcmpi(temporary+i3,"TypeDef")==0){
921 i2=i3;
922 temporary[i2++]=1;
923 temporary[i2]=ESC_TYPEDEF;
924 }
925 break;
926 case 'u':
927 case 'U':
928 if(lstrcmpi(temporary+i3,"Using")==0){
929 i2=i3;
930 temporary[i2++]=1;
931 temporary[i2]=ESC_USING;
932 }
933 break;
934 case 'v':
935 case 'V':
936 if(lstrcmpi(temporary+i3,"Virtual")==0){
937 i2=i3;
938 temporary[i2++]=1;
939 temporary[i2]=ESC_VIRTUAL;
940 }
941 break;
942 case 'w':
943 case 'W':
944 if(lstrcmpi(temporary+i3,"With")==0){
945 i2=i3;
946 temporary[i2++]=1;
947 temporary[i2]=ESC_WITH;
948 }
949 break;
950 case 'x':
951 case 'X':
952 if(lstrcmpi(temporary+i3,"Xor")==0){
953 i2=i3;
954 temporary[i2++]=1;
955 temporary[i2]=ESC_XOR;
956 }
957 break;
958 }
959
960 continue;
961 }
962
963 if( !IsBlank( buffer[i] ) ){
964 isBeforeCharDelimitation = false;
965 }
966
967 temporary[i2]=buffer[i];
968 if(buffer[i]=='\0') break;
969 }
970 lstrcpy(buffer,temporary);
971 HeapDefaultFree(temporary);
972}
973void DefCommandFormat(char *buffer){
974 int i,i2,PareNum;
975 char temporary[255];
976
977 //Def命令語からFunction命令語へ
978 for(i=0;;i++){
979 if(buffer[i]==1&&buffer[i+1]==ESC_DEF){
980 buffer[i+1]=ESC_FUNCTION;
981 i+=2;
982 while(buffer[i]==' '||buffer[i]=='\t') i++;
983 for(i2=0;;i++,i2++){
984 if(!IsVariableChar(buffer[i])){
985 temporary[i2]=0;
986 break;
987 }
988 temporary[i2]=buffer[i];
989 }
990 while(buffer[i]==' '||buffer[i]=='\t') i++;
991 if(buffer[i]!='('){
992 SetError(1,NULL,i);
993 return;
994 }
995 i++;
996 while(1){
997 while(buffer[i]==' '||buffer[i]=='\t') i++;
998 if(buffer[i]==')') break;
999 SlideString(buffer+i,2);
1000 buffer[i]=1;
1001 buffer[i+1]=ESC_BYVAL;
1002 i+=2;
1003 PareNum=0;
1004 for(;;i++){
1005 if(buffer[i]=='(') PareNum++;
1006 if(buffer[i]==')'){
1007 PareNum--;
1008 if(PareNum<0) break;
1009 }
1010 if(buffer[i]==','&&PareNum==0) break;
1011 }
1012 if(buffer[i]==')') break;
1013 i++;
1014 }
1015 i++;
1016 while(buffer[i]==' '||buffer[i]=='\t') i++;
1017 if(buffer[i]!='='){
1018 SetError(1,NULL,i);
1019 break;
1020 }
1021 i2=lstrlen(temporary);
1022 SlideString(buffer+i,i2+1);
1023 buffer[i]=':';
1024 i++;
1025 memcpy(buffer+i,temporary,i2);
1026 i+=i2;
1027 while(!IsCommandDelimitation(buffer[i])) i++;
1028 SlideString(buffer+i,3);
1029 buffer[i]=':';
1030 buffer[i+1]=1;
1031 buffer[i+2]=ESC_ENDFUNCTION;
1032 }
1033 if(buffer[i]=='\0') break;
1034 }
1035}
1036
1037void ChangeOneIf(char *write,int &wp,char *read,int &rp){
1038 int IsStr,sw;
1039
1040 //ブロック形式でないときはThenの後に区切り文字を入れる
1041 for(IsStr=0,sw=0;;wp++,rp++){
1042 if(read[rp]=='\"') IsStr^=1;
1043
1044 write[wp]=read[rp];
1045
1046 if(IsCommandDelimitation(read[rp])&&IsStr==0) return;
1047 if(read[rp]==1&&read[rp+1]==ESC_THEN&&
1048 (read[rp+2]==' '||read[rp+2]=='\t')){
1049 write[wp+1]=read[rp+1];
1050 write[wp+2]=':';
1051 rp+=3;
1052 wp+=3;
1053 while(read[rp]==' '||read[rp]=='\t') rp++;
1054 if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
1055 memcpy(write+wp,"Goto ",5);
1056 wp+=5;
1057 }
1058 break;
1059 }
1060 }
1061
1062 //Elseの後に区切り文字を入れる
1063 for(IsStr=0;;wp++,rp++){
1064 if(read[rp]=='\"') IsStr^=1;
1065
1066 write[wp]=read[rp];
1067
1068 if(read[rp]=='\n'||read[rp]=='\0') break;
1069 if(read[rp]==1&&read[rp+1]==ESC_IF){
1070 write[wp+1]=read[rp+1];
1071 wp+=2;
1072 rp+=2;
1073 ChangeOneIf(write,wp,read,rp);
1074 wp--;
1075 rp--;
1076 continue;
1077 }
1078 if(read[rp]==1&&read[rp+1]==ESC_ELSE){
1079 write[wp++]=':';
1080
1081 write[wp]=read[rp];
1082 write[wp+1]=read[rp+1];
1083 wp+=2;
1084 rp+=2;
1085
1086 write[wp++]=':';
1087
1088 while(read[rp]==' '||read[rp]=='\t') rp++;
1089 if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
1090 memcpy(write+wp,"Goto ",5);
1091 wp+=5;
1092 }
1093 break;
1094 }
1095 }
1096
1097 //"End If" を付加
1098 for(;;rp++,wp++){
1099 if(read[rp]=='\n'||read[rp]=='\0') break;
1100
1101 if(read[rp]==1&&read[rp+1]==ESC_IF){
1102 write[wp+1]=read[rp+1];
1103 wp+=2;
1104 rp+=2;
1105 ChangeOneIf(write,wp,read,rp);
1106 wp--;
1107 rp--;
1108 continue;
1109 }
1110 if(read[rp]==1&&read[rp+1]==ESC_ELSE) break;
1111
1112 write[wp]=read[rp];
1113 }
1114 write[wp]=':';
1115 write[wp+1]=1;
1116 write[wp+2]=ESC_ENDIF;
1117 wp+=3;
1118}
1119void OutsideIfFormat(char *write,int &wp,char *read,int &rp){
1120 int ElseCount=1;
1121
1122 for(;;rp++,wp++){
1123 if(read[rp]==1){
1124 if(read[rp+1]==ESC_IF){
1125 write[wp++]=read[rp++];
1126 write[wp++]=read[rp++];
1127 OutsideIfFormat(write,wp,read,rp);
1128 wp--,rp--;
1129 continue;
1130 }
1131 if(read[rp+1]==ESC_ENDIF){
1132 for(;ElseCount>0;wp+=3,ElseCount--){
1133 write[wp]=1;
1134 write[wp+1]=ESC_ENDIF;
1135 write[wp+2]=':';
1136 }
1137 rp+=2;
1138 break;
1139 }
1140 if(read[rp+1]==ESC_ELSEIF){
1141 write[wp]=1;
1142 write[wp+1]=ESC_ELSE;
1143 write[wp+2]=':';
1144
1145 write[wp+3]=1;
1146 write[wp+4]=ESC_IF;
1147
1148 wp+=4;
1149 rp++;
1150
1151 ElseCount++;
1152 continue;
1153 }
1154 }
1155
1156 write[wp]=read[rp];
1157 if(read[rp]=='\0') break;
1158 }
1159}
1160void IfCommandFormat(char *buffer){
1161 int i,i2;
1162
1163 char *temporary;
1164 temporary=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)*2+1024);
1165
1166 //1行Ifをブロック形式にする
1167 for(i=0,i2=0;;i++,i2++){
1168 if(buffer[i]==1&&buffer[i+1]==ESC_IF){
1169 temporary[i2++]=buffer[i++];
1170 temporary[i2++]=buffer[i++];
1171 ChangeOneIf(temporary,i2,buffer,i);
1172 i2--,i--;
1173 continue;
1174 }
1175
1176 temporary[i2]=buffer[i];
1177 if(buffer[i]=='\0') break;
1178 }
1179
1180 //ElseIfを入れ子構造に変更する
1181 for(i=0,i2=0;;i++,i2++){
1182 if(temporary[i]==1&&temporary[i+1]==ESC_IF){
1183 buffer[i2++]=temporary[i++];
1184 buffer[i2++]=temporary[i++];
1185 OutsideIfFormat(buffer,i2,temporary,i);
1186 i2--,i--;
1187 continue;
1188 }
1189
1190 buffer[i2]=temporary[i];
1191 if(temporary[i]=='\0') break;
1192 }
1193
1194 HeapDefaultFree(temporary);
1195}
1196void CheckPareCommand(void){
1197 extern char *basbuf;
1198 int i2,i3;
1199
1200 int FuncNum=0;
1201 int FuncType=0;
1202 int FuncPtr=-1;
1203 for(i2=0;;i2++){
1204 if(basbuf[i2]=='\0') break;
1205 if(IsCommandDelimitation(basbuf[i2])){
1206 if(basbuf[i2+1]==1){
1207 i2++;
1208 switch(basbuf[i2+1]){
1209 case ESC_FUNCTION:
1210 case ESC_SUB:
1211 case ESC_MACRO:
1212 if(FuncNum!=0){
1213 if(FuncType==ESC_FUNCTION)
1214 SetError(54,"End Function",FuncPtr);
1215 else if(FuncType==ESC_SUB)
1216 SetError(54,"End Sub",FuncPtr);
1217 else if(FuncType==ESC_MACRO)
1218 SetError(54,"End Macro",FuncPtr);
1219 return;
1220 }
1221 FuncType=basbuf[i2+1];
1222 FuncNum++;
1223 FuncPtr=i2;
1224 break;
1225 case ESC_ENDFUNCTION:
1226 case ESC_ENDSUB:
1227 case ESC_ENDMACRO:
1228 if(basbuf[i2+1]==ESC_ENDFUNCTION) i3=ESC_FUNCTION;
1229 else if(basbuf[i2+1]==ESC_ENDSUB) i3=ESC_SUB;
1230 else if(basbuf[i2+1]==ESC_ENDMACRO) i3=ESC_MACRO;
1231
1232 FuncNum--;
1233
1234 if(FuncNum!=0||i3!=FuncType){
1235 if(basbuf[i2+1]==ESC_ENDFUNCTION)
1236 SetError(12,"End Function",i2);
1237 else if(basbuf[i2+1]==ESC_ENDSUB)
1238 SetError(12,"End Sub",i2);
1239 else if(basbuf[i2+1]==ESC_ENDMACRO)
1240 SetError(12,"End Macro",i2);
1241 return;
1242 }
1243 break;
1244 }
1245 }
1246
1247
1248 }
1249 }
1250}
Note: See TracBrowser for help on using the repository browser.