source: dev/BasicCompiler_Common/Procedure.cpp@ 100

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

名前空間機能をグローバル関数に適用。

File size: 18.9 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}
372bool UserProc::EqualName( const string &name ) const
373{
374 SetError();
375 return true;
376}
377
378GlobalProc *GlobalProc::Create( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ){
379 int i2;
380 char temporary[8192];
381
382 int i=1;
383
384 Procedure::Kind kind = Procedure::Sub;
385 bool isMacro = false;
386 if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
387 if(buffer[i]==ESC_MACRO){
388 isMacro = true;
389 }
390
391 i++;
392
393 bool isCdecl = false;
394 bool isExport = false;
395 while(1){
396 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
397 isCdecl = true;
398
399 i+=2;
400 }
401 else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
402 isExport = true;
403
404 i+=2;
405 }
406 else break;
407 }
408
409 i2=0;
410 if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
411 SetError(126,NULL,nowLine);
412 return 0;
413 }
414 else{
415 for(;;i++,i2++){
416 if(!IsVariableChar(buffer[i])){
417 temporary[i2]=0;
418 break;
419 }
420 temporary[i2]=buffer[i];
421 }
422 }
423
424 if( isMacro ){
425 //大文字に変換
426 CharUpper(temporary);
427
428 //マクロ関数の場合は名前リストに追加
429 extern char **ppMacroNames;
430 extern int MacroNum;
431 ppMacroNames=(char **)HeapReAlloc(hHeap,0,ppMacroNames,(MacroNum+1)*sizeof(char *));
432 ppMacroNames[MacroNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
433 lstrcpy(ppMacroNames[MacroNum],temporary);
434 MacroNum++;
435 }
436
437 //重複チェック
438 if(GetDeclareHash(temporary)){
439 SetError(15,temporary,nowLine);
440 return 0;
441 }
442
443 extern int SubNum;
444 SubNum++;
445
446 GlobalProc *pGlobalProc = new GlobalProc( namespaceScopes, temporary, kind, isMacro, isCdecl, isExport );
447
448 //ID
449 static int id_base=0;
450 pGlobalProc->id = (id_base++);
451
452 if(isExport){
453 pGlobalProc->Using();
454 }
455
456 // パラメータを解析
457 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
458 pGlobalProc->SetParamsAndReturnType( buffer + i, nowLine, true );
459
460#ifdef _DEBUG
461 pGlobalProc->_paramStr = buffer + i;
462#endif
463
464
465 return pGlobalProc;
466}
467bool GlobalProc::AddGlobalProc( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ){
468 GlobalProc *pGlobalProc = Create( namespaceScopes, buffer, nowLine );
469 if( pGlobalProc == NULL ){
470 return false;
471 }
472
473
474 /////////////////////////////////
475 // ハッシュデータに追加
476 /////////////////////////////////
477
478 int key;
479 key=hash_default(pGlobalProc->GetName().c_str());
480
481 extern GlobalProc **ppSubHash;
482 if(ppSubHash[key]){
483 GlobalProc *psi2;
484 psi2=ppSubHash[key];
485 while(1){
486 //重複エラーチェックを行う
487 if( pGlobalProc->GetName() == psi2->GetName() ){
488 if( Parameter::Equals( psi2->Params(), pGlobalProc->Params() ) ){
489 SetError(15,pGlobalProc->GetName().c_str(),nowLine);
490 return 0;
491 }
492 }
493
494 if(psi2->pNextData==0) break;
495 psi2=psi2->pNextData;
496 }
497 psi2->pNextData=pGlobalProc;
498 }
499 else{
500 ppSubHash[key]=pGlobalProc;
501 }
502
503 return true;
504}
505bool GlobalProc::EqualName( const string &name ) const
506{
507 char AreaName[VN_SIZE]; //オブジェクト変数
508 char NestName[VN_SIZE]; //入れ子メンバ
509 bool isNest = SplitMemberName( name.c_str(), AreaName, NestName );
510
511 if( isNest ){
512 if( GetNamespaceScopes().Equal( AreaName ) ){
513 if( GetName() == NestName ){
514 return true;
515 }
516 }
517 }
518 else{
519 if( GetNamespaceScopes().size() ){
520 // 名前空間の判断が必要なとき
521 if( !GetNamespaceScopes().IsUsing() ){
522 // この名前空間は暗黙的に参照できないとき
523 return false;
524 }
525 }
526 if( GetName() == name ){
527 return true;
528 }
529 }
530
531 return false;
532}
533
534bool DllProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
535 int i = 0;
536 int i2,i3,sw;
537 char temporary[8192],temp2[VN_SIZE];
538
539 //ソースコードの位置
540 this->codePos = nowLine;
541
542 //パラメータ
543 if(sourceOfParams[i]!='('){
544 SetError(1,NULL,nowLine);
545 return 0;
546 }
547 i++;
548
549 while(1){
550 if(sourceOfParams[i]==')') break;
551
552 //ByRef
553 bool isRef;
554 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
555 isRef = false;
556 i+=2;
557 }
558 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
559 isRef = true;
560 i+=2;
561 }
562 else isRef = false;
563
564 //パラメータ名
565 bool isArray = false;
566 int subScripts[MAX_ARRAYDIM];
567 char name[VN_SIZE];
568 sw=0;
569 for(i2=0;;i++,i2++){
570 if(sourceOfParams[i]=='('){
571 if(!sw) sw=1;
572
573 i3=GetStringInPare(name+i2,sourceOfParams+i);
574 i2+=i3-1;
575 i+=i3-1;
576 continue;
577 }
578 if(sourceOfParams[i]=='['){
579 if(!sw) sw=1;
580
581 i3=GetStringInBracket(name+i2,sourceOfParams+i);
582 i2+=i3-1;
583 i+=i3-1;
584 continue;
585 }
586 if(!IsVariableChar(sourceOfParams[i])){
587 name[i2]=0;
588 break;
589 }
590 name[i2]=sourceOfParams[i];
591 }
592 if(sw){
593 //配列パラメータ
594 if( isRef == false ) SetError(29,NULL,nowLine);
595 isArray = true;
596
597 if((name[i2-2]=='('&&name[i2-1]==')')||
598 (name[i2-2]=='['&&name[i2-1]==']')){
599 subScripts[0]=LONG_MAX;
600 subScripts[1]=-1;
601
602 name[i2-2]=0;
603 }
604 else{
605 GetArrange(name,temp2,subScripts);
606 lstrcpy(name,temp2);
607 }
608
609 i2=lstrlen(name);
610 }
611
612 //型
613 Type type( DEF_NON );
614 if(lstrcmp(name,"...")==0) type.SetBasicType( DEF_ELLIPSE );
615 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
616 i+=2;
617
618 i2=0;
619 while(sourceOfParams[i]=='*'){
620 temporary[i2]=sourceOfParams[i];
621 i++;
622 i2++;
623 }
624 for(;;i++,i2++){
625 if(!IsVariableChar(sourceOfParams[i])){
626 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
627 temporary[i2++]=sourceOfParams[i++];
628 temporary[i2]=sourceOfParams[i];
629 continue;
630 }
631 temporary[i2]=0;
632 break;
633 }
634 temporary[i2]=sourceOfParams[i];
635 }
636
637 Type::StringToType( temporary, type );
638
639 if( type.IsNull() ){
640 SetError(3,temporary,nowLine);
641 type.SetBasicType( DEF_PTR_VOID );
642 }
643 }
644 else{
645 type.SetBasicType( GetTypeFromSimpleName(temporary) );
646 SetError(-103,temporary,nowLine);
647 }
648
649 Parameter *pParam = new Parameter( name, type, isRef );
650 if( isArray ){
651 pParam->SetArray( subScripts );
652 }
653
654 //パラメータを追加
655 this->params.push_back( pParam );
656
657 if(sourceOfParams[i]==','){
658 i++;
659 continue;
660 }
661 else if(sourceOfParams[i]==')') continue;
662 else{
663 SetError(1,NULL,nowLine);
664 break;
665 }
666 }
667 i++;
668
669 if(sourceOfParams[i]){
670 ///////////////////
671 // 戻り値を取得
672 ///////////////////
673
674 i2=lstrlen(sourceOfParams)-2;
675
676 int sw_as=0;
677 for(;i2>0;i2--){
678 if(sourceOfParams[i2]==')') break;
679
680 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
681 i2+=2;
682 i3=0;
683 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
684 for(;;i2++,i3++){
685 if(!IsVariableChar(sourceOfParams[i2])){
686 temporary[i3]=0;
687 break;
688 }
689 temporary[i3]=sourceOfParams[i2];
690 }
691 Type::StringToType( temporary, this->returnType );
692 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
693
694 sw_as=1;
695 break;
696 }
697 }
698 }
699 else{
700 //戻り値なしのSub定義
701 this->returnType.SetNull();
702 }
703
704 return true;
705}
706
707bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
708 int i = 0;
709 int i2,i3,sw;
710 char temporary[8192],temp2[VN_SIZE];
711
712 //ソースコードの位置
713 this->codePos = nowLine;
714
715 //パラメータ
716 if(sourceOfParams[i]!='('){
717 SetError(1,NULL,nowLine);
718 return 0;
719 }
720 i++;
721 while(1){
722 if(sourceOfParams[i]==')') break;
723
724 //ByRef
725 bool isRef;
726 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
727 isRef = false;
728 i+=2;
729 }
730 else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
731 isRef = true;
732 i+=2;
733 }
734 else isRef = false;
735
736 //パラメータ名
737 bool isArray = false;
738 int subScripts[MAX_ARRAYDIM];
739 char name[VN_SIZE];
740 sw=0;
741 for(i2=0;;i++,i2++){
742 if(sourceOfParams[i]=='('){
743 if(!sw) sw=1;
744
745 i3=GetStringInPare(name+i2,sourceOfParams+i);
746 i2+=i3-1;
747 i+=i3-1;
748 continue;
749 }
750 if(sourceOfParams[i]=='['){
751 if(!sw) sw=1;
752
753 i3=GetStringInBracket(name+i2,sourceOfParams+i);
754 i2+=i3-1;
755 i+=i3-1;
756 continue;
757 }
758 if(!IsVariableChar(sourceOfParams[i])){
759 name[i2]=0;
760 break;
761 }
762 name[i2]=sourceOfParams[i];
763 }
764 if(sw){
765 //配列パラメータ
766 if( isRef == false ) SetError(29,NULL,nowLine);
767 isArray = true;
768
769 if((name[i2-2]=='('&&name[i2-1]==')')||
770 (name[i2-2]=='['&&name[i2-1]==']')){
771 subScripts[0]=LONG_MAX;
772 subScripts[1]=-1;
773
774 name[i2-2]=0;
775 }
776 else{
777 GetArrange(name,temp2,subScripts);
778 lstrcpy(name,temp2);
779 }
780
781 i2=lstrlen(name);
782 }
783
784 //型
785 Type type( DEF_NON );
786 if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
787 i+=2;
788
789 i2=0;
790 while(sourceOfParams[i]=='*'){
791 temporary[i2]=sourceOfParams[i];
792 i++;
793 i2++;
794 }
795 for(;;i++,i2++){
796 if(!IsVariableChar(sourceOfParams[i])){
797 if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
798 temporary[i2++]=sourceOfParams[i++];
799 temporary[i2]=sourceOfParams[i];
800 continue;
801 }
802 temporary[i2]=0;
803 break;
804 }
805 temporary[i2]=sourceOfParams[i];
806 }
807
808 Type::StringToType( temporary, type );
809
810 if( type.IsNull() ){
811 SetError(3,temporary,nowLine);
812 type.SetBasicType( DEF_PTR_VOID );
813 }
814 }
815 else{
816 type.SetBasicType( GetTypeFromSimpleName(temporary) );
817 SetError(-103,temporary,nowLine);
818 }
819
820 Parameter *pParam = new Parameter( name, type, isRef );
821 if( isArray ){
822 pParam->SetArray( subScripts );
823 }
824
825 //パラメータを追加
826 this->params.push_back( pParam );
827
828 if(sourceOfParams[i]==','){
829 i++;
830 continue;
831 }
832 else if(sourceOfParams[i]==')') continue;
833 else{
834 SetError(1,NULL,nowLine);
835 break;
836 }
837 }
838 i++;
839
840 if(sourceOfParams[i]){
841 ///////////////////
842 // 戻り値を取得
843 ///////////////////
844
845 i2=lstrlen(sourceOfParams)-2;
846
847 int sw_as=0;
848 for(;i2>0;i2--){
849 if(sourceOfParams[i2]==')') break;
850
851 if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
852 i2+=2;
853 i3=0;
854 while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
855 for(;;i2++,i3++){
856 if(!IsVariableChar(sourceOfParams[i2])){
857 temporary[i3]=0;
858 break;
859 }
860 temporary[i3]=sourceOfParams[i2];
861 }
862 Type::StringToType( temporary, this->returnType );
863 if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
864
865 sw_as=1;
866 break;
867 }
868 }
869 }
870 else{
871 //戻り値なしのSub定義
872 this->returnType.SetNull();
873 }
874
875 //戻り値のエラーチェック
876 if( IsFunction() ){
877 // Function定義
878
879 if( this->ReturnType().IsNull() ){
880 // 戻り値がない
881 SetError(26,this->GetName(),nowLine);
882 }
883 }
884 else{
885 if( !this->ReturnType().IsNull() ){
886 // Sub定義なのに、戻り値がある
887 SetError(38,this->GetName(),nowLine);
888 }
889 }
890
891 return true;
892}
893
894UserProc *UserProc::pCompilingUserProc = NULL;
Note: See TracBrowser for help on using the repository browser.