mirror of https://github.com/lianthony/NT4.0
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
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__
|