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

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