source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step1.cpp@ 459

Last change on this file since 459 was 459, checked in by dai_9181, 16 years ago

・Compiler::IsDebugメソッドを導入した(bDebugCompileグローバル変数は廃止)。
・bStrictグローバル変数は意味を成さないので廃止した。

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