//+------------------------------------------------------------------------- // // 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 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