275 lines
7.7 KiB
C++
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
|