Changeset 9 in dev for BasicCompiler64


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

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

Location:
BasicCompiler64
Files:
3 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
  • BasicCompiler64/NumOpe.cpp

    r3 r9  
    490490                    //////////////
    491491
    492                     i3=GetConstValue(term,&dbl,temporary,&index_stack[sp]);
    493                     if(i3!=-1){
    494                         type[sp]=i3;
     492                    i3 = CDBConst::obj.GetType(term);
     493                    if(i3){
     494                        type[sp] = i3;
    495495                        if(IsRealNumberType(i3)){
    496496                            //実数
     497                            double dbl = CDBConst::obj.GetDoubleData(term);
    497498                            memcpy(&i64data,&dbl,sizeof(double));
    498499                            goto Literal;
     
    500501                        else if(IsWholeNumberType(i3)){
    501502                            //整数
    502                             i64data=(_int64)dbl;
     503                            i64data = CDBConst::obj.GetWholeData(term);
    503504                            goto Literal;
    504505                        }
    505                         else if(Is64Type(i3)){
    506                             //64ビット整数値
    507                             memcpy(&i64data,&dbl,sizeof(_int64));
    508                             goto Literal;
    509                         }
    510                         else if(i3==DEF_STRING){
     506                        /*else if(i3==DEF_STRING){
    511507                            //リテラル文字列
    512508
     
    516512                            memcpy(term,temporary,i3);
    517513                            goto StrLiteral;
    518                         }
     514                        }*/
    519515                        else{
    520516                            SetError(1,NULL,0);
     
    522518                        }
    523519                    }
     520
    524521
    525522
  • BasicCompiler64/Opcode.h

    r3 r9  
    319319BOOL GetVarOffset(BOOL bError,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    320320BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
    321 #define DIMFLAG_INITDEBUGVAR 1
    322 #define DIMFLAG_NONCALL_CONSTRACTOR 2
    323 #define DIMFLAG_STATIC 4
     321#define DIMFLAG_INITDEBUGVAR            1
     322#define DIMFLAG_NONCALL_CONSTRACTOR     2
     323#define DIMFLAG_STATIC                  4
     324#define DIMFLAG_CONST                   8
    324325void OpcodeDim(char *Parameter,DWORD dwFlag);
    325326void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
Note: See TracChangeset for help on using the changeset viewer.