Changeset 9 in dev for BasicCompiler64/Compile_Var.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Var.cpp

    r3 r9  
    754754    LONG_PTR lpCalcIndex;
    755755
    756     CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
     756    CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
     757    if(!CalcType){
     758        //動的データだった場合
     759        return 0;
     760    }
    757761    if(IsRealNumberType(CalcType)){
    758762        memcpy(&dbl,&i64data,sizeof(double));
     
    876880    int CalcType;
    877881    LONG_PTR lpCalcIndex;
    878     CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
     882    CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
     883    if(!CalcType){
     884        //動的データだった場合
     885        return 0;
     886    }
    879887    if(IsRealNumberType(CalcType)){
    880888        memcpy(&dbl,&i64data,sizeof(double));
     
    983991    extern HANDLE hHeap;
    984992    int i2,i3,VarSize;
     993    char VarName[VN_SIZE];
     994
     995
     996    if(dwFlag & DIMFLAG_CONST){
     997        //////////////////////////////////
     998        // 定数変数の場合を考慮
     999        //////////////////////////////////
     1000        for(i2=0;;i2++){
     1001            if(Parameter[i2] == '=' ||
     1002                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     1003                Parameter[i2] =='('){
     1004                    VarName[i2] = 0;
     1005                    break;
     1006            }
     1007            VarName[i2] = Parameter[i2];
     1008        }
     1009
     1010        //定数と2重定義されていないる場合は抜け出す
     1011        if(CDBConst::obj.GetType(VarName)){
     1012            return;
     1013        }
     1014
     1015        //定数マクロとして定義されている場合は抜け出す
     1016        if(GetConstHash(VarName)){
     1017            return;
     1018        }
     1019    }
     1020
    9851021
    9861022    //構文を解析
    987     char VarName[VN_SIZE];
    9881023    int SubScripts[MAX_ARRAYDIM];
    9891024    TYPEINFO TypeInfo;
     
    9931028        return;
    9941029
     1030
     1031    //定数と2重定義されていないかを調べる
     1032    if(CDBConst::obj.GetType(VarName)){
     1033        SetError(15,VarName,cp);
     1034        return;
     1035    }
     1036
     1037    //定数マクロとして定義されている場合
     1038    if(GetConstHash(VarName)){
     1039        SetError(15,VarName,cp);
     1040        return;
     1041    }
     1042
     1043
    9951044    //タイプサイズを取得
    9961045    int TypeSize;
    9971046    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    998 
    999     //定数と2重定義されていないかを調べる
    1000     if(GetConstHash(VarName)){
    1001         SetError(15,VarName,cp);
    1002         return;
    1003     }
    10041047
    10051048    if(dwFlag&DIMFLAG_STATIC){
     
    10591102            if(VarSize%8) VarSize+=8-(VarSize%8);
    10601103
     1104            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1105
     1106            MaxLocalVarNum++;
     1107
    10611108            //変数データを追加
    1062             lstrcpy(LocalVar[MaxLocalVarNum].name,VarName);
    1063             LocalVar[MaxLocalVarNum].fRef=0;
    1064             if(SubScripts[0]==-1) LocalVar[MaxLocalVarNum].bArray=0;
    1065             else LocalVar[MaxLocalVarNum].bArray=1;
    1066             LocalVar[MaxLocalVarNum].type=TypeInfo.type;
    1067             LocalVar[MaxLocalVarNum].u.index=TypeInfo.u.lpIndex;
     1109            lstrcpy(pVar->name,VarName);
     1110            pVar->fRef=0;
     1111            if(dwFlag & DIMFLAG_CONST) pVar->bConst = 1;
     1112            else pVar->bConst = 0;
     1113            if(SubScripts[0]==-1) pVar->bArray=0;
     1114            else pVar->bArray=1;
     1115            pVar->type=TypeInfo.type;
     1116            pVar->u.index=TypeInfo.u.lpIndex;
    10681117            AllLocalVarSize+=VarSize;
    1069             LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
     1118            pVar->offset=AllLocalVarSize;
    10701119
    10711120            //レキシカルスコープ
    1072             LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
    1073             LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
    1074             LocalVar[MaxLocalVarNum].bLiving=TRUE;
     1121            pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     1122            pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     1123            pVar->bLiving=TRUE;
    10751124
    10761125            if(InitBuf[0]){
    1077                 InitLocalVar(-LocalVar[MaxLocalVarNum].offset,
    1078                     LocalVar[MaxLocalVarNum].type,
    1079                     LocalVar[MaxLocalVarNum].u.index,
    1080                     LocalVar[MaxLocalVarNum].SubScripts,
     1126                int result = InitLocalVar(-pVar->offset,
     1127                    pVar->type,
     1128                    pVar->u.index,
     1129                    pVar->SubScripts,
    10811130                    InitBuf);
     1131
     1132                if(!result){
     1133                    //動的な式だった場合は代入演算を行う
     1134                    char temporary[8192];
     1135                    sprintf(temporary,"%s=%s",VarName,InitBuf);
     1136                    OpcodeCalc(temporary);
     1137                }
    10821138            }
    10831139            else{
    10841140                //0初期化未完成
    10851141            }
    1086 
    1087             MaxLocalVarNum++;
    10881142        }
    10891143
Note: See TracChangeset for help on using the changeset viewer.