WindowsXP-SP1/com/rpc/midl/inc/symtable.hxx
2020-09-30 16:53:49 +02:00

294 lines
6.5 KiB
C++

/**********************************************************************/
/** 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__