Changeset 102 in dev for BasicCompiler_Common
- Timestamp:
- Apr 29, 2007, 2:34:04 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r101 r102 194 194 } 195 195 196 bool CClass::IsEqualSymbol() const 197 { 198 return false; 196 bool CClass::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const 197 { 198 if( GetName() != name ){ 199 return false; 200 } 201 202 return NamespaceScopes::IsSameArea( GetNamespaceScopes(), namespaceScopes ); 203 } 204 bool CClass::IsEqualSymbol( const CClass &objClass ) const 205 { 206 return IsEqualSymbol( objClass.GetNamespaceScopes(), objClass.GetName() ); 207 } 208 bool CClass::IsEqualSymbol( const string &fullName ) const 209 { 210 char AreaName[VN_SIZE] = ""; //オブジェクト変数 211 char NestName[VN_SIZE] = ""; //入れ子メンバ 212 bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName ); 213 214 return IsEqualSymbol( NamespaceScopes( AreaName ), NestName ); 199 215 } 200 216 … … 735 751 736 752 737 int CDBClass::hash(const char *name) {753 int CDBClass::hash(const char *name) const{ 738 754 int key; 739 755 … … 789 805 } 790 806 791 CClass *CDBClass::check(const char *name){ 807 CClass *CDBClass::Find( const string &fullName ) const 808 { 809 char AreaName[VN_SIZE] = ""; //オブジェクト変数 810 char NestName[VN_SIZE] = ""; //入れ子メンバ 811 bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName ); 812 792 813 int key; 793 key=hash( name);814 key=hash(NestName); 794 815 795 816 if(pobj_ClassHash[key]){ … … 797 818 pobj_c=pobj_ClassHash[key]; 798 819 while(1){ 799 if(lstrcmp(name,pobj_c->name)==0){ 800 //重複した場合 820 if( pobj_c->IsEqualSymbol( fullName ) ){ 821 //名前空間とクラス名が一致した 822 return pobj_c; 823 } 824 825 if(pobj_c->pobj_NextClass==0) break; 826 pobj_c=pobj_c->pobj_NextClass; 827 } 828 } 829 return NULL; 830 } 831 CClass *CDBClass::Find( const NamespaceScopes &namespaceScopes, const string &name ) const 832 { 833 int key; 834 key=hash(name.c_str()); 835 836 if(pobj_ClassHash[key]){ 837 CClass *pobj_c; 838 pobj_c=pobj_ClassHash[key]; 839 while(1){ 840 if( pobj_c->IsEqualSymbol( namespaceScopes, name ) ){ 841 //名前空間とクラス名が一致した 801 842 return pobj_c; 802 843 } … … 838 879 pobj_c2=pobj_ClassHash[key]; 839 880 while(1){ 840 if( lstrcmp(name,pobj_c2->name)==0){841 // 重複した場合881 if( pobj_c2->IsEqualSymbol( namespaceScopes, name ) ){ 882 //名前空間及びクラス名が重複した場合 842 883 SetError(15,name,nowLine); 843 884 return 0; … … 1100 1141 char temporary[8192]; 1101 1142 1143 // 名前空間管理 1144 NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes; 1145 namespaceScopes.clear(); 1146 1102 1147 for(i=0;;i++){ 1103 1148 if(basbuf[i]=='\0') break; 1104 1149 1105 CClass *pobj_c; 1150 1151 // 名前空間 1152 if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){ 1153 for(i+=2,i2=0;;i2++,i++){ 1154 if( IsCommandDelimitation( basbuf[i] ) ){ 1155 temporary[i2]=0; 1156 break; 1157 } 1158 temporary[i2]=basbuf[i]; 1159 } 1160 namespaceScopes.push_back( temporary ); 1161 1162 continue; 1163 } 1164 else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){ 1165 if( namespaceScopes.size() <= 0 ){ 1166 SetError(12, "End Namespace", i ); 1167 } 1168 else{ 1169 namespaceScopes.pop_back(); 1170 } 1171 1172 i += 2; 1173 continue; 1174 } 1175 1176 1106 1177 1107 1178 if(basbuf[i]==1&&basbuf[i+1]==ESC_INTERFACE){ … … 1117 1188 GetIdentifierToken( temporary, basbuf, i ); 1118 1189 1119 pobj_c=pobj_DBClass->check(temporary);1190 CClass *pobj_c=pobj_DBClass->Find(namespaceScopes, temporary); 1120 1191 if(!pobj_c) continue; 1121 1192 … … 1155 1226 1156 1227 //継承元クラスを取得 1157 CClass *pInheritsClass = check(temporary);1228 CClass *pInheritsClass = Find(temporary); 1158 1229 if( !pInheritsClass ){ 1159 1230 SetError(106,temporary,i); … … 1263 1334 GetIdentifierToken( temporary, basbuf, i ); 1264 1335 1265 pobj_c=pobj_DBClass->check(temporary);1336 CClass *pobj_c=pobj_DBClass->Find(namespaceScopes, temporary); 1266 1337 if(!pobj_c) continue; 1267 1338 … … 1320 1391 1321 1392 //継承元クラスを取得 1322 CClass *pInheritsClass = check(temporary);1393 CClass *pInheritsClass = Find(temporary); 1323 1394 if( !pInheritsClass ){ 1324 1395 SetError(106,temporary,i); … … 1328 1399 if( pInheritsClass->IsInterface() ){ 1329 1400 // クラスを継承していないとき 1330 CClass *pObjectClass = check("Object");1401 CClass *pObjectClass = Find("Object"); 1331 1402 if( !pObjectClass ){ 1332 1403 SetError(106,"Object",i); -
BasicCompiler_Common/Class.h
r101 r102 115 115 } 116 116 117 bool IsEqualSymbol() const; 117 const string GetName() const 118 { 119 return name; 120 } 121 122 bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const; 123 bool IsEqualSymbol( const CClass &objClass ) const; 124 bool IsEqualSymbol( const string &name ) const; 118 125 119 126 bool IsUsing() const; … … 232 239 #define MAX_CLASS_HASH 65535 233 240 class CDBClass{ 234 int hash(const char *name) ;241 int hash(const char *name) const; 235 242 void DestroyClass(CClass *pobj_c); 236 243 public: … … 240 247 ~CDBClass(); 241 248 242 CClass *check(const char *name); 249 CClass *Find( const string &fullName ) const; 250 CClass *Find( const NamespaceScopes &namespaceScopes, const string &name ) const; 243 251 244 252 CClass *AddClass( const NamespaceScopes &namespaceScopes, const char *name,int nowLine); -
BasicCompiler_Common/DebugMiddleFile.cpp
r101 r102 28 28 (*p)+=lstrlen(buffer+(*p))+1; 29 29 30 type.SetIndex( (LONG_PTR)pobj_DBClass-> check(szClassName) );30 type.SetIndex( (LONG_PTR)pobj_DBClass->Find(szClassName) ); 31 31 } 32 32 else{ … … 586 586 CClass *pClass = NULL; 587 587 if(szParentClassName[0]) 588 pClass=pobj_DBClass-> check(szParentClassName);588 pClass=pobj_DBClass->Find(szParentClassName); 589 589 590 590 //ID … … 690 690 i2+=lstrlen(buffer+i2)+1; 691 691 692 pobj_c=pobj_DBClass-> check(szClassName);692 pobj_c=pobj_DBClass->Find(szClassName); 693 693 694 694 //仮想関数の数 … … 742 742 CClass *pobj_InheritsClass = NULL; 743 743 if(szInherits[0]){ 744 pobj_InheritsClass=pobj_DBClass-> check(szInherits);744 pobj_InheritsClass=pobj_DBClass->Find(szInherits); 745 745 } 746 746 -
BasicCompiler_Common/NumOpe_GetType.cpp
r98 r102 378 378 379 379 if( pIsClassName ){ 380 if( pobj_DBClass-> check( termFull ) ){380 if( pobj_DBClass->Find( termFull ) ){ 381 381 *pIsClassName = true; 382 382 return true; -
BasicCompiler_Common/Procedure.cpp
r101 r102 512 512 bool GlobalProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const 513 513 { 514 if( namespaceScopes.size() ){ 515 if( GetNamespaceScopes().IsCoverd( namespaceScopes ) ){ 516 if( GetName() == name ){ 517 return true; 518 } 519 } 520 } 521 else{ 522 if( GetNamespaceScopes().size() ){ 523 // 名前空間の判断が必要なとき 524 if( !GetNamespaceScopes().IsUsing() 525 && !GetNamespaceScopes().IsLiving() ){ 526 // この名前空間は暗黙的に参照できないとき 527 return false; 528 } 529 } 530 else{ 531 if( GetName() == name ){ 532 return true; 533 } 534 } 535 } 536 537 return false; 514 if( GetName() != name ){ 515 return false; 516 } 517 518 return NamespaceScopes::IsSameArea( GetNamespaceScopes(), namespaceScopes ); 538 519 } 539 520 bool GlobalProc::IsEqualSymbol( const GlobalProc &globalProc ) const -
BasicCompiler_Common/Type.cpp
r97 r102 96 96 97 97 //クラス 98 CClass *pobj_c = pobj_DBClass-> check( typeName.c_str() );98 CClass *pobj_c = pobj_DBClass->Find( typeName.c_str() ); 99 99 if(pobj_c){ 100 100 type.pClass = pobj_c; -
BasicCompiler_Common/hash.cpp
r101 r102 64 64 else lstrcpy(name,lpszName); 65 65 66 if( (string)lpszName == "Test2.Proc3" ){67 int test=0;68 }69 70 66 char ObjName[VN_SIZE]; //オブジェクト変数 71 67 char NestMember[VN_SIZE]; //入れ子メンバ … … 88 84 } 89 85 else{ 90 pobj_c=pobj_DBClass-> check(ObjName);86 pobj_c=pobj_DBClass->Find(ObjName); 91 87 if( pobj_c ){ 92 88 isStatic = true; … … 186 182 187 183 UserProc *GetClassMethod( const char *className, const char *methodName ){ 188 CClass *pClass = pobj_DBClass-> check( className );184 CClass *pClass = pobj_DBClass->Find( className ); 189 185 if( pClass ){ 190 186 vector<UserProc *> userProcs; -
BasicCompiler_Common/include/Namespace.h
r101 r102 86 86 bool IsCoverd( const string &name ) const; 87 87 bool IsCoverd( const NamespaceScopes &namespaceScopes ) const; 88 89 // 指定された名前空間が同一エリアと見なされるかどうかをチェック 90 static bool IsSameArea( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ){ 91 if( entryNamespaceScopes.size() ){ 92 if( baseNamespaceScopes.IsCoverd( entryNamespaceScopes ) ){ 93 // 包括しているときは同一と見なす 94 return true; 95 } 96 } 97 else{ 98 if( baseNamespaceScopes.size() ){ 99 // 名前空間の判断が必要なとき 100 if( baseNamespaceScopes.IsUsing() 101 || baseNamespaceScopes.IsLiving() ){ 102 // Using指定があるとき 103 // または 104 // 指定された名前空間が現在の名前空間スコープと同一のとき 105 return true; 106 } 107 } 108 else{ 109 return true; 110 } 111 } 112 113 return false; 114 } 88 115 };
Note:
See TracChangeset
for help on using the changeset viewer.