/**********************************************************************/ /** Microsoft LAN Manager **/ /** Copyright(c) Microsoft Corp., 1987-1999 **/ /**********************************************************************/ /* symtable.hxx MIDL Compiler Symbol Table Definition This class centralizes access to the symbol table throughout the compiler. */ /* FILE HISTORY : DonnaLi 08-24-1990 Created. */ #ifndef __SYMTABLE_HXX__ #define __SYMTABLE_HXX__ #include "dict.hxx" enum name_t { NAME_UNDEF = 0x0000, NAME_DEF = 0x0001, // for types NAME_PROC = 0x0002, // for procedures (including temp names) NAME_LABEL = 0x0004, // for enum labels NAME_ID = 0x0008, // for any named instance of a type NAME_MEMBER = 0x0010, // for fields and parameters NAME_INTERFACE = 0x0020, // for importing and imported interfaces NAME_FILE = 0x0040, // for imported file names // all tags share the same namespace NAME_TAG = 0x0180, // for struct tags (including temp names) NAME_ENUM = 0x0280, // for enum tags (including temp names) NAME_UNION = 0x0380, // for union tags (including temp names) NAME_MASK = 0x00ff, // mask for unique part } ; typedef name_t NAME_T; /**********************************************************************\ NAME: SymKey SYNOPSIS: Defines the key to the symbol table. INTERFACE: CAVEATS: NOTES: Why can't we use NAME_TAG for struct, union, and enum tags? They live in the same name space. HISTORY: Donnali 08-24-1990 Initial creation Donnali 12-04-1990 Port to Dov's generic dictionary \**********************************************************************/ class SymKey { char * name; // lexeme that serves as key to the SymTable NAME_T kind; // identifies which kind of lexeme public: SymKey() { name = 0; kind = NAME_UNDEF; } SymKey(char * NewName, NAME_T NewKind) { name = NewName; kind = NewKind; } SymKey( SymKey * pNewKey ) { *this = *pNewKey; } char * GetString() { return name; } void SetString(char * psz) { name = psz; } NAME_T GetKind() { return kind; } void SetKind(NAME_T k) { kind = k; } void Print(void) { printf("<%s,%d>", name, kind); } friend class SymTable; friend class CaselessDictionary; friend class CaselessList; friend class GlobalSymTable; friend class CaselessEntry; }; class SymEntry; class CaselessEntry { private: SymEntry * pSymEntry; unsigned hash; public: CaselessEntry(SymEntry * pItem); int Compare(CaselessEntry * pEntry2); friend class CaselessDictionary; friend class GlobalSymTable; friend class SymTable; friend class CaselessList; friend class CaselessEntry; }; class named_node; class CaselessListElement { public: CaselessListElement * pNext; CaselessEntry * pEntry; CaselessListElement(CaselessEntry * p) { pEntry = p; pNext = NULL; } }; class CaselessList { private: CaselessListElement * pHead; public: CaselessList() { pHead = NULL; } ~CaselessList(); CaselessEntry * Add(CaselessEntry * pEl); CaselessEntry * Find(CaselessEntry * pEntry); CaselessEntry * Delete(CaselessEntry * pEntry); CaselessEntry * DeleteExact(CaselessEntry *pEntry); }; /**********************************************************************\ NAME: SymTable SYNOPSIS: Defines the symbol table. INTERFACE: SymTable () Constructor. SymInsert () Inserts a symbol into the symbol table. SymDelete () Deletes a symbol from the symbol table. SymSearch () Searches the symbol table for a symbol. EnterScope () Transition from current scope to inner scope. ExitScope () Transition from current scope to outer scope. CAVEATS: NOTES: HISTORY: Donnali 08-24-1990 Initial creation Donnali 12-04-1990 Port to Dov's generic dictionary \**********************************************************************/ class SymTable : public Dictionary { SymTable * pPrevScope; // pointer to container symbol table BOOL fHasFwds; CaselessList caseless_list; public: SymTable() { pPrevScope = (SymTable *)0; fHasFwds = FALSE; } virtual named_node * SymInsert(SymKey, SymTable *, named_node *); virtual named_node * SymDelete(SymKey); virtual named_node * SymSearch(SymKey); STATUS_T EnterScope(SymKey, SymTable **); STATUS_T ExitScope(SymTable **); void DiscardScope(); void SetHasFwds() { fHasFwds = TRUE; } SSIZE_T Compare (pUserType pL, pUserType pR); virtual void Print(pUserType pItem); void * operator new ( size_t size ) { return AllocateOnceNew( size ); } void operator delete( void * ptr ) { AllocateOnceDelete( ptr ); } }; class CaselessDictionary : public Dictionary { public: CaselessDictionary() { } SSIZE_T Compare (pUserType pL, pUserType pR); void * operator new ( size_t size ) { return AllocateOnceNew( size ); } void operator delete( void * ptr ) { AllocateOnceDelete( ptr ); } }; class GlobalSymTable: public SymTable { private: CaselessDictionary * pCaselessDictionary; public: GlobalSymTable() { pCaselessDictionary = new CaselessDictionary; } virtual named_node * SymInsert(SymKey, SymTable *, named_node *); virtual named_node * SymDelete(SymKey); virtual named_node * SymSearch(SymKey); }; class CSNODE { public: BOOL fStackValue; class CSNODE * pNext; CSNODE(BOOL f, CSNODE * p) { fStackValue = f; pNext = p; } }; class CaseStack { private: CSNODE * pHead; public: CaseStack() { pHead = NULL; } void Push(BOOL fVal) { pHead = new CSNODE(fVal, pHead); } void Pop(BOOL &fVal) { if (!pHead) { // default to case sensitive mode fVal = TRUE; return; } fVal = pHead->fStackValue; CSNODE * pTemp = pHead; pHead = pTemp->pNext; delete pTemp; } }; extern CaseStack gCaseStack; extern BOOL gfCaseSensitive; #endif // __SYMTABLE_HXX__