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

Last change on this file since 765 was 743, checked in by dai, 16 years ago

oldSourceLinesを排除。

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