Changeset 49 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Feb 10, 2007, 6:13:37 AM (18 years ago)
Author:
dai_9181
Message:

戻り値オブジェクトのメンバを直接的に参照できるようにした。

Location:
BasicCompiler_Common
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r41 r49  
    327327                index_stack[sp]=-1;
    328328
    329                 if(values[i][0]=='\"'){
     329                char *term;
     330                term = values[i];
     331
     332                if(term[0]=='\"'){
    330333StrLiteral:
    331334
     
    349352                    bLiteralCalculation=0;
    350353                }
    351                 else if((values[i][0]=='e'||values[i][0]=='E')&&
    352                     (values[i][1]=='x'||values[i][1]=='X')&&
    353                     values[i][2]=='\"'){
     354                else if((term[0]=='e'||term[0]=='E')&&
     355                    (term[1]=='x'||term[1]=='X')&&
     356                    term[2]=='\"'){
    354357                    //拡張版リテラル文字列(エスケープシーケンス可能)
    355358                    goto StrLiteral;
    356359                }
    357                 else if(IsVariableTopChar(values[i][0])||
    358                     values[i][0]=='*'||
    359                     (values[i][0]=='.'&&IsVariableTopChar(values[i][1]))){
     360                else if(IsVariableTopChar(term[0])||
     361                    term[0]=='*'||
     362                    (term[0]=='.'&&IsVariableTopChar(term[1]))){
    360363                    //////////////////
    361364                    // 何らかの識別子
     
    365368                    //////////////////////////////////////
    366369
    367                     i2=GetCallProcName(values[i],temporary);
    368                     if(values[i][i2]=='('){
    369                         i4=GetStringInPare_RemovePare(temp2,values[i]+i2+1);
     370                    i2=GetCallProcName(term,temporary);
     371                    if(term[i2]=='('){
     372                        i4=GetStringInPare_RemovePare(temp2,term+i2+1);
    370373
    371374                        int idProc;
     
    374377
    375378                        if(idProc){
    376                             //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    377                             if(values[i][i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     379                            //閉じカッコ")"に続く文字がNULLでないとき
     380                            if(term[i2+1+i4+1]!='\0'){
     381                                if( term[i2+1+i4+1] == '.'
     382                                    || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){
     383                                        goto NonProc;
     384                                }
     385                                else{
     386                                    SetError(42,NULL,cp);
     387                                }
     388                            }
    378389
    379390
     
    400411
    401412                            //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    402                             if(values[i][i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     413                            if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
    403414
    404415                            //マクロ関数の場合
     
    416427                        }
    417428                    }
    418 
     429NonProc:
    419430
    420431                    //インデクサ(getアクセサ)
    421432                    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    422                     GetArrayElement(values[i],VarName,ArrayElements);
     433                    GetArrayElement(term,VarName,ArrayElements);
    423434                    if(ArrayElements[0]){
    424435                        CClass *pobj_c;
     
    440451
    441452
    442                     i2=GetVarType(values[i],&index_stack[sp],0);
     453                    i2=GetVarType(term,&index_stack[sp],0);
    443454                    if(i2!=-1){
    444455                        //////////
     
    457468                    //////////////
    458469
    459                     i3 = CDBConst::obj.GetType(values[i]);
     470                    i3 = CDBConst::obj.GetType(term);
    460471                    if(i3){
    461472                        type[sp]=i3;
     
    488499
    489500                    LONG_PTR lp;
    490                     i3=GetTypeFixed(values[i],&lp);
     501                    i3=GetTypeFixed(term,&lp);
    491502                    if(i3!=-1){
    492503                        type[sp]=i3|FLAG_CAST;
     
    503514
    504515                    //配列要素を排除
    505                     GetArrayElement(values[i],VarName,ArrayElements);
     516                    GetArrayElement(term,VarName,ArrayElements);
    506517
    507518                    if(GetSubHash(VarName,0)){
    508519                        TYPEINFO RetTypeInfo;
    509                         GetReturnTypeOfPropertyMethod(values[i],NULL,&RetTypeInfo);
     520                        GetReturnTypeOfPropertyMethod(term,NULL,&RetTypeInfo);
    510521
    511522                        //大きな型への暗黙の変換
     
    523534                    //該当する識別子が見当たらないときはエラー扱いにする
    524535                    bError=1;
    525                     SetError(3,values[i],cp);
     536                    SetError(3,term,cp);
    526537                    type[sp]=DEF_DOUBLE;
    527538                }
     
    531542                    base_type=0;
    532543                    if(pBaseType) base_type=pBaseType->type;
    533                     type[sp]=GetLiteralValue(values[i],&i64data,base_type);
     544                    type[sp]=GetLiteralValue(term,&i64data,base_type);
    534545Literal:
    535546                    if((long)i64data==0&&index_stack[sp]==-1) index_stack[sp]=LITERAL_NULL;
  • BasicCompiler_Common/StrOperation.cpp

    r41 r49  
    317317    return i;
    318318}
    319 int JumpStringInPare(char *buffer,int pos){
     319int JumpStringInPare(const char *buffer,int pos){
    320320    int PareNum;
    321321    for(PareNum=1;;pos++){
     
    335335    return 0;
    336336}
    337 int JumpStringInBracket(char *buffer,int pos){
     337int JumpStringInBracket(const char *buffer,int pos){
    338338    int PareNum;
    339339    for(PareNum=1;;pos++){
  • BasicCompiler_Common/Variable.cpp

    r46 r49  
    297297    TYPEINFO TypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
    298298    return TypeInfo;
     299}
     300
     301bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member ){
     302    int p1 = 0, p2 = 0;
     303
     304    for( int i=0; term[i]!='\0' ; i++ ){
     305
     306        if( term[i] == '[' ){
     307            i = JumpStringInBracket( term, i + 1 );
     308            continue;
     309        }
     310        if( term[i] == '(' ){
     311            int temp_p = i;
     312            i = JumpStringInPare( term, i + 1 ) + 1;
     313            if( term[i] == '.'
     314                || term[i] == 1 && term[i] == ESC_PSMEM ){
     315                    p1 = temp_p;
     316                    p2 = i;
     317            }
     318            continue;
     319        }
     320    }
     321    if( !p1 ) return false;
     322
     323    //メソッド名
     324    memcpy( procName, term, p1 );
     325    procName[p1] = 0;
     326
     327    //パラメータ
     328    memcpy( parameter, term + p1 + 1, p2 - p1 - 2 );
     329    parameter[ p2 - p1 - 2 ] = 0;
     330
     331    //参照タイプ
     332    if( term[p2] == '.' ){
     333        RefType = DEF_OBJECT;
     334    }
     335    else{
     336        RefType = DEF_PTR_OBJECT;
     337        p2++;
     338    }
     339
     340    //メンバ
     341    lstrcpy( member, term + p2 + 1 );
     342
     343    return true;
    299344}
    300345
     
    632677    extern BOOL bCompilingGlobal;
    633678    int i;
     679    LONG_PTR lpIndex;
    634680    char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    635681
     
    640686    else lstrcpy(variable,NameBuffer);
    641687
     688
     689    int RefType;
     690    if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){
     691        // 戻り値オブジェクトのメンバを直接参照しているとき
     692        //例: func().member
     693
     694        void *pInfo;
     695        int idProc=GetProc(VarName,&pInfo);
     696
     697        if(idProc){
     698
     699            int type=GetReturnTypeOfProc(idProc,pInfo,VarName,array,&lpIndex);
     700
     701            return GetMemberType((CClass *)lpIndex,member,plpIndex,1,bError);
     702        }
     703    }
     704
     705
     706
    642707    lstrcpy(VarName,variable);
    643     GetVarFormatString(VarName,array,lpPtrOffset,member,&i);
     708    GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
    644709
    645710    int *pSubScripts;
    646711    int type;
    647     LONG_PTR lpIndex;
    648712
    649713    extern int MaxGlobalVarNum;
  • BasicCompiler_Common/Variable.h

    r46 r49  
    1616void GetOriginalTypeName(char *buffer);
    1717BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name);
     18bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member );
    1819BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType);
    1920void GetArrayElement(char *buffer,char *variable,char *array_element);
  • BasicCompiler_Common/calculation.cpp

    r41 r49  
    519519                        i2=lstrlen(Parms);
    520520
    521 StrLiteral:
    522521                        nums[pnum]=i2;
    523522                        StrPtr[pnum]=(char *)HeapAlloc(hHeap,0,i2+1);
  • BasicCompiler_Common/common.h

    r46 r49  
    509509int GetStringInPare_RemovePare(char *buffer,char *ReadBuffer);
    510510int GetStringInBracket(char *buffer,const char *ReadBuffer);
    511 int JumpStringInPare(char *buffer,int pos);
    512 int JumpStringInBracket(char *buffer,int pos);
     511int JumpStringInPare(const char *buffer,int pos);
     512int JumpStringInBracket(const char *buffer,int pos);
    513513int GetCpFromLine(int LineNum);
    514514BOOL GetLineNum(int pos,int *pLine,char *FileName);
Note: See TracChangeset for help on using the changeset viewer.