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

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

プロジェクトのリネーム中

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>
[195]6#include <NamespaceSupporter.h>
[182]7
[4]8#include "../BasicCompiler_Common/common.h"
9
10#ifdef _AMD64_
11#include "../BasicCompiler64/opcode.h"
12#else
[484]13#include "../compiler_x86/opcode.h"
[4]14#endif
15
[182]16#include <Exception.h>
17
[4]18//With情報
19WITHINFO WithInfo;
20
[263]21//デバッグ用行番号情報
22SourceLines oldSourceLines;
[4]23
[89]24
[263]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:
[113]247 if( UserProc::IsLocalAreaCompiling() ){
248 // ローカル領域をコンパイルしているとき
[465]249 compiler.errorMessenger.Output(65,"TypeDef",cp );
[113]250 }
251
[78]252 //既に収集済み
[4]253 break;
254
[322]255 case ESC_DELEGATE:
256 if( UserProc::IsLocalAreaCompiling() ){
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:
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){
[465]333 compiler.errorMessenger.Output(12,"End With",cp);
[4]334 return;
335 }
336 WithInfo.num--;
337 HeapDefaultFree(WithInfo.ppName[WithInfo.num]);
338 break;
339 case ESC_DECLARE:
[113]340 if( UserProc::IsLocalAreaCompiling() ){
341 // ローカル領域をコンパイルしているとき
[465]342 compiler.errorMessenger.Output(65,"Declare",cp );
[113]343 }
[4]344 break;
[26]345
[99]346 case ESC_NAMESPACE:
[199]347 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().push_back( Command + 2 );
[103]348 break;
[99]349 case ESC_ENDNAMESPACE:
[199]350 if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() <= 0 ){
[465]351 compiler.errorMessenger.Output(12,"End Namespace",cp);
[103]352 }
[199]353 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().pop_back();
[99]354 break;
[107]355 case ESC_IMPORTS:
[199]356 compiler.GetNamespaceSupporter().ImportsNamespace( Command + 2 );
[107]357 break;
358 case ESC_CLEARNAMESPACEIMPORTED:
[199]359 compiler.GetNamespaceSupporter().GetImportedNamespaces().clear();
[107]360 break;
[99]361
[26]362 //Tryによる例外処理
363 case ESC_TRY:
364 Exception::TryCommand();
365 break;
366 case ESC_CATCH:
[359]367 Exception::CatchCommand( Command + 2 );
[26]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
[4]379 default:
380 char temporary[64];
381 GetDefaultNameFromES(Command[1],temporary);
[465]382 compiler.errorMessenger.Output(30,temporary,cp);
[4]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:
[64]392 OpcodeDelete(Command+2, false);
[4]393 break;
[64]394 case COM_SWEEPINGDELETE:
395 OpcodeDelete(Command+2, true);
396 break;
[4]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;
[372]407 case COM_FOREACH:
408 OpcodeForeach(Command+2);
409 break;
[4]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
[459]442 if( compiler.IsDebug() )
[253]443 {
444 breakpoint;
445 }
446 else
447 {
[263]448//#if defined(_DEBUG)
[253]449 breakpoint;
[263]450//#endif
[253]451 }
[4]452 break;
453
454 case COM_LET:
455 OpcodeCalc(Command+2);
[435]456
[4]457 break;
458 default:
459 OpcodeOthers(Command);
[435]460
461 // コード生成過程で発生した構造体の一時メモリを破棄する
462 compiler.codeGenerator.op_FreeTempStructure();
463
[4]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'){
[465]504 compiler.errorMessenger.Output(22,"Sub",i2);
[4]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'){
[465]518 compiler.errorMessenger.Output(22,"Function",i2);
[4]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'){
[465]532 compiler.errorMessenger.Output(22,"Macro",i2);
[4]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'){
[465]546 compiler.errorMessenger.Output(22,"Type",i2);
[4]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'){
[465]560 compiler.errorMessenger.Output(22,"Class",i2);
[4]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'){
[465]574 compiler.errorMessenger.Output(22,"Interface",i2);
[4]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);
[15]609
[4]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先ラベル
[276]644 compiler.codeGenerator.gotoLabels.push_back( GotoLabel( (long)i3, compiler.codeGenerator.GetNativeCodeSize() ) );
[4]645
646 //書き込みスケジュール
[253]647 GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
[246]648 while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
649 {
[253]650 if( (*it)->GetName().size() == 0 && (*it)->GetLineNum() == i3 )
[246]651 {
[253]652 compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
653
[4]654 //詰める
[246]655 it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
[4]656 }
[246]657 else
658 {
659 it++;
660 }
[4]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){
[465]688 compiler.errorMessenger.Output(12,temporary,cp);
[4]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);
[465]705 compiler.errorMessenger.Output(12,temp3,cp);
[4]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);
[465]720 compiler.errorMessenger.Output(12,temp3,cp);
[4]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
[263]749 compiler.codeGenerator.NextSourceLine();
[4]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
[461]763 ChangeOpcode(Command);
[4]764
[232]765
[4]766 epi_check();
767
[232]768
[4]769 //コンパイルを中断するとき
770 extern BOOL bStopCompile;
771 if(bStopCompile) return 0;
772
773 if(basbuf[cp]=='\0'){
774 switch(Return_Command){
775 case COM_WEND:
[465]776 compiler.errorMessenger.Output(4,"\"While\" - \"Wend\" ",ScopeStart);
[4]777 break;
778 case COM_NEXT:
[465]779 compiler.errorMessenger.Output(4,"\"For\" - \"Next\" ",ScopeStart);
[4]780 break;
781 case COM_LOOP:
[465]782 compiler.errorMessenger.Output(4,"\"Do\" - \"Loop\" ",ScopeStart);
[4]783 break;
784 }
785 switch(Return_Sequence){
786 case ESC_ENDSUB:
[465]787 compiler.errorMessenger.Output(4,"\"Sub\" - \"End Sub\" ",ScopeStart);
[4]788 break;
789 case ESC_ENDFUNCTION:
[465]790 compiler.errorMessenger.Output(4,"\"Function\" - \"End Function\" ",ScopeStart);
[4]791 break;
792 case ESC_ENDMACRO:
[465]793 compiler.errorMessenger.Output(4,"\"Macro\" - \"End Macro\" ",ScopeStart);
[4]794 break;
795 case ESC_ENDIF:
[465]796 compiler.errorMessenger.Output(22,"If",ScopeStart);
[4]797 break;
798 }
799 break;
800 }
801 i2=-1;
802 continue;
803 }
804 Command[i2]=basbuf[cp];
805 }
806 HeapDefaultFree(Command);
807
808 return dwRetCode;
809}
Note: See TracBrowser for help on using the repository browser.