source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/Compile.cpp@ 507

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

NamespaceSupporterクラスをab_commonプロジェクトに移動した。

File size: 19.2 KB
Line 
1#include "stdafx.h"
2
3#include <LexicalScope.h>
4#include <CodeGenerator.h>
5#include <Compiler.h>
6
7#include "../BasicCompiler_Common/common.h"
8
9#ifdef _AMD64_
10#include "../compiler_x64/opcode.h"
11#else
12#include "../compiler_x86/opcode.h"
13#endif
14
15#include <Exception.h>
16
17//With情報
18WITHINFO WithInfo;
19
20//デバッグ用行番号情報
21SourceLines oldSourceLines;
22
23
24
25///////////////////////////////////////////////////
26// トークンを取得
27///////////////////////////////////////////////////
28void GetIdentifierToken( char *token, const char *source, int &pos )
29{
30 for( int i=0; ; i++, pos++ ){
31 if( ! IsVariableChar( source[pos] ) ){
32 token[i] = 0;
33 break;
34 }
35 token[i] = source[pos];
36 }
37}
38void GetCommandToken( char *token, const char *source, int &pos )
39{
40 for( int i=0; ; i++, pos++ ){
41 if( IsCommandDelimitation( source[pos] ) ){
42 token[i] = 0;
43 break;
44 }
45 token[i] = source[pos];
46 }
47}
48void GetCustomToken( char *token, const char *source, int &pos, char delimitation, bool isEscapeSequence )
49{
50 for( int i=0; ; i++, pos++ ){
51 if( isEscapeSequence )
52 {
53 if( source[pos] == 1 && source[pos+1] == delimitation )
54 {
55 token[i] = 0;
56 pos++;
57 break;
58 }
59 }
60 else
61 {
62 if( source[pos] == delimitation )
63 {
64 token[i] = 0;
65 break;
66 }
67 }
68
69 token[i] = source[pos];
70
71 if( source[pos] == '\0' )
72 {
73 break;
74 }
75 }
76}
77
78
79///////////////////////////////////////////////////
80// ジェネリクスのクラス型記述を分析
81///////////////////////////////////////////////////
82void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters, bool isDefiningClass, Jenga::Common::Strings *pTypeParameterBaseClassNames )
83{
84 if( isDefiningClass )
85 {
86 if( !pTypeParameterBaseClassNames )
87 {
88 compiler.errorMessenger.OutputFatalError();
89 }
90 pTypeParameterBaseClassNames->clear();
91 }
92
93 int i = 0;
94 typeParameters.clear();
95
96 //クラス名を取得
97 GetIdentifierToken( className, fullName, i );
98
99
100 /////////////////////////////////////////////////////////
101 // ☆★☆ ジェネリクスサポート ☆★☆
102 if( fullName[i] == '<' )
103 {
104 while( true )
105 {
106 i++;
107
108 // 型パラメータを取得
109 char temporary[VN_SIZE];
110 GetIdentifierToken( temporary, fullName, i );
111 if( temporary[0] == '\0' )
112 {
113 extern int cp;
114 compiler.errorMessenger.Output(1,NULL,cp);
115 }
116 typeParameters.push_back( temporary );
117
118 if( isDefiningClass )
119 {
120 // クラス定義中にこの関数が呼び出されたとき
121
122 if( fullName[i] == 1 && fullName[i+1] == ESC_AS )
123 {
124 // 型パラメータの制約クラスを取得
125 i += 2;
126 GetIdentifierToken( temporary, fullName, i );
127 if( temporary[0] == '\0' )
128 {
129 extern int cp;
130 compiler.errorMessenger.Output(1,NULL,cp);
131 }
132 }
133 else
134 {
135 temporary[0] = 0;
136 }
137 pTypeParameterBaseClassNames->push_back( temporary );
138 }
139
140 if( fullName[i] == ',' )
141 {
142 continue;
143 }
144 else if( fullName[i] == '>' )
145 {
146 break;
147 }
148 else
149 {
150 extern int cp;
151 compiler.errorMessenger.Output(1,NULL,cp);
152 }
153 }
154 }
155 /////////////////////////////////////////////////////////
156}
157
158
159///////////////////////////////////////////////////
160// 対になっているステートメントを飛び越す
161// ※グローバル領域用
162///////////////////////////////////////////////////
163int JumpStatement(const char *source, int &pos){
164 if( source[pos] != 1 ) return 0;
165
166 if( ! IsCommandDelimitation( source[pos - 1] ) ){
167 //直前がコマンド区切りではない場合
168 return 0;
169 }
170
171 char cStatement = source[pos + 1];
172
173 char cEnd = GetEndXXXCommand( cStatement );
174 if( cEnd == 0 ) return 0;
175
176 pos += 2;
177 while( ! ( source[pos] == 1 && source[pos + 1] == cEnd ) ){
178
179 if( source[pos] == '\0' ){
180 char temporary[64];
181 GetDefaultNameFromES( cStatement, temporary );
182 compiler.errorMessenger.Output( 22, temporary, pos );
183 return -1;
184 }
185
186 pos++;
187 }
188 if( ! ( source[pos] == '\0' || source[pos + 2] == '\0' ) ){
189 pos += 2;
190 }
191
192 return 1;
193}
194
195void Compile( const char *source )
196{
197 char *temporary = (char *)malloc( lstrlen( source ) + 8192 );
198 lstrcpy( temporary, source );
199 int backCp = cp;
200 MakeMiddleCode( temporary );
201 cp = backCp;
202 ChangeOpcode( temporary );
203 cp = backCp;
204 free( temporary );
205}
206
207void ChangeOpcode(char *Command){
208 extern HANDLE hHeap;
209
210 if(Command[0]=='\0')
211 {
212 return;
213 }
214
215 trace_for_sourcecodestep( FormatEscapeSequenceStringToDefaultString(Command) );
216
217 if(Command[0]=='*'&&IsVariableTopChar(Command[1])){
218 //Goto先ラベル
219 compiler.codeGenerator.gotoLabels.push_back( GotoLabel( Command + 1, compiler.codeGenerator.GetNativeCodeSize() ) );
220
221 //書き込みスケジュール
222 GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
223 while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
224 {
225 if( (*it)->GetName() == Command+1 )
226 {
227 compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
228
229 //詰める
230 it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
231 }
232 else
233 {
234 it++;
235 }
236 }
237 return;
238 }
239 if(Command[0]==1){
240 switch(Command[1]){
241 case ESC_CONST:
242 OpcodeDim(Command+2, DIMFLAG_CONST);
243 break;
244
245 case ESC_TYPEDEF:
246 if( UserProc::IsLocalAreaCompiling() ){
247 // ローカル領域をコンパイルしているとき
248 compiler.errorMessenger.Output(65,"TypeDef",cp );
249 }
250
251 //既に収集済み
252 break;
253
254 case ESC_DELEGATE:
255 if( UserProc::IsLocalAreaCompiling() ){
256 // ローカル領域をコンパイルしているとき
257 compiler.errorMessenger.Output(65,"Delegate",cp );
258 }
259
260 //既に収集済み
261 break;
262
263 case ESC_STATIC:
264 OpcodeDim(Command+2,DIMFLAG_STATIC);
265 break;
266
267 case ESC_IF:
268 OpcodeIf(Command+2);
269 break;
270 case ESC_EXITWHILE:
271 {
272 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_WHILE );
273 if( !pScope ){
274 compiler.errorMessenger.Output(12,"Exit While",cp);
275 return;
276 }
277 pScope->Break();
278 }
279 break;
280 case ESC_EXITFOR:
281 {
282 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_FOR );
283 if( !pScope ){
284 compiler.errorMessenger.Output(12,"Exit For",cp);
285 return;
286 }
287 pScope->Break();
288 }
289 break;
290 case ESC_EXITDO:
291 {
292 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_DO );
293 if( !pScope ){
294 compiler.errorMessenger.Output(12,"Exit Do",cp);
295 return;
296 }
297 pScope->Break();
298 }
299 break;
300 case ESC_CONTINUE:
301 OpcodeContinue();
302 break;
303
304 case ESC_EXITSUB:
305 case ESC_EXITFUNCTION:
306 case ESC_EXITMACRO:
307 OpcodeExitSub();
308 break;
309
310 case ESC_SELECTCASE:
311 OpcodeSelect(Command+2);
312 break;
313 case ESC_CASE:
314 case ESC_CASEELSE:
315 OpcodeCase(Command+2);
316 break;
317
318 case ESC_WITH:
319 extern WITHINFO WithInfo;
320
321 WithInfo.ppName=(char **)HeapReAlloc(hHeap,0,WithInfo.ppName,(WithInfo.num+1)*sizeof(char **));
322 WithInfo.ppName[WithInfo.num]=(char *)HeapAlloc(hHeap,0,lstrlen(Command+2)+1);
323 lstrcpy(WithInfo.ppName[WithInfo.num],Command+2);
324
325 WithInfo.pWithCp=(int *)HeapReAlloc(hHeap,0,WithInfo.pWithCp,(WithInfo.num+1)*sizeof(int));
326 WithInfo.pWithCp[WithInfo.num]=cp;
327
328 WithInfo.num++;
329 break;
330 case ESC_ENDWITH:
331 if(WithInfo.num<=0){
332 compiler.errorMessenger.Output(12,"End With",cp);
333 return;
334 }
335 WithInfo.num--;
336 HeapDefaultFree(WithInfo.ppName[WithInfo.num]);
337 break;
338 case ESC_DECLARE:
339 if( UserProc::IsLocalAreaCompiling() ){
340 // ローカル領域をコンパイルしているとき
341 compiler.errorMessenger.Output(65,"Declare",cp );
342 }
343 break;
344
345 case ESC_NAMESPACE:
346 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().push_back( Command + 2 );
347 break;
348 case ESC_ENDNAMESPACE:
349 if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() <= 0 ){
350 compiler.errorMessenger.Output(12,"End Namespace",cp);
351 }
352 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().pop_back();
353 break;
354 case ESC_IMPORTS:
355 compiler.GetNamespaceSupporter().ImportsNamespace( Command + 2 );
356 break;
357 case ESC_CLEARNAMESPACEIMPORTED:
358 compiler.GetNamespaceSupporter().GetImportedNamespaces().clear();
359 break;
360
361 //Tryによる例外処理
362 case ESC_TRY:
363 Exception::TryCommand();
364 break;
365 case ESC_CATCH:
366 Exception::CatchCommand( Command + 2 );
367 break;
368 case ESC_FINALLY:
369 Exception::FinallyCommand();
370 break;
371 case ESC_ENDTRY:
372 Exception::EndTryCommand();
373 break;
374 case ESC_THROW:
375 Exception::ThrowCommand( Command + 2 );
376 break;
377
378 default:
379 char temporary[64];
380 GetDefaultNameFromES(Command[1],temporary);
381 compiler.errorMessenger.Output(30,temporary,cp);
382 break;
383 }
384 return;
385 }
386 switch(MAKEWORD(Command[1],Command[0])){
387 case COM_DIM:
388 OpcodeDim(Command+2,0);
389 break;
390 case COM_DELETE:
391 OpcodeDelete(Command+2, false);
392 break;
393 case COM_SWEEPINGDELETE:
394 OpcodeDelete(Command+2, true);
395 break;
396
397 case COM_GOTO:
398 OpcodeGoto(Command+2);
399 break;
400 case COM_WHILE:
401 OpcodeWhile(Command+2);
402 break;
403 case COM_FOR:
404 OpcodeFor(Command+2);
405 break;
406 case COM_FOREACH:
407 OpcodeForeach(Command+2);
408 break;
409 case COM_DO:
410 OpcodeDo(Command+2);
411 break;
412
413 case COM_GOSUB:
414 OpcodeGosub(Command+2);
415 break;
416 case COM_RETURN:
417 OpcodeReturn(Command+2);
418 break;
419
420 case COM_SETDOUBLE:
421 OpcodeSetPtrData(Command+2,DEF_DOUBLE);
422 break;
423 case COM_SETSINGLE:
424 OpcodeSetPtrData(Command+2,DEF_SINGLE);
425 break;
426 case COM_SETQWORD:
427 OpcodeSetPtrData(Command+2,DEF_QWORD);
428 break;
429 case COM_SETDWORD:
430 OpcodeSetPtrData(Command+2,DEF_DWORD);
431 break;
432 case COM_SETWORD:
433 OpcodeSetPtrData(Command+2,DEF_WORD);
434 break;
435 case COM_SETBYTE:
436 OpcodeSetPtrData(Command+2,DEF_BYTE);
437 break;
438
439 case COM_DEBUG:
440 //int 3
441 if( compiler.IsDebug() )
442 {
443 breakpoint;
444 }
445 else
446 {
447//#if defined(_DEBUG)
448 breakpoint;
449//#endif
450 }
451 break;
452
453 case COM_LET:
454 OpcodeCalc(Command+2);
455
456 break;
457 default:
458 OpcodeOthers(Command);
459
460 // コード生成過程で発生した構造体の一時メモリを破棄する
461 compiler.codeGenerator.op_FreeTempStructure();
462
463 break;
464 }
465}
466
467void GetGlobalDataForDll(void){
468 extern char *basbuf;
469 extern HANDLE hHeap;
470 int i2,BufferSize;
471 char *Command;
472 DWORD dwRetCode;
473
474 dwRetCode=0;
475 BufferSize=128;
476 Command=(char *)HeapAlloc(hHeap,0,BufferSize);
477 for(cp++,i2=0;;cp++,i2++){
478 if(i2>=BufferSize){
479 //バッファ領域が足りなくなった場合はバッファを増量する
480 BufferSize+=128;
481 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
482 }
483 if(basbuf[cp]=='\"'){
484 Command[i2]=basbuf[cp];
485 for(cp++,i2++;;cp++,i2++){
486 if(i2>=BufferSize){
487 //バッファ領域が足りなくなった場合はバッファを増量する
488 BufferSize+=128;
489 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
490 }
491 Command[i2]=basbuf[cp];
492 if(basbuf[cp]=='\"') break;
493 }
494 continue;
495 }
496 if(IsCommandDelimitation(basbuf[cp])){
497 Command[i2]=0;
498
499 if(Command[0]==1&&Command[1]==ESC_SUB){
500 i2=cp;
501 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDSUB)){
502 if(basbuf[cp]=='\0'){
503 compiler.errorMessenger.Output(22,"Sub",i2);
504 break;
505 }
506 cp++;
507 }
508 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
509 cp+=2;
510 i2=-1;
511 continue;
512 }
513 if(Command[0]==1&&Command[1]==ESC_FUNCTION){
514 i2=cp;
515 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDFUNCTION)){
516 if(basbuf[cp]=='\0'){
517 compiler.errorMessenger.Output(22,"Function",i2);
518 break;
519 }
520 cp++;
521 }
522 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
523 cp+=2;
524 i2=-1;
525 continue;
526 }
527 if(Command[0]==1&&Command[1]==ESC_MACRO){
528 i2=cp;
529 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDMACRO)){
530 if(basbuf[cp]=='\0'){
531 compiler.errorMessenger.Output(22,"Macro",i2);
532 break;
533 }
534 cp++;
535 }
536 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
537 cp+=2;
538 i2=-1;
539 continue;
540 }
541 if(Command[0]==1&&Command[1]==ESC_TYPE){
542 i2=cp;
543 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDTYPE)){
544 if(basbuf[cp]=='\0'){
545 compiler.errorMessenger.Output(22,"Type",i2);
546 break;
547 }
548 cp++;
549 }
550 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
551 cp+=2;
552 i2=-1;
553 continue;
554 }
555 if(Command[0]==1&&Command[1]==ESC_CLASS){
556 i2=cp;
557 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDCLASS)){
558 if(basbuf[cp]=='\0'){
559 compiler.errorMessenger.Output(22,"Class",i2);
560 break;
561 }
562 cp++;
563 }
564 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
565 cp+=2;
566 i2=-1;
567 continue;
568 }
569 if(Command[0]==1&&Command[1]==ESC_INTERFACE){
570 i2=cp;
571 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDINTERFACE)){
572 if(basbuf[cp]=='\0'){
573 compiler.errorMessenger.Output(22,"Interface",i2);
574 break;
575 }
576 cp++;
577 }
578 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
579 cp+=2;
580 i2=-1;
581 continue;
582 }
583
584 //DLLのグローバルデータに必要なコマンドだけ
585 if(MAKEWORD(Command[1],Command[0])==COM_DIM)
586 OpcodeDim(Command+2,0);
587
588 if(basbuf[cp]=='\0') break;
589 i2=-1;
590 continue;
591 }
592 Command[i2]=basbuf[cp];
593 }
594 HeapDefaultFree(Command);
595}
596DWORD CompileBuffer(char Return_Sequence,WORD Return_Command){
597 extern char *basbuf;
598 extern HANDLE hHeap;
599 int i,i2,i3,i4,BufferSize,ScopeStart;
600 char *Command,temporary[VN_SIZE],*temp2,temp3[32];
601 DWORD dwRetCode;
602
603 ScopeStart=cp;
604
605 dwRetCode=0;
606 BufferSize=128;
607 Command=(char *)HeapAlloc(hHeap,0,BufferSize);
608
609 for(cp++,i2=0;;cp++,i2++){
610 if(i2>=BufferSize){
611 //バッファ領域が足りなくなった場合はバッファを増量する
612 BufferSize+=128;
613 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
614 }
615 if(basbuf[cp]=='\"'){
616 Command[i2]=basbuf[cp];
617 for(cp++,i2++;;cp++,i2++){
618 if(i2>=BufferSize){
619 //バッファ領域が足りなくなった場合はバッファを増量する
620 BufferSize+=128;
621 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
622 }
623 Command[i2]=basbuf[cp];
624 if(basbuf[cp]=='\"') break;
625 }
626 continue;
627 }
628 if(IsCommandDelimitation(basbuf[cp])){
629 Command[i2]=0;
630
631 if(Command[0]==1&&Command[1]==ESC_LINENUM){
632 for(i=2,i2=0;;i++,i2++){
633 if(Command[i]==','){
634 temporary[i2]=0;
635 break;
636 }
637 temporary[i2]=Command[i];
638 }
639 i3=atoi(temporary);
640 i4=i+1;
641
642 //Goto先ラベル
643 compiler.codeGenerator.gotoLabels.push_back( GotoLabel( (long)i3, compiler.codeGenerator.GetNativeCodeSize() ) );
644
645 //書き込みスケジュール
646 GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
647 while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
648 {
649 if( (*it)->GetName().size() == 0 && (*it)->GetLineNum() == i3 )
650 {
651 compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
652
653 //詰める
654 it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
655 }
656 else
657 {
658 it++;
659 }
660 }
661
662 temp2=(char *)HeapAlloc(hHeap,0,lstrlen(Command+i4)+1);
663 lstrcpy(temp2,Command+i4);
664 lstrcpy(Command,temp2);
665 HeapDefaultFree(temp2);
666 }
667
668 if(Command[0]==1&&
669 (((Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE)&&Command[2]==1&&(Command[3]==ESC_SUB||Command[3]==ESC_FUNCTION))||
670 Command[1]==ESC_SUB||
671 Command[1]==ESC_FUNCTION||
672 Command[1]==ESC_MACRO||
673 Command[1]==ESC_TYPE||
674 Command[1]==ESC_CLASS||
675 Command[1]==ESC_INTERFACE||
676 Command[1]==ESC_ENUM||
677 (Command[1]==ESC_CONST&&Command[2]==1&&Command[3]==ESC_ENUM)
678 )
679 ){
680 if(Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE||Command[1]==ESC_CONST){
681 GetDefaultNameFromES(Command[3],temporary);
682 }
683 else{
684 GetDefaultNameFromES(Command[1],temporary);
685 }
686 if(Return_Sequence){
687 compiler.errorMessenger.Output(12,temporary,cp);
688 break;
689 }
690
691 if(Command[1]==ESC_CONST) i3=GetEndXXXCommand(Command[3]);
692 else i3=GetEndXXXCommand(Command[1]);
693 for(i2=cp;;cp++){
694 if(basbuf[cp]==1){
695 if(basbuf[cp+1]==i3) break;
696 if(Command[1]==ESC_CLASS||Command[1]==ESC_INTERFACE){
697 //クラス、インターフェイスではSub、Functionの定義を可能にしておく
698 if(basbuf[cp+1]==ESC_MACRO||
699 basbuf[cp+1]==ESC_TYPE||
700 basbuf[cp+1]==ESC_CLASS||
701 basbuf[cp+1]==ESC_INTERFACE||
702 basbuf[cp+1]==ESC_ENUM){
703 GetDefaultNameFromES(basbuf[cp+1],temp3);
704 compiler.errorMessenger.Output(12,temp3,cp);
705 }
706 }
707 else{
708 if(basbuf[cp-1]!='*'&&(
709 basbuf[cp+1]==ESC_VIRTUAL||
710 basbuf[cp+1]==ESC_OVERRIDE||
711 basbuf[cp+1]==ESC_SUB||
712 basbuf[cp+1]==ESC_FUNCTION||
713 basbuf[cp+1]==ESC_MACRO||
714 basbuf[cp+1]==ESC_TYPE||
715 basbuf[cp+1]==ESC_CLASS||
716 basbuf[cp+1]==ESC_INTERFACE||
717 basbuf[cp+1]==ESC_ENUM)){
718 GetDefaultNameFromES(basbuf[cp+1],temp3);
719 compiler.errorMessenger.Output(12,temp3,cp);
720 }
721 }
722 }
723 if(basbuf[cp]=='\0'){
724 //error
725 //既にエラー発行済みのため、何もせずに抜ける
726 break;
727 }
728 }
729 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
730 cp+=2;
731 i2=-1;
732 continue;
733 }
734
735 if(Command[0]==0x10||Command[0]==0x11){
736 //Wend、Next、Loopなど
737 if(Return_Command==MAKEWORD(Command[1],Command[0])){
738 if(Return_Command==COM_NEXT){
739 //Nextの場合は、パラメータ(省略化)の整合性を判断する必要がある(OpcodeFor関数を参照)
740 extern char szNextVariable[VN_SIZE];
741 if(Command[2]) lstrcpy(szNextVariable,Command+2);
742 else szNextVariable[0]=0;
743 }
744 break;
745 }
746 }
747
748 compiler.codeGenerator.NextSourceLine();
749
750 if(Command[0]==1){
751 if(Return_Sequence==ESC_ENDIF&&Command[1]==ESC_ELSE){
752 dwRetCode=ESC_ELSE;
753 break;
754 }
755
756 if(Command[1]==Return_Sequence){
757 dwRetCode=Command[1];
758 break;
759 }
760 }
761
762 ChangeOpcode(Command);
763
764
765 epi_check();
766
767
768 //コンパイルを中断するとき
769 extern BOOL bStopCompile;
770 if(bStopCompile) return 0;
771
772 if(basbuf[cp]=='\0'){
773 switch(Return_Command){
774 case COM_WEND:
775 compiler.errorMessenger.Output(4,"\"While\" - \"Wend\" ",ScopeStart);
776 break;
777 case COM_NEXT:
778 compiler.errorMessenger.Output(4,"\"For\" - \"Next\" ",ScopeStart);
779 break;
780 case COM_LOOP:
781 compiler.errorMessenger.Output(4,"\"Do\" - \"Loop\" ",ScopeStart);
782 break;
783 }
784 switch(Return_Sequence){
785 case ESC_ENDSUB:
786 compiler.errorMessenger.Output(4,"\"Sub\" - \"End Sub\" ",ScopeStart);
787 break;
788 case ESC_ENDFUNCTION:
789 compiler.errorMessenger.Output(4,"\"Function\" - \"End Function\" ",ScopeStart);
790 break;
791 case ESC_ENDMACRO:
792 compiler.errorMessenger.Output(4,"\"Macro\" - \"End Macro\" ",ScopeStart);
793 break;
794 case ESC_ENDIF:
795 compiler.errorMessenger.Output(22,"If",ScopeStart);
796 break;
797 }
798 break;
799 }
800 i2=-1;
801 continue;
802 }
803 Command[i2]=basbuf[cp];
804 }
805 HeapDefaultFree(Command);
806
807 return dwRetCode;
808}
Note: See TracBrowser for help on using the repository browser.