Changeset 97 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Apr 16, 2007, 3:52:40 AM (17 years ago)
Author:
dai_9181
Message:

関数の戻り値オブジェクトのメンバ・メソッドを一時オブジェクトを介さずに参照できるようにした。

Location:
BasicCompiler_Common
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/BasicCompiler.cpp

    r92 r97  
    697697            isUnicode = true;
    698698            typeOfPtrChar = MAKE_PTR_TYPE(DEF_WORD,1);
     699            typeOfPtrUChar = MAKE_PTR_TYPE(DEF_WORD,1);
    699700        }
    700701
  • BasicCompiler_Common/BasicCompiler.h

    r88 r97  
    8181bool isUnicode = false;
    8282int typeOfPtrChar = MAKE_PTR_TYPE(DEF_SBYTE,1);
     83int typeOfPtrUChar = MAKE_PTR_TYPE(DEF_BYTE,1);
    8384
    8485char *basbuf;
  • BasicCompiler_Common/Class.cpp

    r96 r97  
    15281528        if( !objClass.IsUsing() ){
    15291529            // 未使用のクラスは無視する
    1530             if( (string)objClass.name == "CTest"){
    1531                 int test=0;
    1532             }
    15331530            continue;
    15341531        }
  • BasicCompiler_Common/Class.h

    r94 r97  
    210210    //メンバの参照方法
    211211    enum RefType{
     212        Non = 0,        // no reference member
    212213        Dot,            // obj.member
    213214        Pointer,        // obj->member
    214         Non,            // no reference member
    215215    };
    216216};
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r96 r97  
    294294}
    295295
     296bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL ){
     297    char parameter[VN_SIZE];
     298
     299    // Withを解決
     300    char termFull[VN_SIZE];
     301    if(term[0]=='.'){
     302        GetWithName(termFull);
     303        lstrcat(termFull,term);
     304    }
     305    else lstrcpy(termFull,term);
     306
     307    char termLeft[VN_SIZE];
     308    lstrcpy(termLeft,termFull);
     309
     310    // パース
     311    char member[VN_SIZE];
     312    CClass::RefType refType;
     313    if( SplitMemberName( termFull, termLeft, member, refType ) ){
     314        ///////////////////////////////////////////////////////////////////
     315        // オブジェクトとメンバに分解できるとき
     316        // termLeft.member
     317        ///////////////////////////////////////////////////////////////////
     318
     319        isLiteral = false;
     320
     321        // オブジェクト側の型を取得
     322        bool isClassName = false;
     323        Type leftType;
     324        if( !GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
     325            return false;
     326        }
     327
     328        if( isClassName ){
     329            // 静的メンバ/メソッドの場合
     330            goto globalArea;
     331        }
     332
     333        if( !leftType.HasMember() ){
     334            // メンバを持たない型の場合
     335            return false;
     336        }
     337
     338        const CClass &objClass = leftType.GetClass();
     339
     340
     341        ///////////////////////////////////////////////////////////////////
     342        // メンバを検索
     343        ///////////////////////////////////////////////////////////////////
     344        if( GetMemberType( objClass, member, resultType, 0, false ) ){
     345            // メンバが見つかったとき
     346            return true;
     347        }
     348
     349
     350        ///////////////////////////////////////////////////////////////////
     351        // 動的メソッドを検索
     352        ///////////////////////////////////////////////////////////////////
     353        vector<UserProc *> userProcs;
     354
     355        char methodName[VN_SIZE] ,lpPtrOffset[VN_SIZE];
     356        lstrcpy( methodName, member );
     357        GetVarFormatString(methodName,parameter,lpPtrOffset,member,refType);
     358
     359        objClass.EnumMethod( methodName, userProcs );
     360        UserProc *pUserProc;
     361        if(userProcs.size()){
     362            //オーバーロードを解決
     363            pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
     364
     365            if( pUserProc ){
     366                resultType = pUserProc->ReturnType();
     367                return true;
     368            }
     369        }
     370
     371        return false;
     372    }
     373
     374
     375    //////////////////////////////////////////////
     376    // クラス名かどうかをチェック(静的メンバ用)
     377    //////////////////////////////////////////////
     378
     379    if( pIsClassName ){
     380        if( pobj_DBClass->check( termFull ) ){
     381            *pIsClassName = true;
     382            return true;
     383        }
     384    }
     385
     386
     387    /////////////////////////////////////////////////////////////////
     388    // グローバル属性
     389    /////////////////////////////////////////////////////////////////
     390globalArea:
     391
     392
     393    if(lstrcmpi(termFull,"This")==0){
     394        //Thisオブジェクト
     395        resultType.SetType( DEF_OBJECT, pobj_CompilingClass );
     396        return true;
     397    }
     398
     399
     400    //////////////////////////////////////
     401    // 関数(DLL、ユーザー定義、組み込み)
     402    //////////////////////////////////////
     403    char procName[VN_SIZE];
     404    char temporary[8192];
     405
     406    int i2=GetCallProcName(termFull,procName);
     407    if(termFull[i2]=='('){
     408        int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
     409
     410        void *pProc;
     411        int idProc=GetProc(procName,(void **)&pProc);
     412
     413        if(idProc){
     414            //閉じカッコ")"に続く文字がNULLでないとき
     415            if(termFull[i2+1+i4+1]!='\0'){
     416                SetError(42,NULL,cp);
     417            }
     418
     419
     420            ////////////////
     421            // 呼び出し
     422            ////////////////
     423
     424            if( !CallProc(idProc,pProc,procName,parameter, resultType, false ) ){
     425                return false;
     426            }
     427            if( resultType.IsNull() ){
     428                //戻り値が存在しないとき
     429                return false;
     430            }
     431
     432            isLiteral = false;
     433
     434            return true;
     435        }
     436        else if(GetConstCalcBuffer(procName,parameter,temporary)){
     437            /////////////////////////
     438            // マクロ関数
     439            /////////////////////////
     440
     441            //閉じカッコ")"に続く文字がNULLでないときはエラーにする
     442            if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     443
     444            //マクロ関数の場合
     445            if( !NumOpe_GetType(temporary,Type(),resultType) ){
     446                return false;
     447            }
     448
     449            if( !IS_LITERAL( resultType.GetIndex() ) ){
     450                //リテラル値ではなかったとき
     451                isLiteral = false;
     452            }
     453
     454            return true;
     455        }
     456    }
     457
     458
     459    ////////////////////////////////
     460    // インデクサ(getアクセサ)
     461    ////////////////////////////////
     462
     463    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
     464    GetArrayElement(termFull,VarName,ArrayElements);
     465    if(ArrayElements[0]){
     466        GetVarType(VarName,resultType,false);
     467        if( resultType.IsObject() ){
     468            if( !GetReturnTypeOfIndexerGetterProc( resultType.GetClass(),resultType) ){
     469                SetError(1,NULL,cp);
     470                return false;
     471            }
     472
     473            isLiteral = false;
     474
     475            return true;
     476        }
     477    }
     478
     479
     480    ////////////////////////////////
     481    // 変数
     482    ////////////////////////////////
     483
     484    if( GetVarType( termFull, resultType, false ) ){
     485        if( resultType.GetBasicType() & FLAG_PTR ){
     486            //配列ポインタ
     487            resultType.SetBasicType( GetPtrType( resultType.GetBasicType()^FLAG_PTR ) );
     488        }
     489
     490        isLiteral = false;
     491
     492        return true;
     493    }
     494
     495
     496    /////////////////////////////////
     497    // プロパティ用のメソッド
     498    /////////////////////////////////
     499
     500    //配列要素を排除
     501    GetArrayElement(termFull,VarName,ArrayElements);
     502
     503    if(GetSubHash(VarName,0)){
     504        GetReturnTypeOfPropertyMethod(termFull,NULL,resultType);
     505
     506        isLiteral = false;
     507
     508        return true;
     509    }
     510
     511
     512    return false;
     513}
     514
    296515bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){
    297516    extern int cp;
    298     int i,i2,i3,i4;
    299     char temporary[1024],temp2[1024],temp3[1024];
     517    int i,i3;
    300518
    301519    if(expression[0]=='\0'){
     
    392610                term = values[i];
    393611
     612                if( calc[i+1]%100 == CALC_AS ){
     613                    // As演算子の右辺値
     614                    //型名
     615                    if( Type::StringToType( term, resultType ) ){
     616                        resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
     617                    }
     618                    else{
     619                        SetError(3, term, cp );
     620                        goto error;
     621                    }
     622
     623                    type_stack[sp] = resultType.GetBasicType();
     624                    index_stack[sp] = resultType.GetIndex();
     625                    sp++;
     626
     627                    break;
     628                }
     629
    394630                if(term[0]=='\"'){
    395631StrLiteral:
    396632
    397                     if( baseType.IsStringObject() ){
    398                         //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
     633                    if( baseType.IsObject() || baseType.IsNull() ){
     634                        //要求タイプがオブジェクト、または未定のとき
    399635                        extern CClass *pobj_StringClass;
    400636                        type_stack[sp]=DEF_OBJECT;
     
    421657                    // 何らかの識別子
    422658
    423                     //////////////////////////////////////
    424                     // 関数(DLL、ユーザー定義、組み込み)
    425                     //////////////////////////////////////
    426 
    427                     i2=GetCallProcName(term,temporary);
    428                     if(term[i2]=='('){
    429                         i4=GetStringInPare_RemovePare(temp2,term+i2+1);
    430 
    431                         int idProc;
    432                         void *pProc;
    433                         idProc=GetProc(temporary,(void **)&pProc);
    434 
    435                         if(idProc){
    436                             //閉じカッコ")"に続く文字がNULLでないとき
    437                             if(term[i2+1+i4+1]!='\0'){
    438                                 if( term[i2+1+i4+1] == '.'
    439                                     || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){
    440                                         goto NonProc;
    441                                 }
    442                                 else{
    443                                     SetError(42,NULL,cp);
    444                                 }
    445                             }
    446 
    447 
    448                             ////////////////
    449                             // 呼び出し
    450                             ////////////////
    451 
    452                             Type resultType;
    453                             if( !CallProc(idProc,pProc,temporary,temp2, resultType, false ) ){
    454                                 goto error;
    455                             }
    456                             if( resultType.IsNull() ){
    457                                 //戻り値が存在しないとき
    458                                 goto error;
    459                             }
    460 
    461                             type_stack[sp] = resultType.GetBasicType();
    462                             index_stack[sp] = resultType.GetIndex();
    463 
     659                    bool isLiteral = true;
     660                    if( GetTermType( term, resultType, isLiteral ) ){
     661                        type_stack[sp] = resultType.GetBasicType();
     662                        index_stack[sp] = resultType.GetIndex();
     663
     664                        if( !isLiteral ){
    464665                            bLiteralCalculation=0;
    465 
    466                             sp++;
    467                             break;
    468666                        }
    469                         else if(GetConstCalcBuffer(temporary,temp2,temp3)){
    470                             /////////////////////////
    471                             // マクロ関数
    472                             /////////////////////////
    473 
    474                             //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    475                             if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
    476 
    477                             //マクロ関数の場合
    478                             Type tempType;
    479                             NumOpe_GetType(temp3,Type(),tempType);
    480 
    481                             if(!IS_LITERAL(tempType.GetIndex())){
    482                                 //リテラル値ではなかったとき
    483                                 bLiteralCalculation=0;
    484                             }
    485 
    486                             type_stack[sp] = tempType.GetBasicType();
    487                             index_stack[sp] = tempType.GetIndex();
    488 
    489                             sp++;
    490                             break;
    491                         }
    492                     }
    493 NonProc:
    494 
    495                     //インデクサ(getアクセサ)
    496                     char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    497                     GetArrayElement(term,VarName,ArrayElements);
    498                     if(ArrayElements[0]){
    499                         Type type;
    500                         GetVarType(VarName,type,false);
    501                         if( type.IsObject() ){
    502                             if( !GetReturnTypeOfIndexerGetterProc( type.GetClass(),type) ){
    503                                 SetError(1,NULL,cp);
    504                                 goto error;
    505                             }
    506                             type_stack[sp]=type.GetBasicType();
    507                             index_stack[sp]=type.GetIndex();
    508                             bLiteralCalculation=0;
    509 
    510                             sp++;
    511                             break;
    512                         }
     667
     668                        sp++;
     669                        break;
    513670                    }
    514671
     
    526683                        }
    527684                        bLiteralCalculation = 0;
    528                         sp++;
    529                         break;
    530                     }
    531 
    532                     if( (string)term == "s.GetType().Name" ){
    533                         int test=0;
    534                     }
    535 
    536 
    537                     Type varType;
    538                     if( GetVarType(term,varType,0) ){
    539                         //////////
    540                         // 変数
    541                         //////////
    542 
    543                         if( varType.GetBasicType() & FLAG_PTR ){
    544                             //配列ポインタ
    545                             type_stack[sp]=GetPtrType( varType.GetBasicType()^FLAG_PTR );
    546                         }
    547                         else{
    548                             type_stack[sp]=varType.GetBasicType();
    549                         }
    550                         index_stack[sp] = varType.GetIndex();
    551 
    552                         bLiteralCalculation=0;
    553685                        sp++;
    554686                        break;
     
    586718
    587719
    588                     //////////////
    589                     // 型名の場合
    590                     //////////////
    591 
    592                     Type tempType;
    593                     if( Type::StringToType( term, tempType ) ){
    594                         type_stack[sp] = tempType.GetBasicType() | FLAG_CAST;
    595                         index_stack[sp] = tempType.GetIndex();
    596                         sp++;
    597                         break;
    598                     }
    599 
    600 
    601720                    /////////////////////////////////
    602721                    // プロパティ用のメソッド
     
    604723
    605724                    //配列要素を排除
     725                    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    606726                    GetArrayElement(term,VarName,ArrayElements);
    607727
    608728                    if(GetSubHash(VarName,0)){
     729                        SetError();
    609730                        Type tempType;
    610731                        GetReturnTypeOfPropertyMethod(term,NULL,tempType);
  • BasicCompiler_Common/OldStatement.cpp

    r76 r97  
    103103        else if(varType.IsObject()){
    104104            varType.SetBasicType( DEF_OBJECT );
    105             if( varType.IsStringObject() ){
     105            if( varType.IsStringClass() ){
    106106                varType.SetBasicType( DEF_STRING );
    107107            }
  • BasicCompiler_Common/Procedure.h

    r92 r97  
    8585class UserProc : public Procedure
    8686{
     87#ifdef _DEBUG
     88public:
     89    string _paramStr;
     90#endif
    8791
    8892private:
  • BasicCompiler_Common/Subroutine.cpp

    r94 r97  
    8383    }
    8484}
     85bool SplitMemberName( const char *desc, char *object, char *member, CClass::RefType &refType ){
     86    int lastIndex = -1;
     87    for( int i=0; desc[i]; i++ ){
     88        if( desc[i] == '(' ){
     89            i=JumpStringInPare(desc,i+1);
     90            continue;
     91        }
     92        else if( desc[i] == '[' ){
     93            i=JumpStringInBracket(desc,i+1);
     94            continue;
     95        }
     96        else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
     97            lastIndex = i;
     98        }
     99    }
     100    if( lastIndex == -1 ){
     101        return false;
     102    }
     103
     104    if(desc[lastIndex]=='.'){
     105        lstrcpy(member,desc+lastIndex+1);
     106        refType = CClass::Dot;
     107    }
     108    else{
     109        lstrcpy(member,desc+lastIndex+2);
     110        refType = CClass::Pointer;
     111    }
     112
     113    if( object ){
     114        lstrcpy( object, desc );
     115        object[lastIndex]=0;
     116    }
     117
     118    return true;
     119}
    85120bool SplitMemberName( const char *desc, char *object, char *member ){
    86     int i;
    87     for(i=lstrlen(desc)-1;i>=0;i--){
    88         if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM))
    89             break;
    90     }
    91     if(i==-1) return false;
    92     else{
    93         if(desc[i]=='.')
    94             lstrcpy(member,desc+i+1);
    95         else
    96             lstrcpy(member,desc+i+2);
    97 
    98         if( object ){
    99             lstrcpy( object, desc );
    100             object[i]=0;
    101         }
    102     }
    103 
    104     return true;
     121    CClass::RefType dummyRefType;
     122    return SplitMemberName( desc, object, member, dummyRefType );
    105123}
    106124
     
    565583    SubNum++;
    566584
    567 
    568585    UserProc *pUserProc = new UserProc( temporary, kind, isMacro, isCdecl, isExport );
    569586    pUserProc->SetParentClass( pobj_c );
     
    580597    // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
    581598    pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
     599
     600#ifdef _DEBUG
     601    pUserProc->_paramStr = buffer + i;
     602#endif
    582603
    583604
  • BasicCompiler_Common/Type.cpp

    r88 r97  
    417417    return false;
    418418}
    419 bool Type::IsStringObject() const
     419bool Type::IsObjectClass() const
     420{
     421    if( basicType == DEF_OBJECT ){
     422        if( lstrcmp( pClass->name,"Object")==0){
     423            return true;
     424        }
     425    }
     426    return false;
     427}
     428bool Type::IsStringClass() const
    420429{
    421430    if( basicType == DEF_OBJECT ){
     
    438447    if( basicType == DEF_ANY ){
    439448        return true;
     449    }
     450    return false;
     451}
     452
     453bool Type::HasMember() const
     454{
     455    if( NATURAL_TYPE( basicType ) == DEF_OBJECT
     456        || NATURAL_TYPE( basicType ) == DEF_STRUCT ){
     457            return true;
    440458    }
    441459    return false;
  • BasicCompiler_Common/Type.h

    r79 r97  
    105105    bool IsObject() const;
    106106    bool IsObjectPtr() const;
    107     bool IsStringObject() const;
     107    bool IsObjectClass() const;
     108    bool IsStringClass() const;
    108109    bool IsVoidPtr() const;
    109110    bool IsAny() const;
     111
     112    // オブジェクトや構造体など、メンバを持つ型かどうかを判別する
     113    bool HasMember() const;
    110114
    111115    const string ToString() const;
  • BasicCompiler_Common/VariableOpe.cpp

    r88 r97  
    240240}
    241241
     242void GetWithName(char *buffer){
     243    extern WITHINFO WithInfo;
     244    int i;
     245
     246    buffer[0]=0;
     247    for(i=0;i<WithInfo.num;i++)
     248        lstrcat(buffer,WithInfo.ppName[i]);
     249}
     250
    242251bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){
    243252    int p1 = 0, p2 = 0;
     
    11731182    }
    11741183
    1175 
    11761184    //構文を解析
    11771185    int SubScripts[MAX_ARRAYDIM];
  • BasicCompiler_Common/VariableOpe.h

    r79 r97  
    1414int GetPtrType(int type);
    1515BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name);
     16void GetWithName(char *buffer);
    1617bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member );
    1718BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, CClass::RefType &refType );
     
    2122void GetArrange(char *variable,char *variAnswer,int *SubScripts);
    2223int GetTypeFromSimpleName(char *variable);
     24bool GetMemberType( const CClass &objClass, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled);
    2325bool GetVarType( const char *nameBuffer, Type &resultType, bool isError);
    2426bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL );
  • BasicCompiler_Common/calculation.cpp

    r79 r97  
    820820    for(i=0,sp=0;i<pnum;i++){
    821821
    822         //型チェック(正常でない場合はエラーにする)
    823         TypeErrorCheck(stack,sp,calc[i]%100);
     822        if( enableerror ){
     823            //型チェック(正常でない場合はエラーにする)
     824            TypeErrorCheck(stack,sp,calc[i]%100);
     825        }
    824826
    825827        idCalc=calc[i]%100;
     
    10881090#pragma optimize("", on)
    10891091
    1090 BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer){
     1092BOOL GetConstCalcBuffer(const char *name,const char *Parameter,char *pCalcBuffer){
    10911093    extern HANDLE hHeap;
    10921094    int i2,i3,i4,num;
     
    12561258                    pDllProc=GetDeclareHash(temporary);
    12571259                    if(pDllProc){
    1258                         if( pDllProc->ReturnType().IsStringObject() ){
     1260                        if( pDllProc->ReturnType().IsStringClass() ){
    12591261                            return 1;
    12601262                        }
     
    12661268                    pUserProc=GetSubHash(temporary);
    12671269                    if(pUserProc){
    1268                         if( pUserProc->ReturnType().IsStringObject() ){
     1270                        if( pUserProc->ReturnType().IsStringClass() ){
    12691271                            return 1;
    12701272                        }
     
    13071309                    return -1;
    13081310                }
    1309                 if( varType.IsStringObject() ){
     1311                if( varType.IsStringClass() ){
    13101312                    return 1;
    13111313                }
     
    15261528    }
    15271529
     1530    calc[*pnum]=0;
     1531
    15281532    return 1;
    15291533}
  • BasicCompiler_Common/common.h

    r96 r97  
    9494extern bool isUnicode;
    9595extern int typeOfPtrChar;
     96extern int typeOfPtrUChar;
    9697
    9798
     
    294295//hash.cpp
    295296int hash_default(const char *name);
    296 CONSTINFO *GetConstHash(char *name);
     297CONSTINFO *GetConstHash(const char *name);
    297298DllProc *GetDeclareHash(char *name);
    298299void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs );
     
    418419int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2);
    419420DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType);
    420 BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer);
     421BOOL GetConstCalcBuffer(const char *name,const char *Parameter,char *pCalcBuffer);
    421422DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex);
    422423bool IsStringObjectType(const Type &TypeInfo);
     
    435436int GetProc(char *name,void **ppInfo);
    436437void SplitObjectName(const char *name,char *ObjectName,int *pRefType);
     438bool SplitMemberName( const char *desc, char *object, char *member, CClass::RefType &refType );
    437439bool SplitMemberName( const char *desc, char *object, char *member );
    438440bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn = true );
  • BasicCompiler_Common/hash.cpp

    r95 r97  
    1717}
    1818
    19 CONSTINFO *GetConstHash(char *name){
     19CONSTINFO *GetConstHash(const char *name){
    2020    //ハッシュ値を取得
    2121    int key;
Note: See TracChangeset for help on using the changeset viewer.