windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/triplish/yybase.hxx
2020-09-26 16:20:57 +08:00

157 lines
3.8 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: YYBase.hxx
//
// Contents: Custom base class for YYPARSER
//
// History: 18-Apr-2000 KitmanH Created
//
//----------------------------------------------------------------------------
#pragma once
#include "parsepl.h"
#include <dynstack.hxx>
#include <set.hxx>
class YYLEXER;
class CValueParser;
typedef struct
{
CDbColId *pps;
DBTYPE dbType;
} PROPINFO;
typedef struct
{
int iGenerateMethod;
XPtrST<WCHAR> xwszPropName;
} STATE;
//+---------------------------------------------------------------------------
//
// Class: CTripYYBase
//
// Purpose: Custom base class for BYACC-based parser. Encapsulates
// Tripoli-specific features and data members.
//
// History: 18-Apr-2000 KitmanH Created
//
//----------------------------------------------------------------------------
class CTripYYBase
{
public:
CTripYYBase( IColumnMapper & ColumnMapper,
LCID & locale,
YYLEXER & yylex );
~CTripYYBase();
#ifdef YYAPI_VALUETYPE
CDbRestriction* GetParseTreeEx(); // Get result of parse
#endif
//
// Members used in YYPARSER
//
void InitState(void);
void PushProperty(WCHAR const * wszProperty);
void PopProperty(void);
void SetCurrentGenerate(int iGenerateMethod);
void SaveState(void);
void RestoreState(void);
void GetCurrentProperty(CDbColId ** pp_ps, DBTYPE *dbType);
void GetCurrentGenerate(int *iGenerateMethod);
void SetDebug();
CDbContentRestriction *BuildPhrase(WCHAR *wcsPhrase, int iGenMethod);
//
// Lexer pass-through
//
void yyprimebuffer(const YY_CHAR *pszBuffer);
protected:
void triperror( char const * szError );
YYLEXER & _yylex;
void Trace(TCHAR *message);
void Trace(TCHAR *message, const TCHAR *tokname, short state = 0);
void Trace(TCHAR *message, int state, short tostate = 0, short token = 0);
friend class YYLEXER;
// Storage to get things de-allocated from the parser stack if the parser throws
TSet< CDbRestriction > _setRst;
TSet< CStorageVariant > _setStgVar;
TSet< CValueParser > _setValueParser;
// Remember state
BOOL fDeferredPop;
LCID _lcid;
private:
IColumnMapper & _ColumnMapper;
STATE _currentState;
CDynStack<STATE> _savedStates;
CDynStack<WCHAR> _propNameStack;
};
//+---------------------------------------------------------------------------
//
// Class: CValueParser
//
// Purpose: To intepret a sequence of tokens from a scanner
// and place the results in a CStorageVariant
//
// Notes: This class throws CParserException when errors occur.
// Copied from CPropertyValueParser, and updated to
// set value in AddValue rather than ctor.
//
// History: 02-Mar-95 t-colinb Created.
// 01-Oct-97 emilyb copied from CPropertyValueParser
// 02-Sep-98 KLam Added locale.
//
//----------------------------------------------------------------------------
class CValueParser
{
public :
CValueParser( BOOL fVectorElement, DBTYPE PropType, LCID locale );
void AddValue(WCHAR const * pwszValue);
CStorageVariant *AcquireStgVariant( void )
{
return _pStgVariant.Acquire();
}
private :
BOOL CheckForRelativeDate( WCHAR const * phrase, FILETIME & ft );
void ParseDateTime( WCHAR const * phrase, FILETIME & ft );
LCID _locale;
XPtr<CStorageVariant> _pStgVariant;
BOOL _fVector;
DBTYPE _PropType;
unsigned _cElements;
};