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

Last change on this file since 636 was 636, checked in by dai_9181, 15 years ago

libファイルを跨ったテンプレート展開に対応。

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