source: dev/BasicCompiler_Common/Procedure.cpp @ 128

Last change on this file since 128 was 128, checked in by dai_9181, 16 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.