//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000. // // File: YYBase.cxx // // Contents: Custom base class for YYPARSER // // History: 18-Apr-2000 KitmanH Created // //---------------------------------------------------------------------------- #pragma hdrstop #include "yybase.hxx" #include "parser.h" #include "flexcpp.h" #include "parsepl.h" void StripQuotes(WCHAR *wcsPhrase); //+------------------------------------------------------------------------- // // Member: CTripYYBase::CTripYYBase, public // // Synopsis: Constructor // // Arguments: [ColumnMapper] -- Column Mapper // [locale] -- locale // [yylex] -- Lexer // // History: 18-Apr-2000 KitmanH Created // //-------------------------------------------------------------------------- CTripYYBase::CTripYYBase( IColumnMapper & ColumnMapper, LCID & locale, YYLEXER & yylex ) : _yylex( yylex ), _ColumnMapper(ColumnMapper), _lcid(locale) { InitState(); fDeferredPop = FALSE; } //+------------------------------------------------------------------------- // // Member: CTripYYBase::~CTripYYBase, public // // Synopsis: Destructor // // History: 18-Apr-2000 KitmanH Created // //-------------------------------------------------------------------------- CTripYYBase::~CTripYYBase() { } //+------------------------------------------------------------------------- // // Member: CTripYYBase::yyprimebuffer, public // // Synopsis: Prime lexer with text (passthrough to lexer) // // Arguments: [pszBuffer] -- Buffer // // History: 18-Apr-2000 KitmanH Moved from YYPARSER // //-------------------------------------------------------------------------- void CTripYYBase::yyprimebuffer(const YY_CHAR *pszBuffer) { _yylex.yyprimebuffer(pszBuffer); } //+------------------------------------------------------------------------- // // Member: CTripYYBase::triperror, protected // // Synopsis: Report parsing errors // // Arguments: [szError] -- Error string // // History: 18-Apr-2000 KitmanH Moved from YYPARSER // //-------------------------------------------------------------------------- void CTripYYBase::triperror( char const * szError ) { } //+------------------------------------------------------------------------- // // Member: CTripYYBase::InitState, public // // Synopsis: Initialize property and generate method // // History: 01-Oct-1997 emilyb created // 18-Apr-2000 KitmanH Moved from YYPARSER // //-------------------------------------------------------------------------- void CTripYYBase::InitState(void) { // Push makes a copy of what is passed in. PushProperty(L"contents"); _currentState.iGenerateMethod = GENERATE_METHOD_EXACT; // We don't use xwszPropName field of _currentState. Instead, // we use the prop name stack to get the appropriate propname. } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::GetCurrentProperty, public // // Synopsis: Return info on current prop // // Arguments: [pp_ps] -- filled with CDbColId * for current prop // [dbType] -- set to DBTYPE for current prop // // History: 01-Oct-1997 emilyb created // 10-Apr-1999 KrishnaN Modified to use stack // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::GetCurrentProperty(CDbColId ** pp_ps, DBTYPE *dbType) { // Get the top most property off of the stack and use it if ( S_OK != _ColumnMapper.GetPropInfoFromName( _propNameStack.Get(_propNameStack.Count() - 1), (DBID **) pp_ps, dbType, 0 ) ) THROW( CParserException( QPARSE_E_NO_SUCH_PROPERTY ) ); } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::PushProperty, public // // Synopsis: Pushes current property onto stack. // // Arguments: [pwszProperty] - property // // History: 01-Apr-1998 KrishnaN created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::PushProperty( WCHAR const * wszProperty) { // Make a copy and save it. The copy will be automatically deleted // when the stack self destructs. int iLen = wcslen(wszProperty) + 1; XPtrST xwszPropertyCopy(new WCHAR[iLen]); RtlCopyMemory(xwszPropertyCopy.GetPointer(), wszProperty, sizeof(WCHAR) * iLen); _propNameStack.Push(xwszPropertyCopy.GetPointer()); xwszPropertyCopy.Acquire(); } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::PopProperty, public // // Synopsis: Pops the current property off the stack // // History: 10-Apr-1998 KrishnaN created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::PopProperty(void) { // pop the property name off of the stack and delete it delete _propNameStack.Pop(); } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::SetCurrentGenerate, public // // Synopsis: Sets current generate method // // Arguments: [iGenerateMethod] - generate method // // History: 01-Oct-1997 emilyb created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::SetCurrentGenerate(int iGenerateMethod) { _currentState.iGenerateMethod = iGenerateMethod; } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::GetCurrentGenerate, public // // Synopsis: Return info on current generate method // // Arguments: [iGenerateMethod] -- set to current generate method // // History: 01-Oct-1997 emilyb created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::GetCurrentGenerate(int *iGenerateMethod) { *iGenerateMethod = _currentState.iGenerateMethod; } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::SaveState, public // // Synopsis: Saves current state on state stack, and inits new state // // History: 01-Oct-1997 emilyb created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::SaveState(void) { XPtr xState( new STATE ); xState.GetPointer()->iGenerateMethod = _currentState.iGenerateMethod; // When you save the state, pop the propname off of the // stack and save the ptr. xState.GetPointer()->xwszPropName.Set( _propNameStack.Pop() ); _savedStates.Push( xState.GetPointer() ); xState.Acquire(); InitState(); } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::RestoreState, public // // Synopsis: Restores state from state stack // // History: 01-Oct-1997 emilyb created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- void CTripYYBase::RestoreState(void) { XPtr xState (_savedStates.Pop()); _currentState.iGenerateMethod = xState.GetPointer()->iGenerateMethod; Win4Assert(xState.GetPointer()->xwszPropName.GetPointer()); // Push the saved state onto the stack _propNameStack.Push(xState.GetPointer()->xwszPropName.GetPointer()); xState.GetPointer()->xwszPropName.Acquire(); } //+--------------------------------------------------------------------------- // // Member: CTripYYBase::BuildPhrase // // Synopsis: Builds a phrase node. // // Arguments: [wcsPhrase] - The phrase // [iGenMethod] - The generation method // // History: 01-Apr-1998 KrishnaN created // 18-Apr-2000 KitmanH Moved from YYPARSER // //---------------------------------------------------------------------------- CDbContentRestriction * CTripYYBase::BuildPhrase(WCHAR *wcsPhrase, int iGenMethod) { Win4Assert(wcsPhrase); if (0 == *wcsPhrase) THROW( CException( QPARSE_E_EXPECTING_PHRASE ) ); CDbColId *pps; DBTYPE dbType; GetCurrentProperty(&pps, &dbType); // We used the property. Now pop it off if need be if (fDeferredPop) PopProperty(); // generation method stripped in some cases, but not all. // if it's there, use it LPWSTR pLast = wcsPhrase + wcslen(wcsPhrase) - 1; if (L'"' == *wcsPhrase && L'"' == *pLast) { StripQuotes(wcsPhrase); if (0 == *wcsPhrase) THROW( CException( QPARSE_E_EXPECTING_PHRASE ) ); } else { if ( L'*' == *pLast) // prefix { *pLast-- = L'\0'; SetCurrentGenerate(GENERATE_METHOD_PREFIX); } if ( L'*' == *pLast) // inflect { *pLast-- = L'\0'; SetCurrentGenerate(GENERATE_METHOD_INFLECT); } } int fuzzy; GetCurrentGenerate(&fuzzy); if (0 != iGenMethod) fuzzy = iGenMethod; // Clear generation method so it won't rub off on the following phrase SetCurrentGenerate(GENERATE_METHOD_EXACT); XDbContentRestriction pRest( new CDbContentRestriction (wcsPhrase, *pps, fuzzy, _lcid)); if( pRest.IsNull() || !pRest->IsValid() ) THROW( CException( E_OUTOFMEMORY ) ); return pRest.Acquire(); }