windows-nt/Source/XPSP1/NT/enduser/troubleshoot/bn/bnparse.h
2020-09-26 16:20:57 +08:00

275 lines
7.7 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1997
//
// File: bnparse.h
//
//--------------------------------------------------------------------------
//
// BNPARSE.H
//
#ifndef _BNPARSE_H_
#define _BNPARSE_H_
#include "symtmbn.h" // Symbol table defs
#include "parser.h" // Generated YACC parser header
#include "gmobj.h" // Graphical model object defs
#include "parsfile.h" // Parser file stream thunks
#include "domain.h" // Named domains
#include "tchar.h"
typedef vector<CHAR> VTCHAR;
class DSCPARSER; // The parser
class BNDIST; // A probability distribution
#define YYSTATIC static
#define YYVGLOBAL // Make parse stack "yyv" (only) global, not static
// Manifests to map YACC elements to class DSCPARSER
#define yyparse DSCPARSER::YaccParse
#define YYPARSER DSCPARSER::YaccParse
#define YYLEX TokenNext
#define yylex TokenNext
#define yyerror SyntaxError
#define YYMAXDEPTH 150
struct YYSTYPE
{
union {
UINT ui;
INT integer;
REAL real;
};
ZSREF zsr;
};
extern YYSTYPE yylval, yyval;
extern YYSTYPE yyv[YYMAXDEPTH];
struct PROPVAR
{
enum ETYPE { ETPV_NONE, ETPV_STR, ETPV_REAL } _eType;
ZSREF _zsref; // String
REAL _r; // Real value
PROPVAR ()
: _eType( ETPV_NONE )
{}
PROPVAR ( ZSREF zsr )
: _eType(ETPV_STR),
_r(0.0)
{
_zsref = zsr;
}
PROPVAR ( GOBJMBN * pbnobj )
: _eType(ETPV_STR),
_r(0.0)
{
_zsref = pbnobj->ZsrefName();
}
PROPVAR ( REAL & r )
: _eType(ETPV_REAL),
_r(r)
{}
bool operator == ( const PROPVAR & bnp ) const;
bool operator != ( const PROPVAR & bnp ) const;
bool operator < ( const PROPVAR & bnp ) const;
bool operator > ( const PROPVAR & bnp ) const;
};
// Define VPROPVAR
DEFINEV(PROPVAR);
enum SDPI // status of discrete parent instantiation
{
sdpiAbsent, sdpiPresent, sdpiNotNeeded,
};
DEFINEV(SDPI);
class DSCPARSER
{
protected:
enum
{
_cchTokenMax = 256,
_cstrMax = _cchTokenMax,
_crealMax = _cstrMax,
_csymbMax = 32,
_cuiMax = _csymbMax
};
enum EBLKTYPE
{
EBLKNONE, // No block
EBLKNET, // Network block
EBLKPROP, // Properties block
EBLKNODE, // Node block
EBLKPROB, // Probabilities block
EBLKDOM, // Domain block
EBLKDIST, // Distribution block
EBLKIGN, // Ignore block
};
public:
DSCPARSER ( MBNET & mbnet,
PARSIN & flpIn,
PARSOUT & flpOut );
~ DSCPARSER ();
// Open the target file
bool BInitOpen(SZC szcFile);
// Parse it; return tallies of errors and warnings
bool BParse ( UINT & cError, UINT & cWarning );
// Return the network being built
MBNET & Mbnet ()
{ return _mbnet ; }
protected:
MPSYMTBL & Mpsymtbl () { return _mbnet.Mpsymtbl(); }
MPPD & Mppd () { return _mbnet.Mppd(); }
// Parsing function (in PARSER.Y/PARSER.CPP)
INT YaccParse();
// Parsing functions
GNODEMBND* PgndbnAdd(ZSREF zsr);
void AddSymb(ZSREF zsr);
void AddStr(ZSREF zsr);
void AddPropVar (ZSREF zsr);
void AddPropVar (REAL & r);
void AddPv ( PROPVAR & pv );
void AddUi(UINT ui);
void AddReal(REAL real);
UINT UiDpi(ZSREF zsr);
UINT UiDpi(UINT ui);
void SetNodeFullName(ZSREF zsr);
void SetNodePosition( int x, int y );
void SetCreator(ZSREF zsr);
void SetFormat(ZSREF zsr);
void SetVersion(REAL r);
void SetNetworkSymb(ZSREF zsr);
void ClearNodeInfo();
void SetNodeSymb(ZSREF zsr, bool bNew);
void StartNodeDecl(ZSREF zsr);
void CheckNodeInfo();
void SetNodeCstate(UINT cstate);
void CheckParentList();
void CheckProbVector();
void InitProbEntries();
void CheckProbEntries();
void EmptyProbEntries();
void CheckCIFunc(ZSREF zsr);
void CheckDPI(bool bDefault);
void AddPropType(ZSREF zsrName, UINT fType, ZSREF zsrComment);
void ImportPropStandard();
void ImportProp(ZSREF zsrName);
void ClearCstr();
void ClearVpv();
void CheckProperty( ZSREF zsrName );
void StartProperties();
void EndProperties();
void SetStates();
void CheckDomain(ZSREF zsr);
void ClearDomain();
void SetRanges( bool bLower, REAL rLower, bool bUpper, REAL rUpper);
void SetRanges( ZSREF zsrLower, ZSREF zsrUpper);
void AddRange( ZSREF zsr, bool bSingleton = false );
void SetNodeDomain( ZSREF zsr );
//NYI START
void CheckPDF(ZSREF zsr);
void CheckIdent( ZSREF zsr );
//NYI END
// Lexing functions
TOKEN TokenKeyword();
TOKEN TokenNext();
TOKEN TokenNextBasic();
SZC SzcToken() { return & _vchToken[0]; }
void Warning(SZC szcFormat, ...);
void Error(SZC szcFormat, ...);
void ErrorWarn( bool bErr, SZC szcFormat, va_list & valist );
void ErrorWarn(bool bErr, SZC szcFormat, ...);
void ErrorWarnNode(bool bErr, SZC szcFormat, ...);
void WarningSkip ( ZSREF zsrBlockName );
bool BChNext();
void SkipWS();
void SkipToEOL();
void AddChar ( TCHAR tch = 0 );
void AddCharStr ( TCHAR tch = 0 );
char ChEscape();
void CloseToken(SZC szcTokenType);
void CloseIdentifier();
GOBJMBN * PbnobjFind ( SZC szcName );
GNODEMBND * PgndbnFind ( SZC szcName );
void SkipUntil(SZC szcStop, bool bDidLookAhead = false);
void SyntaxError(SZC szcError);
void ReportNYI (SZC szcWhich);
void PrintDPI ( UINT idpi );
void ResetParser ();
// Return true if current node and its distribution are valid
bool BNodeProbOK () const
{ return _pnode != NULL && _refbndist.BRef(); }
// Return the current distribution reference
REFBNDIST & RefBndist ()
{ return _refbndist; }
// Allocate and identify a new distribution
void CreateBndist ( const VTKNPD & vtknpd, const VIMD & vimdDim );
protected:
// Parsing and lexing control variables
PARSIN & _flpIn; // Input stream
PARSOUT & _flpOut; // Output Stream
char _chCur; // Last character read
char _chUnget; // Pushed-back character (if != 0)
VTCHAR _vchToken; // The current token being built
UINT _cchToken; // Length of token
UINT _iLine; // Line number
UINT _cError; // Error count
UINT _cWarning; // Warning count
UINT _cerrorNode; // Number of errors for current node
TOKEN _tokenCur; // Current token
bool _bUngetToken; // Return current token again?
// Semantic variables
MBNET & _mbnet; // The belief network
GNODEMBND* _pnode; // Current node
BNDIST::EDIST _edist; // Type of distribution
REFBNDIST _refbndist; // Current distribution for the node
VIMD _vimdDim; // Dimensions for dense prob table
UINT _cdpi; // Number of discrete parent instantiations
VSDPI _vsdpi; // Checks discrete parent instantiations
UINT _cui; // DPI checking
INT _idpi; // Number of unprefixed DPIs seen
INT _idpiLast; // Ptable index of last DPI seen
bool _bCI; // Causally independent CPT
bool _bDefault; // Does CPT have have a default entry
bool _bPropDefs; // File had private property definitions
INT _cNode; // Count of node declarations seen
VZSREF _vzsrParent; // Parents of the node
EBLKTYPE _eBlk; // Type of block being parsed
VUINT _vui; // Storage for arrays of integers
VREAL _vreal; // Storage for arrays of reals
VZSREF _vzsr; // Storage for arrays of strings
VPROPVAR _vpv; // Storage for PROPVARs
PROPMGR * _ppropMgr; // Property manager
ESTDLBL _elbl; // Node label
RDOMAIN _domain; // Domain list for domain declarations
RANGELIM _rlimLower; // Lower bound of domain subrange
RANGELIM _rlimUpper; // Upper bound of domain subrange
INT _ilimNext; // Last upper bound given
};
#endif