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

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

・WithInfo周りをリファクタリング。

File size: 19.2 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
[263]18//デバッグ用行番号情報
19SourceLines oldSourceLines;
[4]20
[636]21// オブジェクトモジュールリストに類似したソースコードリスト
22BasicSources sourcesLinkRelationalObjectModule;
[89]23
[263]24
[636]25
[16]26///////////////////////////////////////////////////
[17]27// トークンを取得
28///////////////////////////////////////////////////
[296]29void GetIdentifierToken( char *token, const char *source, int &pos )
30{
[17]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}
[296]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}
[381]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 }
[17]69
[381]70 token[i] = source[pos];
[17]71
[381]72 if( source[pos] == '\0' )
73 {
74 break;
75 }
76 }
77}
78
79
[17]80///////////////////////////////////////////////////
[296]81// ジェネリクスのクラス型記述を分析
82///////////////////////////////////////////////////
[424]83void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters, bool isDefiningClass, Jenga::Common::Strings *pTypeParameterBaseClassNames )
[296]84{
[424]85 if( isDefiningClass )
86 {
87 if( !pTypeParameterBaseClassNames )
88 {
[465]89 compiler.errorMessenger.OutputFatalError();
[424]90 }
91 pTypeParameterBaseClassNames->clear();
92 }
93
[296]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;
[465]115 compiler.errorMessenger.Output(1,NULL,cp);
[296]116 }
117 typeParameters.push_back( temporary );
118
[424]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;
[465]131 compiler.errorMessenger.Output(1,NULL,cp);
[424]132 }
133 }
134 else
135 {
136 temporary[0] = 0;
137 }
138 pTypeParameterBaseClassNames->push_back( temporary );
139 }
140
[296]141 if( fullName[i] == ',' )
142 {
143 continue;
144 }
145 else if( fullName[i] == '>' )
146 {
147 break;
148 }
149 else
150 {
151 extern int cp;
[465]152 compiler.errorMessenger.Output(1,NULL,cp);
[296]153 }
154 }
155 }
156 /////////////////////////////////////////////////////////
157}
158
159
160///////////////////////////////////////////////////
[16]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 );
[465]183 compiler.errorMessenger.Output( 22, temporary, pos );
[16]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
[372]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 );
[438]202 cp = backCp;
[372]203 ChangeOpcode( temporary );
204 cp = backCp;
205 free( temporary );
206}
207
[4]208void ChangeOpcode(char *Command){
209 extern HANDLE hHeap;
210
[206]211 if(Command[0]=='\0')
212 {
213 return;
214 }
215
216 trace_for_sourcecodestep( FormatEscapeSequenceStringToDefaultString(Command) );
217
[4]218 if(Command[0]=='*'&&IsVariableTopChar(Command[1])){
219 //Goto先ラベル
[276]220 compiler.codeGenerator.gotoLabels.push_back( GotoLabel( Command + 1, compiler.codeGenerator.GetNativeCodeSize() ) );
[4]221
222 //書き込みスケジュール
[253]223 GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
[246]224 while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
225 {
[253]226 if( (*it)->GetName() == Command+1 )
[246]227 {
[253]228 compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
[246]229
[4]230 //詰める
[246]231 it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
[4]232 }
[246]233 else
234 {
235 it++;
236 }
[4]237 }
238 return;
239 }
240 if(Command[0]==1){
241 switch(Command[1]){
242 case ESC_CONST:
[7]243 OpcodeDim(Command+2, DIMFLAG_CONST);
244 break;
245
[4]246 case ESC_TYPEDEF:
[537]247 if( compiler.IsLocalAreaCompiling() ){
[113]248 // ローカル領域をコンパイルしているとき
[465]249 compiler.errorMessenger.Output(65,"TypeDef",cp );
[113]250 }
251
[78]252 //既に収集済み
[4]253 break;
254
[322]255 case ESC_DELEGATE:
[537]256 if( compiler.IsLocalAreaCompiling() ){
[322]257 // ローカル領域をコンパイルしているとき
[465]258 compiler.errorMessenger.Output(65,"Delegate",cp );
[322]259 }
260
261 //既に収集済み
262 break;
263
[4]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:
[182]272 {
[248]273 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_WHILE );
[182]274 if( !pScope ){
[465]275 compiler.errorMessenger.Output(12,"Exit While",cp);
[182]276 return;
277 }
278 pScope->Break();
279 }
[4]280 break;
281 case ESC_EXITFOR:
[182]282 {
[248]283 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_FOR );
[182]284 if( !pScope ){
[465]285 compiler.errorMessenger.Output(12,"Exit For",cp);
[182]286 return;
287 }
288 pScope->Break();
289 }
[4]290 break;
291 case ESC_EXITDO:
[182]292 {
[248]293 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_DO );
[182]294 if( !pScope ){
[465]295 compiler.errorMessenger.Output(12,"Exit Do",cp);
[182]296 return;
297 }
298 pScope->Break();
299 }
[4]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:
[684]320 {
321 extern WithInfos withInfos;
322 withInfos.push_back( WithInfo( Command+2, cp ) );
323 break;
324 }
325 case ESC_ENDWITH:
326 {
327 extern WithInfos withInfos;
328 if( withInfos.size() <= 0 )
329 {
330 compiler.errorMessenger.Output(12,"End With",cp);
331 return;
332 }
[4]333
[684]334 withInfos.pop_back();
335 break;
[4]336 }
337 case ESC_DECLARE:
[537]338 if( compiler.IsLocalAreaCompiling() ){
[113]339 // ローカル領域をコンパイルしているとき
[465]340 compiler.errorMessenger.Output(65,"Declare",cp );
[113]341 }
[4]342 break;
[26]343
[99]344 case ESC_NAMESPACE:
[199]345 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().push_back( Command + 2 );
[103]346 break;
[99]347 case ESC_ENDNAMESPACE:
[199]348 if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() <= 0 ){
[465]349 compiler.errorMessenger.Output(12,"End Namespace",cp);
[103]350 }
[199]351 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().pop_back();
[99]352 break;
[107]353 case ESC_IMPORTS:
[199]354 compiler.GetNamespaceSupporter().ImportsNamespace( Command + 2 );
[107]355 break;
356 case ESC_CLEARNAMESPACEIMPORTED:
[668]357 // Imports情報のクリア
358 compiler.GetNamespaceSupporter().ClearImportedNamespaces();
[107]359 break;
[99]360
[26]361 //Tryによる例外処理
362 case ESC_TRY:
363 Exception::TryCommand();
364 break;
365 case ESC_CATCH:
[359]366 Exception::CatchCommand( Command + 2 );
[26]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
[4]378 default:
379 char temporary[64];
380 GetDefaultNameFromES(Command[1],temporary);
[465]381 compiler.errorMessenger.Output(30,temporary,cp);
[4]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:
[64]391 OpcodeDelete(Command+2, false);
[4]392 break;
[64]393 case COM_SWEEPINGDELETE:
394 OpcodeDelete(Command+2, true);
395 break;
[4]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;
[372]406 case COM_FOREACH:
407 OpcodeForeach(Command+2);
408 break;
[4]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
[459]441 if( compiler.IsDebug() )
[253]442 {
443 breakpoint;
444 }
445 else
446 {
[263]447//#if defined(_DEBUG)
[253]448 breakpoint;
[263]449//#endif
[253]450 }
[4]451 break;
452
453 case COM_LET:
454 OpcodeCalc(Command+2);
[435]455
[4]456 break;
457 default:
458 OpcodeOthers(Command);
[435]459
460 // コード生成過程で発生した構造体の一時メモリを破棄する
461 compiler.codeGenerator.op_FreeTempStructure();
462
[4]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'){
[465]503 compiler.errorMessenger.Output(22,"Sub",i2);
[4]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'){
[465]517 compiler.errorMessenger.Output(22,"Function",i2);
[4]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'){
[465]531 compiler.errorMessenger.Output(22,"Macro",i2);
[4]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'){
[465]545 compiler.errorMessenger.Output(22,"Type",i2);
[4]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'){
[465]559 compiler.errorMessenger.Output(22,"Class",i2);
[4]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'){
[465]573 compiler.errorMessenger.Output(22,"Interface",i2);
[4]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);
[15]608
[4]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先ラベル
[276]643 compiler.codeGenerator.gotoLabels.push_back( GotoLabel( (long)i3, compiler.codeGenerator.GetNativeCodeSize() ) );
[4]644
645 //書き込みスケジュール
[253]646 GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
[246]647 while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
648 {
[253]649 if( (*it)->GetName().size() == 0 && (*it)->GetLineNum() == i3 )
[246]650 {
[253]651 compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
652
[4]653 //詰める
[246]654 it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
[4]655 }
[246]656 else
657 {
658 it++;
659 }
[4]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){
[465]687 compiler.errorMessenger.Output(12,temporary,cp);
[4]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);
[465]704 compiler.errorMessenger.Output(12,temp3,cp);
[4]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);
[465]719 compiler.errorMessenger.Output(12,temp3,cp);
[4]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
[641]748 if( basbuf[cp] != '\0' )
749 {
750 compiler.codeGenerator.NextSourceLine(
751 SourceCodePosition( compiler.GetCurrentRelationalObjectModuleIndexForSource(), cp ),
752 compiler.GetCompilingUserProc().IsSystem()
753 );
754 }
[4]755
756 if(Command[0]==1){
757 if(Return_Sequence==ESC_ENDIF&&Command[1]==ESC_ELSE){
758 dwRetCode=ESC_ELSE;
759 break;
760 }
761
762 if(Command[1]==Return_Sequence){
763 dwRetCode=Command[1];
764 break;
765 }
766 }
767
[632]768 if( Command[0] )
769 {
770 ChangeOpcode(Command);
771 }
[4]772
[232]773
[4]774 epi_check();
775
[232]776
[4]777 //コンパイルを中断するとき
778 extern BOOL bStopCompile;
779 if(bStopCompile) return 0;
780
781 if(basbuf[cp]=='\0'){
782 switch(Return_Command){
783 case COM_WEND:
[465]784 compiler.errorMessenger.Output(4,"\"While\" - \"Wend\" ",ScopeStart);
[4]785 break;
786 case COM_NEXT:
[465]787 compiler.errorMessenger.Output(4,"\"For\" - \"Next\" ",ScopeStart);
[4]788 break;
789 case COM_LOOP:
[465]790 compiler.errorMessenger.Output(4,"\"Do\" - \"Loop\" ",ScopeStart);
[4]791 break;
792 }
793 switch(Return_Sequence){
794 case ESC_ENDSUB:
[465]795 compiler.errorMessenger.Output(4,"\"Sub\" - \"End Sub\" ",ScopeStart);
[4]796 break;
797 case ESC_ENDFUNCTION:
[465]798 compiler.errorMessenger.Output(4,"\"Function\" - \"End Function\" ",ScopeStart);
[4]799 break;
800 case ESC_ENDMACRO:
[465]801 compiler.errorMessenger.Output(4,"\"Macro\" - \"End Macro\" ",ScopeStart);
[4]802 break;
803 case ESC_ENDIF:
[465]804 compiler.errorMessenger.Output(22,"If",ScopeStart);
[4]805 break;
806 }
807 break;
808 }
809 i2=-1;
810 continue;
811 }
812 Command[i2]=basbuf[cp];
813 }
814 HeapDefaultFree(Command);
815
816 return dwRetCode;
817}
Note: See TracBrowser for help on using the repository browser.