Changeset 8 in dev for BasicCompiler32/Compile_Var.cpp


Ignore:
Timestamp:
Dec 7, 2006, 3:10:05 AM (17 years ago)
Author:
dai_9181
Message:

Constステートメントで定数変数を宣言できるように改良。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Var.cpp

    r3 r8  
    853853    int CalcType;
    854854    LONG_PTR lpCalcIndex;
    855     CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
     855    CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
     856    if(!CalcType){
     857        //動的データだった場合
     858        return 0;
     859    }
    856860    if(IsRealNumberType(CalcType)){
    857861        memcpy(&dbl,&i64data,sizeof(double));
     
    995999    extern HANDLE hHeap;
    9961000    int i2,i3,VarSize;
     1001    char VarName[VN_SIZE];
     1002
     1003
     1004    if(dwFlag & DIMFLAG_CONST){
     1005        //////////////////////////////////
     1006        // 定数変数の場合を考慮
     1007        //////////////////////////////////
     1008        for(i2=0;;i2++){
     1009            if(Parameter[i2] == '=' ||
     1010                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     1011                Parameter[i2] =='('){
     1012                    VarName[i2] = 0;
     1013                    break;
     1014            }
     1015            VarName[i2] = Parameter[i2];
     1016        }
     1017
     1018        //定数と2重定義されていないる場合は抜け出す
     1019        if(CDBConst::obj.GetType(VarName)){
     1020            return;
     1021        }
     1022
     1023        //定数マクロとして定義されている場合は抜け出す
     1024        if(GetConstHash(VarName)){
     1025            return;
     1026        }
     1027    }
     1028
    9971029
    9981030    //構文を解析
    999     char VarName[VN_SIZE];
    10001031    int SubScripts[MAX_ARRAYDIM];
    10011032    TYPEINFO TypeInfo;
     
    10051036        return;
    10061037
     1038
     1039    //定数と2重定義されていないかを調べる
     1040    if(CDBConst::obj.GetType(VarName)){
     1041        SetError(15,VarName,cp);
     1042        return;
     1043    }
     1044
     1045    //定数マクロとして定義されている場合
     1046    if(GetConstHash(VarName)){
     1047        SetError(15,VarName,cp);
     1048        return;
     1049    }
     1050
     1051
    10071052    //タイプサイズを取得
    10081053    int TypeSize;
    10091054    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    1010 
    1011     //定数と2重定義されていないかを調べる
    1012     if(GetConstHash(VarName)){
    1013         SetError(15,VarName,cp);
    1014         return;
    1015     }
    10161055
    10171056    if(dwFlag&DIMFLAG_STATIC){
     
    10711110            if(VarSize%4) VarSize+=4-(VarSize%4);
    10721111
     1112            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1113
     1114            MaxLocalVarNum++;
     1115
    10731116            //変数データを追加
    1074             lstrcpy(LocalVar[MaxLocalVarNum].name,VarName);
    1075             LocalVar[MaxLocalVarNum].fRef=0;
    1076             if(SubScripts[0]==-1) LocalVar[MaxLocalVarNum].bArray=0;
    1077             else LocalVar[MaxLocalVarNum].bArray=1;
    1078             LocalVar[MaxLocalVarNum].type=TypeInfo.type;
    1079             LocalVar[MaxLocalVarNum].u.index=TypeInfo.u.lpIndex;
     1117            lstrcpy(pVar->name,VarName);
     1118            pVar->fRef=0;
     1119            if(dwFlag & DIMFLAG_CONST) pVar->bConst = 1;
     1120            else pVar->bConst = 0;
     1121            if(SubScripts[0]==-1) pVar->bArray=0;
     1122            else pVar->bArray=1;
     1123            pVar->type=TypeInfo.type;
     1124            pVar->u.index=TypeInfo.u.lpIndex;
    10801125            AllLocalVarSize+=VarSize;
    1081             LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
     1126            pVar->offset=AllLocalVarSize;
    10821127
    10831128            //レキシカルスコープ
    1084             LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
    1085             LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
    1086             LocalVar[MaxLocalVarNum].bLiving=TRUE;
     1129            pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     1130            pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     1131            pVar->bLiving=TRUE;
    10871132
    10881133            if(InitBuf[0]){
    1089                 InitLocalVar(-LocalVar[MaxLocalVarNum].offset,
    1090                     LocalVar[MaxLocalVarNum].type,
    1091                     LocalVar[MaxLocalVarNum].u.index,
    1092                     LocalVar[MaxLocalVarNum].SubScripts,
     1134                int result = InitLocalVar(-pVar->offset,
     1135                    pVar->type,
     1136                    pVar->u.index,
     1137                    pVar->SubScripts,
    10931138                    InitBuf);
     1139
     1140                if(!result){
     1141                    //動的な式だった場合は代入演算を行う
     1142                    char temporary[8192];
     1143                    sprintf(temporary,"%s=%s",VarName,InitBuf);
     1144                    OpcodeCalc(temporary);
     1145                }
    10941146            }
    10951147            else{
     
    11061158                //add eax,offset
    11071159                OpBuffer[obp++]=(char)0x05;
    1108                 *((long *)(OpBuffer+obp))=-LocalVar[MaxLocalVarNum].offset;
     1160                *((long *)(OpBuffer+obp))=-pVar->offset;
    11091161                AddLocalVarAddrSchedule();
    11101162                obp+=sizeof(long);
     
    11221174                obp+=sizeof(long);
    11231175            }
    1124 
    1125             MaxLocalVarNum++;
    11261176        }
    11271177
Note: See TracChangeset for help on using the changeset viewer.