source: dev/BasicCompiler_Common/Procedure.cpp@ 116

Last change on this file since 116 was 116, checked in by dai_9181, 17 years ago

暗黙的なアップキャストを可能にした

File size: 20.4 KB
Line 
1#include "common.h"
2
3string UserProc::GetFullName() const
4{
5 if( HasParentClass() ){
6 return (string)GetParentClass().name + "." + GetName();
7 }
8
9 return GetName();
10}
11bool UserProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){
12 int i = 0;
13 int i2,i3,sw;
14 char temporary[8192],temp2[VN_SIZE];
15
16 //ソースコードの位置
17 this->codePos = nowLine;
18
19 //パラメータ
20 if(sourceOfParams[i]!='('){
21 SetError(1,NULL,nowLine);
22 return 0;
23 }
24 i++;
25 if(sourceOfParams[i]!=')'&& this->pParentClass ){
26 //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
27 if(this->GetName()[0]=='~'){
28 SetError(114,NULL,nowLine);
29 i=JumpStringInPare(sourceOfParams,i);
30 }
31 }
32 while(1){
33 if(sourceOfParams[i]==')') break;
34
35 //ByRef
36 bool isRef;
37 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
38 isRef = false;
39 i+=2;
40 }
41 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
42 isRef = true;
43 i+=2;
44 }
45 else isRef = false;
46
47 //パラメータ名
48 bool isArray = false;
49 int subScripts[MAX_ARRAYDIM];
50 char name[VN_SIZE];
51 sw=0;
52 for(i2=0;;i++,i2++){
53 if(sourceOfParams[i]=='('){
54 if(!sw) sw=1;
55
56 i3=GetStringInPare(name+i2,sourceOfParams+i);
57 i2+=i3-1;
58 i+=i3-1;
59 continue;
60 }
61 if(sourceOfParams[i]=='['){
62 if(!sw) sw=1;
63
64 i3=GetStringInBracket(name+i2,sourceOfParams+i);
65 i2+=i3-1;
66 i+=i3-1;
67 continue;
68 }
69 if(!IsVariableChar(sourceOfParams[i])){
70 name[i2]=0;
71 break;
72 }
73 name[i2]=sourceOfParams[i];
74 }
75 if(sw){
76 //配列パラメータ
77 if( isRef == false ) SetError(29,NULL,nowLine);
78 isArray = true;
79
80 if((name[i2-2]=='('&&name[i2-1]==')')||
81 (name[i2-2]=='['&&name[i2-1]==']')){
82 subScripts[0]=LONG_MAX;
83 subScripts[1]=-1;
84
85 name[i2-2]=0;
86 }
87 else{
88 GetArrange(name,temp2,subScripts);
89 lstrcpy(name,temp2);
90 }
91
92 i2=lstrlen(name);
93 }
94
95 Type type( DEF_NON );
96 char initValue[8192] = "";
97 if( sourceOfParams[i] == '=' ){
98 i++;
99 i = GetOneParameter( sourceOfParams, i, initValue );
100
101 //エラー用
102 cp = nowLine;
103
104 NumOpe_GetType( initValue, Type::String(), type );
105 }
106 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
107 i+=2;
108
109 i2=0;
110 while(sourceOfParams[i]=='*'){
111 temporary[i2]=sourceOfParams[i];
112 i++;
113 i2++;
114 }
115 for(;;i++,i2++){
116 if(!IsVariableChar(sourceOfParams[i])){
117 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
118 temporary[i2++]=sourceOfParams[i++];
119 temporary[i2]=sourceOfParams[i];
120 continue;
121 }
122 temporary[i2]=0;
123 break;
124 }
125 temporary[i2]=sourceOfParams[i];
126 }
127
128 Type::StringToType( temporary, type );
129
130 if( type.IsNull() ){
131 SetError(3,temporary,nowLine);
132 type.SetBasicType( DEF_PTR_VOID );
133 }
134 }
135 else{
136 type.SetBasicType( GetTypeFromSimpleName(temporary) );
137 SetError(-103,temporary,nowLine);
138 }
139
140 Parameter *pParam = new Parameter( name, type, isRef, initValue );
141 if( isArray ){
142 pParam->SetArray( subScripts );
143 }
144
145 //パラメータを追加
146 this->params.push_back( pParam );
147
148 if(sourceOfParams[i]==','){
149 i++;
150 continue;
151 }
152 else if(sourceOfParams[i]==')') continue;
153 else{
154 SetError(1,NULL,nowLine);
155 break;
156 }
157 }
158 this->secondParmNum = (int)this->params.size();
159 i++;
160 if(sourceOfParams[i]=='('){
161 i++;
162 while(1){
163 if(sourceOfParams[i]==')') break;
164
165 //ByRef
166 bool isRef;
167 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
168 isRef = false;
169 i+=2;
170 }
171 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
172 isRef = true;
173 i+=2;
174 }
175 else isRef = false;
176
177 //パラメータ名
178 bool isArray = false;
179 int subScripts[MAX_ARRAYDIM];
180 char name[VN_SIZE];
181 sw=0;
182 for(i2=0;;i++,i2++){
183 if(sourceOfParams[i]=='('){
184 if(!sw) sw=1;
185
186 i3=GetStringInPare(name+i2,sourceOfParams+i);
187 i2+=i3-1;
188 i+=i3-1;
189 continue;
190 }
191 if(sourceOfParams[i]=='['){
192 if(!sw) sw=1;
193
194 i3=GetStringInBracket(name+i2,sourceOfParams+i);
195 i2+=i3-1;
196 i+=i3-1;
197 continue;
198 }
199 if(!IsVariableChar(sourceOfParams[i])){
200 name[i2]=0;
201 break;
202 }
203 name[i2]=sourceOfParams[i];
204 }
205 if(sw){
206 //配列パラメータ
207 if( isRef == false ) SetError(29,NULL,nowLine);
208 isArray = true;
209
210 if((name[i2-2]=='('&&name[i2-1]==')')||
211 (name[i2-2]=='['&&name[i2-1]==']')){
212 subScripts[0]=LONG_MAX;
213 subScripts[1]=-1;
214
215 name[i2-2]=0;
216 }
217 else{
218 GetArrange(name,temp2,subScripts);
219 lstrcpy(name,temp2);
220 }
221
222 i2=lstrlen(name);
223 }
224
225 //型
226 Type type( DEF_NON );
227 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
228 i+=2;
229
230 i2=0;
231 while(sourceOfParams[i]=='*'){
232 temporary[i2]=sourceOfParams[i];
233 i++;
234 i2++;
235 }
236 for(;;i++,i2++){
237 if(!IsVariableChar(sourceOfParams[i])){
238 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
239 temporary[i2++]=sourceOfParams[i++];
240 temporary[i2]=sourceOfParams[i];
241 continue;
242 }
243 temporary[i2]=0;
244 break;
245 }
246 temporary[i2]=sourceOfParams[i];
247 }
248
249 Type::StringToType( temporary, type );
250
251 if( type.IsNull() ){
252 SetError(3,temporary,nowLine);
253 type.SetBasicType( DEF_PTR_VOID );
254 }
255 }
256 else{
257 type.SetBasicType( GetTypeFromSimpleName(temporary) );
258 SetError(-103,temporary,nowLine);
259 }
260
261 Parameter *pParam = new Parameter( name, type, isRef );
262 if( isArray ){
263 pParam->SetArray( subScripts );
264 }
265
266 //パラメータを追加
267 this->params.push_back( pParam );
268
269 if(sourceOfParams[i]==','){
270 i++;
271 continue;
272 }
273 else if(sourceOfParams[i]==')') continue;
274 else{
275 SetError(1,NULL,nowLine);
276 break;
277 }
278 }
279 i++;
280 }
281
282 if(sourceOfParams[i]){
283 ///////////////////
284 // 戻り値を取得
285 ///////////////////
286
287 if( !this->IsFunction() ){
288 // Sub/Macroの場合
289 SetError(38,this->GetName(),nowLine);
290 }
291
292 if( this->pParentClass ){
293 if( this->GetName() == this->pParentClass->name ||
294 this->GetName()[0]=='~'){
295 //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
296 SetError(115,NULL,nowLine);
297 }
298 }
299
300
301 i2=lstrlen(sourceOfParams)-2;
302
303 int sw_as=0;
304 for(;i2>0;i2--){
305 if(sourceOfParams[i2]==')') break;
306
307 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
308 i2+=2;
309 i3=0;
310 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
311 for(;;i2++,i3++){
312 if(!IsVariableChar(sourceOfParams[i2])){
313 temporary[i3]=0;
314 break;
315 }
316 temporary[i3]=sourceOfParams[i2];
317 }
318 Type::StringToType( temporary, this->returnType );
319 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
320
321 sw_as=1;
322 break;
323 }
324 }
325
326 if(!sw_as){
327 SetError(-104,this->GetName().c_str(),nowLine);
328
329 this->returnType.SetBasicType( DEF_DOUBLE );
330 }
331 }
332 else{
333 //戻り値なしのSub定義
334 this->returnType.SetNull();
335 }
336
337 //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)
338
339 if( this->pParentClass && isStatic == false ){
340 //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
341 string name = "_System_LocalThis";
342 Type type( DEF_PTR_VOID );
343 this->realParams.push_back( new Parameter( name, type ) );
344 }
345
346 if( this->returnType.IsStruct() ){
347 //構造体を戻り値として持つ場合
348 //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
349
350 string name = this->GetName();
351 if(name[0]==1&&name[1]==ESC_OPERATOR){
352 name="_System_ReturnValue";
353 }
354 Type type( DEF_STRUCT, this->returnType.GetIndex() );
355 this->realParams.push_back( new Parameter( name, type, true ) );
356 }
357
358 //パラメータをコピー
359 foreach( Parameter *pParam, params ){
360 this->realParams.push_back( new Parameter( *pParam ) );
361 }
362
363 return true;
364}
365bool UserProc::IsVirtual() const
366{
367 if( pMethod == NULL ){
368 return false;
369 }
370 return ( pMethod->bVirtual != 0 );
371}
372const NamespaceScopes &UserProc::GetNamespaceScopes() const
373{
374 if( !pParentClass ){
375 SetError();
376 }
377 return pParentClass->GetNamespaceScopes();
378}
379const NamespaceScopesCollection &UserProc::GetImportedNamespaces() const
380{
381 if( !pParentClass ){
382 SetError();
383 }
384 return pParentClass->GetImportedNamespaces();
385}
386bool UserProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
387{
388 SetError();
389 return false;
390}
391
392/*
393GlobalProc *GlobalProc::Create( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ){
394 int i2;
395 char temporary[8192];
396
397 int i=1;
398
399 Procedure::Kind kind = Procedure::Sub;
400 bool isMacro = false;
401 if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
402 if(buffer[i]==ESC_MACRO){
403 isMacro = true;
404 }
405
406 i++;
407
408 bool isCdecl = false;
409 bool isExport = false;
410 while(1){
411 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
412 isCdecl = true;
413
414 i+=2;
415 }
416 else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
417 isExport = true;
418
419 i+=2;
420 }
421 else break;
422 }
423
424 i2=0;
425 if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
426 SetError(126,NULL,nowLine);
427 return 0;
428 }
429 else{
430 for(;;i++,i2++){
431 if(!IsVariableChar(buffer[i])){
432 temporary[i2]=0;
433 break;
434 }
435 temporary[i2]=buffer[i];
436 }
437 }
438
439 if( isMacro ){
440 //大文字に変換
441 CharUpper(temporary);
442
443 //マクロ関数の場合は名前リストに追加
444 extern char **ppMacroNames;
445 extern int MacroNum;
446 ppMacroNames=(char **)HeapReAlloc(hHeap,0,ppMacroNames,(MacroNum+1)*sizeof(char *));
447 ppMacroNames[MacroNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
448 lstrcpy(ppMacroNames[MacroNum],temporary);
449 MacroNum++;
450 }
451
452 //重複チェック
453 if(GetDeclareHash(temporary)){
454 SetError(15,temporary,nowLine);
455 return 0;
456 }
457
458 extern int SubNum;
459 SubNum++;
460
461 GlobalProc *pGlobalProc = new GlobalProc( namespaceScopes, temporary, kind, isMacro, isCdecl, isExport );
462
463 //ID
464 static int id_base=0;
465 pGlobalProc->id = (id_base++);
466
467 if(isExport){
468 pGlobalProc->Using();
469 }
470
471 // パラメータを解析
472 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
473 pGlobalProc->SetParamsAndReturnType( buffer + i, nowLine, true );
474
475#ifdef _DEBUG
476 pGlobalProc->_paramStr = buffer + i;
477#endif
478
479
480 return pGlobalProc;
481}
482bool GlobalProc::AddGlobalProc( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ){
483 GlobalProc *pGlobalProc = Create( namespaceScopes, buffer, nowLine );
484 if( pGlobalProc == NULL ){
485 return false;
486 }
487
488
489 /////////////////////////////////
490 // ハッシュデータに追加
491 /////////////////////////////////
492
493 int key;
494 key=hash_default(pGlobalProc->GetName().c_str());
495
496 extern GlobalProc **ppSubHash;
497 if(ppSubHash[key]){
498 GlobalProc *psi2;
499 psi2=ppSubHash[key];
500 while(1){
501 //重複エラーチェックを行う
502 if( pGlobalProc->GetName() == psi2->GetName() ){
503 if( Parameter::Equals( psi2->Params(), pGlobalProc->Params() ) ){
504 SetError(15,pGlobalProc->GetName().c_str(),nowLine);
505 return 0;
506 }
507 }
508
509 if(psi2->pNextData==0) break;
510 psi2=psi2->pNextData;
511 }
512 psi2->pNextData=pGlobalProc;
513 }
514 else{
515 ppSubHash[key]=pGlobalProc;
516 }
517
518 return true;
519}*/
520const NamespaceScopes &GlobalProc::GetNamespaceScopes() const
521{
522 if( HasParentClass() ){
523 return GetParentClassPtr()->GetNamespaceScopes();
524 }
525 return namespaceScopes;
526}
527bool GlobalProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
528{
529 if( GetName() != name ){
530 return false;
531 }
532
533 return NamespaceScopes::IsSameArea( GetNamespaceScopes(), namespaceScopes );
534}
535bool GlobalProc::IsEqualSymbol( const GlobalProc &globalProc ) const
536{
537 return IsEqualSymbol( globalProc.GetNamespaceScopes(), globalProc.GetName() );
538}
539bool GlobalProc::IsEqualSymbol( const string &fullName ) const
540{
541 char AreaName[VN_SIZE] = ""; //オブジェクト変数
542 char NestName[VN_SIZE] = ""; //入れ子メンバ
543 bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
544
545 return IsEqualSymbol( NamespaceScopes( AreaName ), NestName );
546}
547
548bool DllProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
549{
550 if( GetName() != name ){
551 return false;
552 }
553 return NamespaceScopes::IsSameArea( this->namespaceScopes, namespaceScopes );
554}
555bool DllProc::IsEqualSymbol( const string &fullName ) const
556{
557 char AreaName[VN_SIZE] = ""; //オブジェクト変数
558 char NestName[VN_SIZE] = ""; //入れ子メンバ
559 bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName );
560
561 if( IsEqualSymbol( NamespaceScopes( AreaName ), NestName ) ){
562 return true;
563 }
564
565 if( isNest ){
566 // 静的メンバを考慮
567
568 char AreaName2[VN_SIZE] = ""; //オブジェクト変数
569 char NestName2[VN_SIZE] = ""; //入れ子メンバ
570 bool isNest = SplitMemberName( AreaName, AreaName2, NestName2 );
571 lstrcat( NestName2, "." );
572 lstrcat( NestName2, NestName );
573
574 return IsEqualSymbol( NamespaceScopes( AreaName2 ), NestName2 );
575 }
576
577 return false;
578}
579
580
581bool DllProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
582 int i = 0;
583 int i2,i3,sw;
584 char temporary[8192],temp2[VN_SIZE];
585
586 //ソースコードの位置
587 this->codePos = nowLine;
588
589 //パラメータ
590 if(sourceOfParams[i]!='('){
591 SetError(1,NULL,nowLine);
592 return 0;
593 }
594 i++;
595
596 while(1){
597 if(sourceOfParams[i]==')') break;
598
599 //ByRef
600 bool isRef;
601 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
602 isRef = false;
603 i+=2;
604 }
605 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
606 isRef = true;
607 i+=2;
608 }
609 else isRef = false;
610
611 //パラメータ名
612 bool isArray = false;
613 int subScripts[MAX_ARRAYDIM];
614 char name[VN_SIZE];
615 sw=0;
616 for(i2=0;;i++,i2++){
617 if(sourceOfParams[i]=='('){
618 if(!sw) sw=1;
619
620 i3=GetStringInPare(name+i2,sourceOfParams+i);
621 i2+=i3-1;
622 i+=i3-1;
623 continue;
624 }
625 if(sourceOfParams[i]=='['){
626 if(!sw) sw=1;
627
628 i3=GetStringInBracket(name+i2,sourceOfParams+i);
629 i2+=i3-1;
630 i+=i3-1;
631 continue;
632 }
633 if(!IsVariableChar(sourceOfParams[i])){
634 name[i2]=0;
635 break;
636 }
637 name[i2]=sourceOfParams[i];
638 }
639 if(sw){
640 //配列パラメータ
641 if( isRef == false ) SetError(29,NULL,nowLine);
642 isArray = true;
643
644 if((name[i2-2]=='('&&name[i2-1]==')')||
645 (name[i2-2]=='['&&name[i2-1]==']')){
646 subScripts[0]=LONG_MAX;
647 subScripts[1]=-1;
648
649 name[i2-2]=0;
650 }
651 else{
652 GetArrange(name,temp2,subScripts);
653 lstrcpy(name,temp2);
654 }
655
656 i2=lstrlen(name);
657 }
658
659 //型
660 Type type( DEF_NON );
661 if(lstrcmp(name,"...")==0) type.SetBasicType( DEF_ELLIPSE );
662 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
663 i+=2;
664
665 i2=0;
666 while(sourceOfParams[i]=='*'){
667 temporary[i2]=sourceOfParams[i];
668 i++;
669 i2++;
670 }
671 for(;;i++,i2++){
672 if(!IsVariableChar(sourceOfParams[i])){
673 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
674 temporary[i2++]=sourceOfParams[i++];
675 temporary[i2]=sourceOfParams[i];
676 continue;
677 }
678 temporary[i2]=0;
679 break;
680 }
681 temporary[i2]=sourceOfParams[i];
682 }
683
684 Type::StringToType( temporary, type );
685
686 if( type.IsNull() ){
687 SetError(3,temporary,nowLine);
688 type.SetBasicType( DEF_PTR_VOID );
689 }
690 }
691 else{
692 type.SetBasicType( GetTypeFromSimpleName(temporary) );
693 SetError(-103,temporary,nowLine);
694 }
695
696 Parameter *pParam = new Parameter( name, type, isRef );
697 if( isArray ){
698 pParam->SetArray( subScripts );
699 }
700
701 //パラメータを追加
702 this->params.push_back( pParam );
703
704 if(sourceOfParams[i]==','){
705 i++;
706 continue;
707 }
708 else if(sourceOfParams[i]==')') continue;
709 else{
710 SetError(1,NULL,nowLine);
711 break;
712 }
713 }
714 i++;
715
716 if(sourceOfParams[i]){
717 ///////////////////
718 // 戻り値を取得
719 ///////////////////
720
721 i2=lstrlen(sourceOfParams)-2;
722
723 int sw_as=0;
724 for(;i2>0;i2--){
725 if(sourceOfParams[i2]==')') break;
726
727 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
728 i2+=2;
729 i3=0;
730 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
731 for(;;i2++,i3++){
732 if(!IsVariableChar(sourceOfParams[i2])){
733 temporary[i3]=0;
734 break;
735 }
736 temporary[i3]=sourceOfParams[i2];
737 }
738 Type::StringToType( temporary, this->returnType );
739 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
740
741 sw_as=1;
742 break;
743 }
744 }
745 }
746 else{
747 //戻り値なしのSub定義
748 this->returnType.SetNull();
749 }
750
751 return true;
752}
753
754bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
755 int i = 0;
756 int i2,i3,sw;
757 char temporary[8192],temp2[VN_SIZE];
758
759 //ソースコードの位置
760 this->codePos = nowLine;
761
762 //パラメータ
763 if(sourceOfParams[i]!='('){
764 SetError(1,NULL,nowLine);
765 return 0;
766 }
767 i++;
768 while(1){
769 if(sourceOfParams[i]==')') break;
770
771 //ByRef
772 bool isRef;
773 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
774 isRef = false;
775 i+=2;
776 }
777 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
778 isRef = true;
779 i+=2;
780 }
781 else isRef = false;
782
783 //パラメータ名
784 bool isArray = false;
785 int subScripts[MAX_ARRAYDIM];
786 char name[VN_SIZE];
787 sw=0;
788 for(i2=0;;i++,i2++){
789 if(sourceOfParams[i]=='('){
790 if(!sw) sw=1;
791
792 i3=GetStringInPare(name+i2,sourceOfParams+i);
793 i2+=i3-1;
794 i+=i3-1;
795 continue;
796 }
797 if(sourceOfParams[i]=='['){
798 if(!sw) sw=1;
799
800 i3=GetStringInBracket(name+i2,sourceOfParams+i);
801 i2+=i3-1;
802 i+=i3-1;
803 continue;
804 }
805 if(!IsVariableChar(sourceOfParams[i])){
806 name[i2]=0;
807 break;
808 }
809 name[i2]=sourceOfParams[i];
810 }
811 if(sw){
812 //配列パラメータ
813 if( isRef == false ) SetError(29,NULL,nowLine);
814 isArray = true;
815
816 if((name[i2-2]=='('&&name[i2-1]==')')||
817 (name[i2-2]=='['&&name[i2-1]==']')){
818 subScripts[0]=LONG_MAX;
819 subScripts[1]=-1;
820
821 name[i2-2]=0;
822 }
823 else{
824 GetArrange(name,temp2,subScripts);
825 lstrcpy(name,temp2);
826 }
827
828 i2=lstrlen(name);
829 }
830
831 //型
832 Type type( DEF_NON );
833 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
834 i+=2;
835
836 i2=0;
837 while(sourceOfParams[i]=='*'){
838 temporary[i2]=sourceOfParams[i];
839 i++;
840 i2++;
841 }
842 for(;;i++,i2++){
843 if(!IsVariableChar(sourceOfParams[i])){
844 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
845 temporary[i2++]=sourceOfParams[i++];
846 temporary[i2]=sourceOfParams[i];
847 continue;
848 }
849 temporary[i2]=0;
850 break;
851 }
852 temporary[i2]=sourceOfParams[i];
853 }
854
855 Type::StringToType( temporary, type );
856
857 if( type.IsNull() ){
858 SetError(3,temporary,nowLine);
859 type.SetBasicType( DEF_PTR_VOID );
860 }
861 }
862 else{
863 type.SetBasicType( GetTypeFromSimpleName(temporary) );
864 SetError(-103,temporary,nowLine);
865 }
866
867 Parameter *pParam = new Parameter( name, type, isRef );
868 if( isArray ){
869 pParam->SetArray( subScripts );
870 }
871
872 //パラメータを追加
873 this->params.push_back( pParam );
874
875 if(sourceOfParams[i]==','){
876 i++;
877 continue;
878 }
879 else if(sourceOfParams[i]==')') continue;
880 else{
881 SetError(1,NULL,nowLine);
882 break;
883 }
884 }
885 i++;
886
887 if(sourceOfParams[i]){
888 ///////////////////
889 // 戻り値を取得
890 ///////////////////
891
892 i2=lstrlen(sourceOfParams)-2;
893
894 int sw_as=0;
895 for(;i2>0;i2--){
896 if(sourceOfParams[i2]==')') break;
897
898 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
899 i2+=2;
900 i3=0;
901 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
902 for(;;i2++,i3++){
903 if(!IsVariableChar(sourceOfParams[i2])){
904 temporary[i3]=0;
905 break;
906 }
907 temporary[i3]=sourceOfParams[i2];
908 }
909 Type::StringToType( temporary, this->returnType );
910 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
911
912 sw_as=1;
913 break;
914 }
915 }
916 }
917 else{
918 //戻り値なしのSub定義
919 this->returnType.SetNull();
920 }
921
922 //戻り値のエラーチェック
923 if( IsFunction() ){
924 // Function定義
925
926 if( this->ReturnType().IsNull() ){
927 // 戻り値がない
928 SetError(26,this->GetName(),nowLine);
929 }
930 }
931 else{
932 if( !this->ReturnType().IsNull() ){
933 // Sub定義なのに、戻り値がある
934 SetError(38,this->GetName(),nowLine);
935 }
936 }
937
938 return true;
939}
940
941UserProc *UserProc::pCompilingUserProc = NULL;
Note: See TracBrowser for help on using the repository browser.