source: dev/BasicCompiler_Common/Procedure.cpp@ 128

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

Blittable型を導入した。

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