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

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

NativeSectionクラスを追加(64bit版だけ一旦コミット)。

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