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

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