CBotClass* CBotClass::Compile(CBotToken* &p, CBotCStack* pStack) { if ( !IsOfType(p, ID_PUBLIC) ) return NULL; if ( !IsOfType(p, ID_CLASS) ) return NULL; CBotString name = p->GetString(); // a name for the class is there? if (IsOfType(p, TokenTypVar)) { // the class was created by Compile1 CBotClass* pOld = CBotClass::Find(name); if ( IsOfType( p, ID_EXTENDS ) ) { IsOfType(p, TokenTypVar); // necessarily } IsOfType( p, ID_OPBLK); // necessarily while ( pStack->IsOk() && !IsOfType( p, ID_CLBLK ) ) { pOld->CompileDefItem(p, pStack, true); } pOld->m_IsDef = true; // complete definition if (pStack->IsOk()) return pOld; } pStack->SetError(TX_ENDOF, p); return NULL; }
CBotClass* CBotClass::Compile1(CBotToken* &p, CBotCStack* pStack) { if ( !IsOfType(p, ID_PUBLIC) ) { pStack->SetError(TX_NOPUBLIC, p); return NULL; } if ( !IsOfType(p, ID_CLASS) ) return NULL; CBotString name = p->GetString(); CBotClass* pOld = CBotClass::Find(name); if ( pOld != NULL && pOld->m_IsDef ) { pStack->SetError( TX_REDEFCLASS, p ); return NULL; } // a name of the class is there? if (IsOfType(p, TokenTypVar)) { CBotClass* pPapa = NULL; if ( IsOfType( p, ID_EXTENDS ) ) { CBotString name = p->GetString(); pPapa = CBotClass::Find(name); if (!IsOfType(p, TokenTypVar) || pPapa == NULL ) { pStack->SetError( TX_NOCLASS, p ); return NULL; } } CBotClass* classe = (pOld == NULL) ? new CBotClass(name, pPapa) : pOld; classe->Purge(); // emptythe old definitions classe->m_IsDef = false; // current definition if ( !IsOfType( p, ID_OPBLK) ) { pStack->SetError(TX_OPENBLK, p); return NULL; } while ( pStack->IsOk() && !IsOfType( p, ID_CLBLK ) ) { classe->CompileDefItem(p, pStack, false); } if (pStack->IsOk()) return classe; } pStack->SetError(TX_ENDOF, p); return NULL; }