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.
421 lines
11 KiB
421 lines
11 KiB
/*****************************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1987-1990 **/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************
|
|
File : gramutil.hxx
|
|
Title : grammar utility module
|
|
Description : contains definitions associated with the grammar and
|
|
: associated routines
|
|
History :
|
|
05-Sep-1990 VibhasC Create
|
|
11-Sep-1990 VibhasC Merged gramdefs.hxx into this one for easy
|
|
maintainability
|
|
20-Sep-1990 NateO Safeguards against double inclusion, added
|
|
include of rpctypes, common
|
|
*****************************************************************************/
|
|
#ifndef __GRAMUTIL_HXX__
|
|
#define __GRAMUTIL_HXX__
|
|
|
|
#include "symtable.hxx"
|
|
#include "idict.hxx"
|
|
|
|
|
|
/***************************************************************************
|
|
* prototypes of all grammar related utility routines
|
|
***************************************************************************/
|
|
void BaseTypeSpecAnalysis( struct _type_ana *, short );
|
|
void SignSpecAnalysis( struct _type_ana *, short );
|
|
void SizeSpecAnalysis( struct _type_ana *, short );
|
|
void ParseError( STATUS_T , char *);
|
|
|
|
/***************************************************************************
|
|
* general definitions
|
|
***************************************************************************/
|
|
//
|
|
// definitions for type specification and analysis
|
|
//
|
|
|
|
// basic types
|
|
|
|
#define TYPE_UNDEF (0)
|
|
#define TYPE_INT (1)
|
|
#define TYPE_FLOAT (2)
|
|
#define TYPE_DOUBLE (3)
|
|
#define TYPE_VOID (4)
|
|
#define TYPE_BOOLEAN (5)
|
|
#define TYPE_BYTE (6)
|
|
#define TYPE_HANDLE_T (7)
|
|
#define TYPE_PIPE (8)
|
|
|
|
// sizes of basic types
|
|
|
|
#define SIZE_UNDEF (0)
|
|
#define SIZE_CHAR (1)
|
|
#define SIZE_SHORT (2)
|
|
#define SIZE_LONG (3)
|
|
#define SIZE_HYPER (4)
|
|
#define SIZE_SMALL (5)
|
|
#define SIZE_LONGLONG (6)
|
|
|
|
// signs
|
|
|
|
#define SIGN_UNDEF (0)
|
|
#define SIGN_SIGNED (1)
|
|
#define SIGN_UNSIGNED (2)
|
|
|
|
#define SET_TYPE(x,type) (x = type)
|
|
#define SET_SIZE(x,size) (x = x | (size << 8))
|
|
#define SET_SIGN(x,sign) (x = x | (sign << 12))
|
|
#define GET_TYPE(x) (x & 0xff)
|
|
#define GET_SIZE(x) ((x & 0x0f00) >> 8)
|
|
#define GET_SIGN(x) ((x & 0xf000) >> 12)
|
|
|
|
#define MAKE_TYPE_SPEC(sign,size,type) ((sign << 12) | (size << 8) | type)
|
|
|
|
//
|
|
// array bounds
|
|
//
|
|
#define DEFAULT_LOWER_BOUND (0)
|
|
|
|
/*****************************************************************************
|
|
* definitions local to the parser
|
|
****************************************************************************/
|
|
struct _type_ana
|
|
{
|
|
short TypeSize; // char/short/small/hyper/long/etc
|
|
short BaseType; // int/float/double/void/bool/handle_t ect
|
|
short TypeSign; // signed/unsigned
|
|
};
|
|
struct _list_element
|
|
{
|
|
struct _list_element *pNext; // next list element
|
|
char *pName; // name of the declarator
|
|
class node_skl *pNode; // type graph of declarator
|
|
class expr_init_list *pInit; // initialize
|
|
short fBitField;// bit field size if bitfield
|
|
};
|
|
|
|
struct _decl_element
|
|
{
|
|
class node_skl * pNode; // type node of declarator
|
|
class expr_init_list* pInit; // initializer expression
|
|
short fBitField;// bit field size if bitfield.
|
|
};
|
|
|
|
struct _gen_decl
|
|
{
|
|
short fTypedef;// is there a typedef
|
|
class node_skl *pNode; // type node
|
|
};
|
|
struct _interface_header
|
|
{
|
|
char *pInterfaceName;// interface name
|
|
type_node_list *pInterfaceAttrList;// interface attribute graph
|
|
char *pBaseInterfaceName;// base interface name
|
|
};
|
|
struct _attr_one // needed for attr analysis
|
|
{
|
|
ATTR_SUMMARY AttrSummary[ MAX_ATTR_SUMMARY_ELEMENTS ];
|
|
class node_skl *pNode; // ONE attribute node
|
|
};
|
|
struct _attr_set
|
|
{
|
|
ATTR_SUMMARY AttrSummary[ MAX_ATTR_SUMMARY_ELEMENTS ];
|
|
class type_node_list *pAttrList; // collected attribute type nodes
|
|
};
|
|
struct _numeric
|
|
{
|
|
long Val; // value
|
|
char *pValStr; // value string as user specified
|
|
};
|
|
|
|
|
|
struct _array_bounds
|
|
{
|
|
class expr_node * LowerBound; // lower array bound
|
|
class expr_node * UpperBound; // upper bound
|
|
};
|
|
struct _int_body
|
|
{
|
|
type_node_list *pImports; // import nodes
|
|
node_skl *pNode; // type graph node below interface node
|
|
};
|
|
struct _enlab
|
|
{
|
|
class expr_node * pExpr;
|
|
char * pName;
|
|
unsigned short fSparse;
|
|
};
|
|
struct _enlist
|
|
{
|
|
type_node_list * pEnList;
|
|
class expr_node * pExpr;
|
|
unsigned short fSparse;
|
|
};
|
|
struct _ptrdecl2
|
|
{
|
|
node_skl * pNode;
|
|
type_node_list * pTNList;
|
|
type_node_list * pTNListQ;
|
|
};
|
|
struct _ptrdecl
|
|
{
|
|
node_skl * pNode;
|
|
type_node_list * pTNList;
|
|
};
|
|
struct _define
|
|
{
|
|
char * pName;
|
|
char * pParamList;
|
|
char * pSubsString;
|
|
};
|
|
|
|
struct _en_switch
|
|
{
|
|
class node_skl * pNode;
|
|
class node_base_attr * pSwitch;
|
|
char * pName;
|
|
};
|
|
|
|
struct _nu_caselabel
|
|
{
|
|
class expr_node * pExpr;
|
|
node_base_attr * pDefault;
|
|
};
|
|
|
|
struct _nu_cllist
|
|
{
|
|
class expr_list * pExprList;
|
|
class node_base_attr * pDefault;
|
|
short DefCount;
|
|
};
|
|
|
|
struct _nu_case
|
|
{
|
|
type_node_list * pCaseList;
|
|
short DefCount;
|
|
};
|
|
|
|
struct _nu_cases
|
|
{
|
|
class type_node_list * pCaseList;
|
|
short DefCount;
|
|
};
|
|
|
|
union s_lextype {
|
|
short yy_short;
|
|
USHORT yy_ushort;
|
|
int yy_int;
|
|
long yy_long;
|
|
char * yy_pSymName;
|
|
char * yy_string;
|
|
struct _type_ana yy_type;
|
|
class node_skl * yy_graph;
|
|
struct _decl_element yy_declarator;
|
|
class decl_list_mgr * yy_declarator_set;
|
|
struct _gen_decl yy_gendecl;
|
|
struct _interface_header yy_inthead;
|
|
class type_node_list * yy_tnlist;
|
|
struct _array_bounds yy_abounds;
|
|
struct _int_body yy_intbody;
|
|
class expr_node * yy_expr;
|
|
class expr_list * yy_exprlist;
|
|
struct _numeric yy_numeric;
|
|
struct _enlab yy_enlab;
|
|
struct _enlist yy_enlist;
|
|
struct _ptrdecl yy_ptrdecl;
|
|
struct _ptrdecl2 yy_ptrdecl2;
|
|
struct _gplistmgr * yy_gplm;
|
|
class expr_init_list * yy_initlist;
|
|
ATTR_T yy_attrenum;
|
|
class node_endpoint * yy_endpt;
|
|
class node_base_attr * yy_baseattr;
|
|
struct _define yy_define;
|
|
struct _en_switch yy_en_switch;
|
|
struct _nu_caselabel yy_nucaselabel;
|
|
struct _nu_cllist yy_nucllist;
|
|
struct _nu_case yy_nucase;
|
|
struct _nu_cases yy_nucases;
|
|
};
|
|
|
|
typedef union s_lextype lextype_t;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// predefined type node data base
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
struct _pre_type
|
|
{
|
|
unsigned short TypeSpec;
|
|
class node_skl * pPreAlloc;
|
|
};
|
|
|
|
#define PRE_TYPE_DB_SIZE (22)
|
|
class pre_type_db
|
|
{
|
|
private:
|
|
struct _pre_type TypeDB[ PRE_TYPE_DB_SIZE ];
|
|
public:
|
|
pre_type_db( void );
|
|
STATUS_T GetPreAllocType(node_skl **, unsigned short);
|
|
};
|
|
|
|
//
|
|
// A structure which carries the interface information while the interface
|
|
// is being processed. This is necessary since the interface node and the
|
|
// type graph gets joined after the interface declarations are fully processed
|
|
// and the interface declarations need this while it is being processed.
|
|
//
|
|
|
|
typedef struct _iInfo
|
|
{
|
|
BOOL fLocal;
|
|
ATTR_T InterfacePtrAttribute;
|
|
char * pInterfaceName;
|
|
short CurrentTagNumber;
|
|
BOOL fPtrDefErrorReported;
|
|
BOOL fPtrWarningIssued;
|
|
} IINFO ;
|
|
|
|
class IINFODICT : public ISTACK
|
|
{
|
|
private:
|
|
BOOL fBaseLocal;
|
|
ATTR_T BaseInterfacePtrAttribute;
|
|
char * pBaseInterfaceName;
|
|
public:
|
|
|
|
IINFODICT() : ISTACK( 5 )
|
|
{
|
|
BaseInterfacePtrAttribute = ATTR_NONE;
|
|
}
|
|
|
|
BOOL IsPtrWarningIssued();
|
|
|
|
void SetPtrWarningIssued();
|
|
|
|
void StartNewInterface();
|
|
|
|
void EndNewInterface();
|
|
|
|
void SetInterfacePtrAttribute( ATTR_T A );
|
|
|
|
ATTR_T GetInterfacePtrAttribute();
|
|
|
|
ATTR_T GetBaseInterfacePtrAttribute();
|
|
|
|
void SetInterfaceLocal();
|
|
|
|
BOOL IsInterfaceLocal();
|
|
|
|
void SetInterfaceName( char *p );
|
|
|
|
char * GetInterfaceName();
|
|
|
|
short GetCurrentTagNumber();
|
|
|
|
void IncrementCurrentTagNumber();
|
|
|
|
void SetPtrDefErrorReported();
|
|
|
|
BOOL IsPtrDefErrorReported();
|
|
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// the buck which carries compilation status, synthesised attributes etc
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// graph states
|
|
//
|
|
enum en_graphstates
|
|
{
|
|
GRAPH_INIT
|
|
,GRAPH_LOCALINT = (0x0001) // typedef present
|
|
,GRAPH_NE_UNION_MEMBER = (0x0002) // n.e union member
|
|
,GRAPH_DEFINE = (0x0004) // type was defined
|
|
,GRAPH_USE = (0x0008) // type was used
|
|
,GRAPH_FORWARD = (0x0010) // forward declaration
|
|
,GRAPH_CONF_ARRAY = (0x0020) // conformant array detected
|
|
,GRAPH_LOCAL = (0x0040) // proc is local
|
|
,GRAPH_NOLOCAL = (0x0080) // proc is explicitly nolocal
|
|
,GRAPH_IMPORT_OFF = (0x0100)
|
|
};
|
|
|
|
class gstate
|
|
{
|
|
unsigned short State; // graph state
|
|
class type_node_list *pParentsOfUnion; // list of members which have
|
|
// n.e unions as members
|
|
short cParams; // no of parameters collected
|
|
// so far
|
|
type_node_list * pTypeAttrList; // attributes collected for
|
|
// any typedefs
|
|
class fdecl_list * pFDeclList; // list of forward declarations
|
|
class SymKey * pSKey; // temp symbol key storage
|
|
short ErrCount; // error count
|
|
public:
|
|
gstate( void );
|
|
void SetState( en_graphstates );
|
|
en_graphstates GetState( void );
|
|
void ResetState( unsigned short );
|
|
STATUS_T SetParentOfUnion( class node_skl *);
|
|
STATUS_T GetParentOfUnion( class node_skl **);
|
|
short GetParamCount( void );
|
|
void IncParamCount( void );
|
|
void ResetParamCount( void );
|
|
STATUS_T Init( void );
|
|
STATUS_T GetTypeAttrList(type_node_list **);
|
|
STATUS_T SetTypeAttrList(type_node_list *);
|
|
void ResetTypeAttrList( void );
|
|
void RegisterFDeclaration(node_skl *);
|
|
STATUS_T SetForwardDeclaration(node_skl *);
|
|
STATUS_T SetForwardDeclaration(fdecl_list *);
|
|
STATUS_T GetForwardDeclaration(fdecl_list **);
|
|
STATUS_T ResolveFDeclarations(class SymTable *);
|
|
STATUS_T MergeGStates( class gstate * );
|
|
fdecl_list * GetFDeclList();
|
|
short GetErrCount();
|
|
short IncErrCount();
|
|
};
|
|
|
|
struct fdecl_element
|
|
{
|
|
short Line; // line number where referenced
|
|
char *pFile; // current filename
|
|
class node_forward *pForward;// forward decl node, which has all info
|
|
};
|
|
|
|
class fdecl_list : public gplistmgr
|
|
{
|
|
public:
|
|
fdecl_list( void );
|
|
};
|
|
|
|
class gstatemgr : public gplistmgr
|
|
{
|
|
short CurrentLevel;
|
|
public:
|
|
gstatemgr(void);
|
|
~gstatemgr(void) { };
|
|
STATUS_T PushGraphLevel( gstate ** );
|
|
STATUS_T PopGraphLevel( gstate ** );
|
|
gstate * GetCurrentGraph( void );
|
|
};
|
|
|
|
|
|
class nsa : public gplistmgr
|
|
{
|
|
short CurrentLevel;
|
|
public:
|
|
nsa(void);
|
|
~nsa(void) { };
|
|
STATUS_T PushSymLevel( class SymTable ** );
|
|
STATUS_T PopSymLevel( class SymTable ** );
|
|
short GetCurrentLevel( void );
|
|
class SymTable * GetCurrentSymbolTable( void );
|
|
};
|
|
|
|
#endif
|