Changeset 7 in dev for BasicCompiler_Common
- Timestamp:
- Dec 7, 2006, 3:09:44 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Compile.cpp
r5 r7 111 111 switch(Command[1]){ 112 112 case ESC_CONST: 113 OpcodeDim(Command+2, DIMFLAG_CONST); 114 break; 115 113 116 case ESC_TYPEDEF: 114 117 break; -
BasicCompiler_Common/Const.cpp
r5 r7 1 1 #include "common.h" 2 2 #include OPCODE_H_PATH //opcode.h 3 4 5 //シングルトンオブジェクト 6 CDBConst CDBConst::obj; 3 7 4 8 … … 12 16 } 13 17 14 15 16 CConst::CConst(char *Name, char *Expression):CConstBase(Name) 18 char *CConstBase::GetName(){ 19 return Name; 20 } 21 22 23 24 CConst::CConst(char *Name, int Type, _int64 i64data):CConstBase(Name) 17 25 { 18 LONG_PTR lpIndex; 19 Type = StaticCalculation(false, Expression, 0, &i64data, &lpIndex); 26 this->Type = Type; 27 this->i64data = i64data; 28 29 //連結リストを初期化 30 pNext = 0; 31 } 32 CConst::CConst(char *Name, int value):CConstBase(Name) 33 { 34 Type = DEF_LONG; 35 i64data = value; 36 37 //連結リストを初期化 38 pNext = 0; 20 39 } 21 40 CConst::~CConst(){ 22 } 41 //連結先のオブジェクトを破棄 42 if(pNext){ 43 delete pNext; 44 pNext = 0; 45 } 46 } 47 48 int CConst::GetType(){ 49 return Type; 50 } 51 _int64 CConst::GetWholeData(){ 52 return i64data; 53 } 54 double CConst::GetDoubleData(){ 55 double dbl; 56 memcpy(&dbl,&i64data,sizeof(_int64)); 57 return dbl; 58 } 59 60 23 61 24 62 CConstMacro::CConstMacro(char *Name, char *Expression):CConstBase(Name) … … 30 68 31 69 70 71 32 72 CDBConst::CDBConst(){ 33 //定数管理領域を初期化 34 ppobj_Const = (CConst **)malloc(1); 35 NumOfConst = 0; 36 37 //定数マクロ管理領域を初期化 38 ppobj_Macro = (CConstMacro **)malloc(1); 39 NumOfMacro = 0; 73 memset(this,0,sizeof(CDBConst)); 74 75 ppHash = (CConst **)calloc(MAX_HASH*sizeof(CConst *),1); 76 Init(); 40 77 } 41 78 CDBConst::~CDBConst(){ 79 Free(); 80 81 free(ppHash); 82 } 83 84 //解放 85 void CDBConst::Free(){ 42 86 int i; 43 for(i=0; i<NumOfConst; i++){ 44 delete ppobj_Const[i]; 45 } 46 free(ppobj_Const); 47 ppobj_Const = 0; 48 49 for(i=0; i<NumOfMacro; i++){ 50 delete ppobj_Macro[i]; 51 } 52 free(ppobj_Macro); 53 ppobj_Macro = 0; 54 } 55 87 for(i=0; i<MAX_HASH; i++){ 88 if(ppHash[i]){ 89 delete ppHash[i]; 90 ppHash[i] = 0; 91 } 92 } 93 } 94 95 //初期化 96 void CDBConst::Init(){ 97 Free(); 98 } 99 100 void AddConstData(char *Command); 56 101 void CDBConst::Add(char *buffer){ 57 102 int i; … … 71 116 } 72 117 118 //重複チェック 119 if(GetType(Name)){ 120 SetError(15,Name,cp); 121 return; 122 } 123 73 124 if(buffer[i] == '('){ 74 125 //定数マクロ 75 126 76 127 //未完成 128 AddConstData(buffer); 77 129 } 78 130 else{ … … 84 136 } 85 137 138 void CDBConst::AddConst(char *Name, CConst *newconst){ 139 int key = hash_default(Name); 140 141 //ハッシュリストに追加 142 if(ppHash[key]){ 143 CConst *pConst = ppHash[key]; 144 while(pConst->pNext){ 145 pConst = pConst->pNext; 146 } 147 148 pConst->pNext = newconst; 149 } 150 else{ 151 ppHash[key] = newconst; 152 } 153 } 86 154 void CDBConst::AddConst(char *Name, char *Expression){ 87 CConst *newconst = new CConst(Name, Expression); 88 89 //管理クラスへ追加 90 ppobj_Const = (CConst **)realloc( ppobj_Const, (NumOfConst + 1) * sizeof(CConst) ); 91 ppobj_Const[NumOfConst] = newconst; 92 NumOfConst++; 93 } 155 LONG_PTR lpIndex; 156 _int64 i64data; 157 int Type = StaticCalculation(false, Expression, 0, &i64data, &lpIndex); 158 159 if(Type){ 160 //リテラル値の場合 161 //登録を行う 162 163 CConst *newconst = new CConst(Name, Type, i64data); 164 165 AddConst(Name, newconst); 166 } 167 else{ 168 //変数の場合 169 //何もしない(実行領域コンパイル時にdim宣言として扱う) 170 } 171 } 172 void CDBConst::AddConst(char *Name, int value){ 173 CConst *newconst = new CConst(Name, value); 174 175 AddConst(Name, newconst); 176 } 177 178 CConst *CDBConst::GetObjectPtr(char *Name){ 179 //ハッシュ値を取得 180 int key; 181 key=hash_default(Name); 182 183 //格納位置を取得 184 CConst *pConst; 185 pConst=ppHash[key]; 186 while(pConst){ 187 if(lstrcmp(pConst->GetName(),Name)==0) break; 188 189 pConst=pConst->pNext; 190 } 191 192 return pConst; 193 } 194 195 196 int CDBConst::GetType(char *Name){ 197 CConst *pConst = GetObjectPtr(Name); 198 199 if(!pConst) return 0; 200 201 return pConst->GetType(); 202 } 203 _int64 CDBConst::GetWholeData(char *Name){ 204 CConst *pConst = GetObjectPtr(Name); 205 206 if(!pConst) return 0; 207 208 return pConst->GetWholeData(); 209 } 210 double CDBConst::GetDoubleData(char *Name){ 211 CConst *pConst = GetObjectPtr(Name); 212 213 if(!pConst) return 0; 214 215 return pConst->GetDoubleData(); 216 } -
BasicCompiler_Common/Const.h
r5 r7 9 9 CConstBase(char *Name); 10 10 ~CConstBase(); 11 12 char *GetName(); 11 13 }; 12 14 … … 15 17 int Type; 16 18 _int64 i64data; 19 17 20 public: 21 CConst *pNext; 18 22 19 CConst(char *Name, char *Expression); 23 CConst(char *Name, int Type, _int64 i64data); 24 CConst(char *Name, int value); 20 25 ~CConst(); 26 27 int GetType(); 28 _int64 GetWholeData(); 29 double GetDoubleData(); 21 30 }; 22 31 … … 33 42 //定数管理クラス 34 43 class CDBConst{ 35 CConst **ppobj_Const; 36 int NumOfConst; 44 CConst **ppHash; 37 45 38 46 CConstMacro **ppobj_Macro; 39 47 int NumOfMacro; 48 49 //シングルトンクラスなので、プライベートに置く 50 CDBConst(); 51 ~CDBConst(); 52 void _free(); 53 void Free(); 54 40 55 public: 41 56 42 CDBConst(); 43 ~CDBConst(); 57 void Init(); 44 58 45 59 void Add(char *buffer); 60 private: 61 void AddConst(char *Name, CConst *newconst); 62 public: 63 void AddConst(char *Name, char *Expression); 64 void AddConst(char *Name, int value); 46 65 47 void AddConst(char *Name, char *Expression); 66 private: 67 CConst *GetObjectPtr(char *Name); 68 public: 69 70 int GetType(char *Name); 71 _int64 GetWholeData(char *Name); 72 double GetDoubleData(char *Name); 73 74 75 //シングルトンオブジェクト 76 static CDBConst obj; 48 77 }; -
BasicCompiler_Common/Intermediate_Step2.cpp
r4 r7 44 44 return; 45 45 } 46 if(Command[i]=='='||Command[i]=='('){ 46 if(Command[i]=='='){ 47 //定数定義は新しいクラスモジュール(CDBConst)へ移行 48 return; 49 } 50 if(Command[i]=='('){ 47 51 temporary[i]=0; 48 52 break; … … 230 234 231 235 //定数を追加 232 CONSTINFO *pci; 233 pci=GetNewConstHash(temporary); 234 pci->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 235 lstrcpy(pci->name,temporary); 236 pci->type=DEF_LONG; 237 pci->lpIndex=-1; 238 pci->DblValue=(double)NextValue; 239 pci->StrValue=0; 236 CDBConst::obj.AddConst(temporary, NextValue); 240 237 } 241 238 } … … 282 279 temporary[i2]=basbuf[i]; 283 280 } 284 AddConstData(temporary);281 CDBConst::obj.Add(temporary); 285 282 if(basbuf[i]=='\0') break; 286 283 } -
BasicCompiler_Common/NumOpe_GetType.cpp
r5 r7 434 434 ////////////// 435 435 436 i3 =GetConstValue(values[i],&dbl,temporary,&index_stack[sp]);437 if(i3 !=-1){436 i3 = CDBConst::obj.GetType(values[i]); 437 if(i3){ 438 438 type[sp]=i3; 439 439 if(IsRealNumberType(i3)){ -
BasicCompiler_Common/Variable.cpp
r5 r7 1010 1010 if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE); 1011 1011 1012 lstrcpy(GlobalVar[MaxGlobalVarNum].name,name); 1013 if(SubScripts[0]==-1) GlobalVar[MaxGlobalVarNum].bArray=0; 1014 else GlobalVar[MaxGlobalVarNum].bArray=1; 1015 GlobalVar[MaxGlobalVarNum].type=pTypeInfo->type; 1016 GlobalVar[MaxGlobalVarNum].u.index=pTypeInfo->u.lpIndex; 1012 //新しいオブジェクトポインタを取得 1013 VARIABLE *pVar = &GlobalVar[MaxGlobalVarNum]; 1014 1015 //グローバル変数の個数を増加 1016 MaxGlobalVarNum++; 1017 1018 lstrcpy(pVar->name,name); 1019 if(dwFlag & DIMFLAG_CONST) pVar->bConst = 1; 1020 else pVar->bConst = 0; 1021 if(SubScripts[0]==-1) pVar->bArray=0; 1022 else pVar->bArray=1; 1023 pVar->type=pTypeInfo->type; 1024 pVar->u.index=pTypeInfo->u.lpIndex; 1017 1025 1018 1026 //コンストラクタ用パラメータ 1019 GlobalVar[MaxGlobalVarNum].ConstractParameter=(char *)HeapAlloc(hHeap,0,lstrlen(ConstractParameter)+1);1020 lstrcpy( GlobalVar[MaxGlobalVarNum].ConstractParameter,ConstractParameter);1027 pVar->ConstractParameter=(char *)HeapAlloc(hHeap,0,lstrlen(ConstractParameter)+1); 1028 lstrcpy(pVar->ConstractParameter,ConstractParameter); 1021 1029 1022 1030 if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){ 1023 1031 //初期バッファがあるとき 1024 GlobalVar[MaxGlobalVarNum].offset=AllInitGlobalVarSize;1032 pVar->offset=AllInitGlobalVarSize; 1025 1033 AllInitGlobalVarSize+=VarSize; 1026 1034 } 1027 1035 else{ 1028 1036 //初期バッファがないとき 1029 GlobalVar[MaxGlobalVarNum].offset=AllGlobalVarSize | 0x80000000;1037 pVar->offset=AllGlobalVarSize | 0x80000000; 1030 1038 AllGlobalVarSize+=VarSize; 1031 1039 } 1032 1040 1033 1041 //レキシカルスコープ 1034 GlobalVar[MaxGlobalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel(); 1035 GlobalVar[MaxGlobalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1036 GlobalVar[MaxGlobalVarNum].bLiving=TRUE; 1042 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1043 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1044 pVar->bLiving=TRUE; 1045 1046 //エラー用 1047 pVar->source_code_address=cp; 1037 1048 1038 1049 //初期バッファにデータをセット … … 1042 1053 initGlobalBuf, 1043 1054 AllInitGlobalVarSize); 1044 if(InitBuf[0]) 1045 SetInitGlobalData(GlobalVar[MaxGlobalVarNum].offset,1046 GlobalVar[MaxGlobalVarNum].type,1047 GlobalVar[MaxGlobalVarNum].u.index,1048 GlobalVar[MaxGlobalVarNum].SubScripts,1055 if(InitBuf[0]){ 1056 int result = SetInitGlobalData(pVar->offset, 1057 pVar->type, 1058 pVar->u.index, 1059 pVar->SubScripts, 1049 1060 InitBuf); 1050 1061 1051 1052 //エラー用 1053 GlobalVar[MaxGlobalVarNum].source_code_address=cp; 1054 1055 1056 MaxGlobalVarNum++; 1062 if(!result){ 1063 //動的な式だった場合は代入演算を行う 1064 char temporary[8192]; 1065 sprintf(temporary,"%s=%s",name,InitBuf); 1066 OpcodeCalc(temporary); 1067 } 1068 } 1069 1057 1070 1058 1071 -
BasicCompiler_Common/calculation.cpp
r5 r7 627 627 //定数 628 628 ///////// 629 double dbl;630 629 StrPtr[pnum]=0; 631 type[pnum] =GetConstValue(Parms,&dbl,temporary,&before_index[pnum]);632 if(type[pnum] !=-1){630 type[pnum] = CDBConst::obj.GetType(Parms); 631 if(type[pnum]){ 633 632 if(IsRealNumberType(type[pnum])){ 634 633 //実数型 635 nums[pnum]=dbl; 636 } 637 else if(Is64Type(type[pnum])){ 638 //64ビット整数 639 memcpy(&i64nums[pnum],&dbl,sizeof(_int64)); 634 nums[pnum] = CDBConst::obj.GetDoubleData(Parms); 640 635 } 641 636 else if(IsWholeNumberType(type[pnum])){ 642 637 //整数 643 i64nums[pnum] =(_int64)dbl;638 i64nums[pnum] = CDBConst::obj.GetWholeData(Parms); 644 639 } 645 else if(type[pnum]==DEF_STRING){640 /* else if(type[pnum]==DEF_STRING){ 646 641 //リテラル文字列 647 642 … … 652 647 memcpy(Parms,temporary,(int)nums[pnum]); 653 648 goto StrLiteral; 654 } 649 }*/ 655 650 else{ 656 651 //エラー … … 671 666 if(bDebuggingWatchList) return -1; 672 667 //エラー 673 if(enableerror) SetError(3 3,NULL,cp);668 if(enableerror) SetError(3,Parms,cp); 674 669 return 0; 675 670 } … … 1204 1199 int IsStrCalculation(char *Command){ 1205 1200 int i,i2,i3,i4,type,PareNum; 1206 double dbl;1207 1201 char temporary[VN_SIZE],temp2[8192]; 1208 1202 … … 1300 1294 1301 1295 //定数 1302 i3 =GetConstValue(Command+i2,&dbl,temporary,0);1296 i3 = CDBConst::obj.GetType(Command+i2); 1303 1297 if(i3==DEF_STRING) return 1; //文字列 1304 if(i3 !=-1) return 0; //数値1298 if(i3) return 0; //数値 1305 1299 1306 1300 //変数 -
BasicCompiler_Common/common.h
r5 r7 15 15 #include "../BasicCompiler64/CommandValue.h" 16 16 #include "../BasicCompiler64/FunctionValue.h" 17 #define OPCODE_H_PATH "../BasicCompiler64/opcode.h" 17 18 #else 18 19 #include "../BasicCompiler32/resource.h" 19 20 #include "../BasicCompiler32/CommandValue.h" 20 21 #include "../BasicCompiler32/FunctionValue.h" 22 #define OPCODE_H_PATH "../BasicCompiler32/opcode.h" 21 23 #endif 22 24 … … 162 164 163 165 DWORD fRef; 166 167 //定数変数かどうか 168 BOOL bConst; 164 169 165 170 BOOL bArray;
Note:
See TracChangeset
for help on using the changeset viewer.