Changeset 101 in dev for BasicCompiler_Common
- Timestamp:
- Apr 25, 2007, 4:19:28 AM (18 years ago)
- Location:
- BasicCompiler_Common
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r100 r101 144 144 145 145 146 CClass::CClass(const char *name): 146 CClass::CClass( const NamespaceScopes &namespaceScopes, const char *name ): 147 namespaceScopes( namespaceScopes ), 147 148 ConstructorMemberSubIndex( 0 ), 148 149 DestructorMemberSubIndex( 0 ), … … 193 194 } 194 195 196 bool CClass::IsEqualSymbol() const 197 { 198 return false; 199 } 200 195 201 bool CClass::IsUsing() const 196 202 { … … 803 809 } 804 810 805 CClass *CDBClass::AddClass( const char *name,int nowLine){811 CClass *CDBClass::AddClass( const NamespaceScopes &namespaceScopes, const char *name,int nowLine){ 806 812 ////////////////////////////////////////////////////////////////////////// 807 813 // クラスを追加 … … 810 816 811 817 CClass *pobj_c; 812 pobj_c=new CClass(name );818 pobj_c=new CClass(namespaceScopes, name); 813 819 814 820 if(lstrcmp(name,"String")==0){ … … 852 858 void CDBClass::InitNames(void){ 853 859 extern char *basbuf; 854 int i; 860 int i, i2; 861 char temporary[VN_SIZE]; 862 863 // 名前空間管理 864 NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes; 865 namespaceScopes.clear(); 855 866 856 867 for(i=0;;i++){ 857 868 if(basbuf[i]=='\0') break; 869 870 if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){ 871 for(i+=2,i2=0;;i2++,i++){ 872 if( IsCommandDelimitation( basbuf[i] ) ){ 873 temporary[i2]=0; 874 break; 875 } 876 temporary[i2]=basbuf[i]; 877 } 878 namespaceScopes.push_back( temporary ); 879 880 continue; 881 } 882 else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){ 883 if( namespaceScopes.size() <= 0 ){ 884 SetError(12, "End Namespace", i ); 885 } 886 else{ 887 namespaceScopes.pop_back(); 888 } 889 890 i += 2; 891 continue; 892 } 858 893 859 894 if(basbuf[i]==1&&( … … 891 926 892 927 //クラスを追加 893 CClass *pClass = pobj_DBClass->AddClass( temporary,nowLine);928 CClass *pClass = pobj_DBClass->AddClass(namespaceScopes, temporary,nowLine); 894 929 if( pClass ){ 895 930 if( basbuf[nowLine+1] == ESC_CLASS ){ -
BasicCompiler_Common/Class.h
r100 r101 61 61 friend CDBClass; 62 62 friend CDebugSection; 63 64 // 名前空間 65 NamespaceScopes namespaceScopes; 63 66 64 67 //静的メンバ情報 … … 104 107 105 108 public: 106 CClass( const char *name);109 CClass( const NamespaceScopes &namespaceScopes, const char *name ); 107 110 ~CClass(); 111 112 virtual const NamespaceScopes &GetNamespaceScopes() const 113 { 114 return namespaceScopes; 115 } 116 117 bool IsEqualSymbol() const; 108 118 109 119 bool IsUsing() const; … … 232 242 CClass *check(const char *name); 233 243 234 CClass *AddClass( const char *name,int nowLine);244 CClass *AddClass( const NamespaceScopes &namespaceScopes, const char *name,int nowLine); 235 245 236 246 void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection); -
BasicCompiler_Common/DebugMiddleFile.cpp
r100 r101 486 486 for(i3=0;i3<iMaxClassCount;i3++){ 487 487 //クラス名 488 pobj_DBClass->AddClass(buffer+i2,0); 488 // TODO: 名前空間が未完成 489 pobj_DBClass->AddClass(NamespaceScopes(),buffer+i2,0); 489 490 i2+=lstrlen(buffer+i2)+1; 490 491 } -
BasicCompiler_Common/Procedure.cpp
r100 r101 370 370 return ( pMethod->bVirtual != 0 ); 371 371 } 372 bool UserProc::EqualName( const string &name ) const 372 const NamespaceScopes &UserProc::GetNamespaceScopes() const 373 { 374 if( !pParentClass ){ 375 SetError(); 376 } 377 return pParentClass->GetNamespaceScopes(); 378 } 379 bool UserProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const 373 380 { 374 381 SetError(); 375 return true;382 return false; 376 383 } 377 384 … … 503 510 return true; 504 511 } 505 bool GlobalProc:: EqualName(const string &name ) const512 bool GlobalProc::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const 506 513 { 507 char AreaName[VN_SIZE]; //オブジェクト変数 508 char NestName[VN_SIZE]; //入れ子メンバ 509 bool isNest = SplitMemberName( name.c_str(), AreaName, NestName ); 510 511 if( isNest ){ 512 if( GetNamespaceScopes().Equal( AreaName ) ){ 513 if( GetName() == NestName ){ 514 if( namespaceScopes.size() ){ 515 if( GetNamespaceScopes().IsCoverd( namespaceScopes ) ){ 516 if( GetName() == name ){ 514 517 return true; 515 518 } … … 519 522 if( GetNamespaceScopes().size() ){ 520 523 // 名前空間の判断が必要なとき 521 if( !GetNamespaceScopes().IsUsing() ){ 524 if( !GetNamespaceScopes().IsUsing() 525 && !GetNamespaceScopes().IsLiving() ){ 522 526 // この名前空間は暗黙的に参照できないとき 523 527 return false; 524 528 } 525 529 } 526 if( GetName() == name ){ 527 return true; 530 else{ 531 if( GetName() == name ){ 532 return true; 533 } 528 534 } 529 535 } 530 536 531 537 return false; 538 } 539 bool GlobalProc::IsEqualSymbol( const GlobalProc &globalProc ) const 540 { 541 return IsEqualSymbol( globalProc.GetNamespaceScopes(), globalProc.GetName() ); 542 } 543 bool GlobalProc::IsEqualSymbol( const string &fullName ) const 544 { 545 char AreaName[VN_SIZE] = ""; //オブジェクト変数 546 char NestName[VN_SIZE] = ""; //入れ子メンバ 547 bool isNest = SplitMemberName( fullName.c_str(), AreaName, NestName ); 548 549 return IsEqualSymbol( NamespaceScopes( AreaName ), NestName ); 532 550 } 533 551 -
BasicCompiler_Common/Procedure.h
r100 r101 221 221 } 222 222 223 virtual const NamespaceScopes &GetNamespaceScopes() const; 224 virtual bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const; 225 223 226 // ローカル変数 224 227 Variables localVars; … … 249 252 return *pCompilingUserProc; 250 253 } 251 252 virtual bool EqualName( const string &name ) const;253 254 }; 254 255 … … 270 271 bool AddGlobalProc( const NamespaceScopes &namespaceScopes, char *buffer,int nowLine ); 271 272 272 const NamespaceScopes &GetNamespaceScopes() const273 virtual const NamespaceScopes &GetNamespaceScopes() const 273 274 { 274 275 return namespaceScopes; 275 276 } 276 277 277 virtual bool EqualName( const string &name ) const; 278 virtual bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const; 279 virtual bool IsEqualSymbol( const GlobalProc &globalProc ) const; 280 virtual bool IsEqualSymbol( const string &name ) const; 278 281 }; 279 282 -
BasicCompiler_Common/Subroutine.cpp
r100 r101 618 618 if(pobj_c==psi2->GetParentClassPtr()){ 619 619 //重複エラーチェックを行う 620 if( pUserProc-> GetName() == psi2->GetName() ){620 if( pUserProc->IsEqualSymbol( *psi2 ) ){ 621 621 if( Parameter::Equals( psi2->Params(), pUserProc->Params() ) ){ 622 622 SetError(15,pUserProc->GetName().c_str(),nowLine); … … 661 661 662 662 // 名前空間管理 663 NamespaceScopes namespaceScopes; 663 NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes; 664 namespaceScopes.clear(); 664 665 665 666 i=-1; -
BasicCompiler_Common/hash.cpp
r100 r101 64 64 else lstrcpy(name,lpszName); 65 65 66 if( (string)lpszName == "Test2.Proc3" ){ 67 int test=0; 68 } 66 69 67 70 char ObjName[VN_SIZE]; //オブジェクト変数 … … 92 95 } 93 96 94 if( pobj_c ){97 if( pobj_c && pobj_c != (CClass *)-1 ){ 95 98 if( isStatic ){ 96 99 // 静的メソッドから列挙 … … 131 134 while(pUserProc){ 132 135 if(!pUserProc->GetParentClassPtr()){ 133 if( pUserProc-> EqualName( name ) ){136 if( pUserProc->IsEqualSymbol( name ) ){ 134 137 subs.push_back( pUserProc ); 135 138 } -
BasicCompiler_Common/include/Namespace.h
r100 r101 11 11 public: 12 12 NamespaceScopes(){} 13 NamespaceScopes( const char *name ); 13 14 ~NamespaceScopes(){} 14 15 15 void ToString( string &namespaceStr) const16 string ToString() const 16 17 { 18 string namespaceStr; 17 19 const vector<string> &me = *this; 18 20 … … 28 30 namespaceStr += itemStr; 29 31 } 32 return namespaceStr; 30 33 } 31 34 32 bool Equal( const string &name ) const 35 // 等しいかをチェック 36 bool IsEqual( const string &name ) const 33 37 { 34 string tempName; 35 ToString( tempName ); 36 if( tempName == name ){ 38 if( ToString() == name ){ 37 39 return true; 38 40 } … … 40 42 } 41 43 44 // 等しいかをチェック 45 bool IsEqual( const NamespaceScopes &namespaceScopes ) const 46 { 47 if( ToString() == namespaceScopes.ToString() ){ 48 return true; 49 } 50 return false; 51 } 52 53 // 所属しているかをチェック 54 // 例: 55 // baseNamespaceScopes = "Discoversoft" 56 // entryNamespaceScopes = "Discoversoft.ActiveBasic" 57 // この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。 58 static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) 59 { 60 if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){ 61 return false; 62 } 63 64 for( int i=0; i<(int)baseNamespaceScopes.size(); i++ ){ 65 if( baseNamespaceScopes[i] != entryNamespaceScopes[i] ){ 66 return false; 67 } 68 } 69 return true; 70 } 71 42 72 bool IsUsing() const 43 73 { 74 // TODO: 実装 44 75 return false; 45 76 } 77 78 bool IsLiving() const; 79 80 // 包括しているかをチェック 81 // 例: 82 // this = "Discoversoft.ActiveBasic" 83 // living = "Discoversoft.ActiveBasic" 84 // name = "ActiveBasic" 85 // この場合、living は name を包括している。 86 bool IsCoverd( const string &name ) const; 87 bool IsCoverd( const NamespaceScopes &namespaceScopes ) const; 46 88 }; -
BasicCompiler_Common/include/Smoothie.h
r100 r101 40 40 public: 41 41 static BasicSource source; 42 static NamespaceScopes liveingNamespaceScopes; 42 43 }; 43 44 -
BasicCompiler_Common/src/Smoothie.cpp
r91 r101 4 4 5 5 BasicSource Smoothie::Lexical::source; 6 NamespaceScopes Smoothie::Lexical::liveingNamespaceScopes; 6 7 7 8 TypeDefCollection Smoothie::Meta::typeDefs;
Note:
See TracChangeset
for help on using the changeset viewer.