Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

136 lines
3.4 KiB

/**********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1987-1990 **/
/**********************************************************************/
/*
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_TAG = 0x0001, // for struct tags (including temp names)
NAME_DEF = 0x0002, // for types
NAME_PROC = 0x0004, // for procedures (including temp names)
NAME_LABEL = 0x0008, // for enum labels
NAME_ID = 0x0010, // for any named instance of a type
NAME_MEMBER = 0x0020, // for fields and parameters
NAME_ENUM = 0x0040, // for enum tags (including temp names)
NAME_INTERFACE = 0x0080, // for importing and imported interfaces
NAME_UNION = 0x0100, // for union tags (including temp names)
NAME_FILE = 0x0200, // for imported file names
NAME_SDEFINE = 0x0400, // simple macro
NAME_PDEFINE = 0x0800, // parametererised macro
NAME_OTHER = 0x1000
} ;
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;
}
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 void PrintSymbol(void *);
friend int CompareSymbol(void *, void *);
};
class node_skl;
/**********************************************************************\
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
public:
SymTable(
int (* pfnCompare)(void *, void *) = CompareSymbol,
void (* pfnPrint)(void *) = PrintSymbol
);
node_skl * SymInsert(SymKey, SymTable *, node_skl *);
node_skl * SymDelete(SymKey);
node_skl * SymSearch(SymKey);
STATUS_T EnterScope(SymKey, SymTable **);
STATUS_T ExitScope(SymTable **);
};
#endif // __SYMTABLE_HXX__