309 lines
7.8 KiB
C++
309 lines
7.8 KiB
C++
/*++
|
||
|
||
Copyright (C) 1996-2001 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
QL.H
|
||
|
||
Abstract:
|
||
|
||
Level 1 Syntax QL Parser
|
||
|
||
Implements the syntax described in QL.BNF. This translates the input
|
||
into an RPN stream of tokens.
|
||
|
||
History:
|
||
|
||
raymcc 21-Jun-96 Created.
|
||
|
||
--*/
|
||
|
||
#ifndef _QL__H_
|
||
#define _QL__H_
|
||
|
||
#include <wbemidl.h>
|
||
#include <wbemint.h>
|
||
#include <qllex.h>
|
||
#include <corepol.h>
|
||
#include <parmdefs.h>
|
||
#include <stdio.h>
|
||
#include <wmiutils.h>
|
||
|
||
class CPropertyName : public WBEM_PROPERTY_NAME
|
||
{
|
||
protected:
|
||
long m_lAllocated;
|
||
|
||
void EnsureAllocated(long lElements);
|
||
public:
|
||
void Init();
|
||
CPropertyName() {Init();}
|
||
CPropertyName(const CPropertyName& Other);
|
||
void operator=(const CPropertyName& Other);
|
||
void operator=(const WBEM_PROPERTY_NAME& Other);
|
||
BOOL operator==(const WBEM_PROPERTY_NAME& Other);
|
||
|
||
void Empty();
|
||
~CPropertyName() {Empty();}
|
||
|
||
long GetNumElements() const {return m_lNumElements;}
|
||
LPCWSTR GetStringAt(long lIndex) const;
|
||
void AddElement(LPCWSTR wszElement);
|
||
DELETE_ME LPWSTR GetText();
|
||
};
|
||
|
||
class CQl1ParseSink
|
||
{
|
||
public:
|
||
virtual void SetClassName(LPCWSTR wszClass) = 0;
|
||
virtual void SetTolerance(const WBEM_QL1_TOLERANCE& Tolerance) = 0;
|
||
virtual void AddToken(const WBEM_QL1_TOKEN& Token) = 0;
|
||
virtual void AddProperty(const CPropertyName& Property) = 0;
|
||
virtual void AddAllProperties() = 0;
|
||
|
||
virtual void SetAggregated() = 0;
|
||
virtual void SetAggregationTolerance(const WBEM_QL1_TOLERANCE& Tolerance)= 0;
|
||
virtual void AddAggregationProperty(const CPropertyName& Property) = 0;
|
||
virtual void AddAllAggregationProperties() = 0;
|
||
virtual void AddHavingToken(const WBEM_QL1_TOKEN& Token) = 0;
|
||
|
||
virtual void InOrder(long lOp){}
|
||
};
|
||
|
||
class CAbstractQl1Parser
|
||
{
|
||
protected:
|
||
// Controls keyword parsing in Next().
|
||
// ===================================
|
||
enum {
|
||
NO_KEYWORDS = 0,
|
||
ALL_KEYWORDS,
|
||
EXCLUDE_GROUP_KEYWORD,
|
||
EXCLUDE_EXPRESSION_KEYWORDS
|
||
};
|
||
|
||
CQl1ParseSink* m_pSink;
|
||
CGenLexer *m_pLexer;
|
||
int m_nLine;
|
||
wchar_t* m_pTokenText;
|
||
int m_nCurrentToken;
|
||
|
||
// Semantic transfer variables.
|
||
// ============================
|
||
VARIANT m_vTypedConst;
|
||
BOOL m_bQuoted;
|
||
int m_nRelOp;
|
||
DWORD m_dwConstFunction;
|
||
DWORD m_dwPropFunction;
|
||
CPropertyName m_PropertyName;
|
||
BOOL m_bInAggregation;
|
||
CPropertyName m_PropertyName2;
|
||
BOOL m_bPropComp;
|
||
|
||
// Parsing functions.
|
||
// ==================
|
||
virtual BOOL Next(int nFlags = ALL_KEYWORDS);
|
||
LPCWSTR GetSinglePropertyName();
|
||
void DeletePropertyName();
|
||
int FlipOperator(int nOp);
|
||
void AddAppropriateToken(const WBEM_QL1_TOKEN& Token);
|
||
|
||
int parse_property_name(CPropertyName& Prop);
|
||
|
||
int parse(int nFlags);
|
||
|
||
int prop_list();
|
||
int class_name();
|
||
int tolerance();
|
||
int opt_where();
|
||
int expr();
|
||
int property_name();
|
||
int prop_list_2();
|
||
int term();
|
||
int expr2();
|
||
int simple_expr();
|
||
int term2();
|
||
int leading_ident_expr();
|
||
int finalize();
|
||
int rel_operator();
|
||
int equiv_operator();
|
||
int comp_operator();
|
||
int is_operator();
|
||
int trailing_prop_expr();
|
||
int trailing_prop_expr2();
|
||
int trailing_or_null();
|
||
int trailing_const_expr();
|
||
int trailing_ident_expr();
|
||
int unknown_func_expr();
|
||
int typed_constant();
|
||
int opt_aggregation();
|
||
int aggregation_params();
|
||
int aggregate_by();
|
||
int aggregate_within();
|
||
int opt_having();
|
||
|
||
static DWORD TranslateIntrinsic(LPCWSTR pFuncName);
|
||
static void InitToken(WBEM_QL1_TOKEN* pToken);
|
||
public:
|
||
enum {
|
||
SUCCESS = 0,
|
||
SYNTAX_ERROR,
|
||
LEXICAL_ERROR,
|
||
FAILED,
|
||
BUFFER_TOO_SMALL
|
||
};
|
||
|
||
enum {
|
||
FULL_PARSE = 0,
|
||
NO_WHERE,
|
||
JUST_WHERE
|
||
};
|
||
|
||
CAbstractQl1Parser(CGenLexSource *pSrc);
|
||
virtual ~CAbstractQl1Parser();
|
||
|
||
int Parse(CQl1ParseSink* pSink, int nFlags);
|
||
|
||
int CurrentLine() { return m_nLine; }
|
||
LPWSTR CurrentToken() { return m_pTokenText; }
|
||
};
|
||
|
||
|
||
|
||
struct QL_LEVEL_1_TOKEN
|
||
{
|
||
enum
|
||
{
|
||
OP_EXPRESSION = QL1_OP_EXPRESSION,
|
||
TOKEN_AND = QL1_AND,
|
||
TOKEN_OR = QL1_OR,
|
||
TOKEN_NOT = QL1_NOT
|
||
};
|
||
enum
|
||
{
|
||
IFUNC_NONE = QL1_FUNCTION_NONE,
|
||
IFUNC_UPPER = QL1_FUNCTION_UPPER,
|
||
IFUNC_LOWER = QL1_FUNCTION_LOWER
|
||
};
|
||
|
||
// If the field is a OP_EXPRESSION, then the following are used.
|
||
enum
|
||
{
|
||
OP_EQUAL = QL1_OPERATOR_EQUALS,
|
||
OP_NOT_EQUAL = QL1_OPERATOR_NOTEQUALS,
|
||
OP_EQUALorGREATERTHAN = QL1_OPERATOR_GREATEROREQUALS,
|
||
OP_EQUALorLESSTHAN = QL1_OPERATOR_LESSOREQUALS,
|
||
OP_LESSTHAN = QL1_OPERATOR_LESS,
|
||
OP_GREATERTHAN = QL1_OPERATOR_GREATER,
|
||
OP_LIKE = QL1_OPERATOR_LIKE
|
||
};
|
||
|
||
int nTokenType; // OP_EXPRESSION,TOKEN_AND, TOKEN_OR, TOKEN_NOT
|
||
CPropertyName PropertyName;
|
||
// Name of the property on which the operator is applied
|
||
int nOperator; // Operator that is applied on property
|
||
VARIANT vConstValue; // Value applied by operator
|
||
BOOL bQuoted; // FALSE if the string should not have quotes around it.
|
||
|
||
CPropertyName PropertyName2; // Property to compare, if applicable.
|
||
BOOL m_bPropComp; // TRUE if this is a property-to-property compare.
|
||
|
||
DWORD dwPropertyFunction; // 0=no instrinsic function applied
|
||
DWORD dwConstFunction; // "
|
||
|
||
QL_LEVEL_1_TOKEN();
|
||
QL_LEVEL_1_TOKEN(const QL_LEVEL_1_TOKEN&);
|
||
~QL_LEVEL_1_TOKEN();
|
||
QL_LEVEL_1_TOKEN& operator=(const QL_LEVEL_1_TOKEN &Src);
|
||
QL_LEVEL_1_TOKEN& operator=(const WBEM_QL1_TOKEN &Src);
|
||
|
||
void Dump(FILE *);
|
||
DELETE_ME LPWSTR GetText();
|
||
};
|
||
|
||
|
||
// Contains RPN version of expression.
|
||
// ===================================
|
||
|
||
struct QL_LEVEL_1_RPN_EXPRESSION : public CQl1ParseSink
|
||
{
|
||
int nNumTokens;
|
||
int nCurSize;
|
||
QL_LEVEL_1_TOKEN *pArrayOfTokens;
|
||
BSTR bsClassName;
|
||
WBEM_QL1_TOLERANCE Tolerance;
|
||
|
||
int nNumberOfProperties; // Zero means all properties selected
|
||
int nCurPropSize;
|
||
BOOL bStar;
|
||
CPropertyName *pRequestedPropertyNames;
|
||
// Array of property names which values are to be returned if
|
||
|
||
BOOL bAggregated;
|
||
WBEM_QL1_TOLERANCE AggregationTolerance;
|
||
BOOL bAggregateAll;
|
||
int nNumAggregatedProperties;
|
||
int nCurAggPropSize;
|
||
CPropertyName *pAggregatedPropertyNames;
|
||
|
||
int nNumHavingTokens;
|
||
int nCurHavingSize;
|
||
QL_LEVEL_1_TOKEN *pArrayOfHavingTokens;
|
||
|
||
long lRefCount;
|
||
|
||
QL_LEVEL_1_RPN_EXPRESSION();
|
||
QL_LEVEL_1_RPN_EXPRESSION(const QL_LEVEL_1_RPN_EXPRESSION& Other);
|
||
~QL_LEVEL_1_RPN_EXPRESSION();
|
||
void AddRef();
|
||
void Release();
|
||
|
||
void SetClassName(LPCWSTR wszName);
|
||
void SetTolerance(const WBEM_QL1_TOLERANCE& Tolerance);
|
||
void AddToken(const WBEM_QL1_TOKEN& Tok);
|
||
void AddToken(const QL_LEVEL_1_TOKEN& Tok);
|
||
void AddProperty(const CPropertyName& Prop);
|
||
void AddAllProperties();
|
||
|
||
void SetAggregated();
|
||
void SetAggregationTolerance(const WBEM_QL1_TOLERANCE& Tolerance);
|
||
void AddAggregationProperty(const CPropertyName& Property);
|
||
void AddAllAggregationProperties();
|
||
void AddHavingToken(const WBEM_QL1_TOKEN& Tok);
|
||
|
||
void Dump(const char *pszTextFile);
|
||
DELETE_ME LPWSTR GetText();
|
||
};
|
||
|
||
|
||
class QL1_Parser : public CAbstractQl1Parser
|
||
{
|
||
QL_LEVEL_1_RPN_EXPRESSION* m_pExpression;
|
||
BOOL m_bPartiallyParsed;
|
||
|
||
public:
|
||
QL1_Parser(CGenLexSource *pSrc);
|
||
#undef ExportClass
|
||
#define ExportClass SMSEXPORT
|
||
~QL1_Parser();
|
||
#undef ExportClass
|
||
#define ExportClass SMSIMPORT
|
||
|
||
|
||
int GetQueryClass(LPWSTR pBuf, int nBufSize);
|
||
|
||
int Parse(QL_LEVEL_1_RPN_EXPRESSION **pOutput);
|
||
|
||
HRESULT Parse(
|
||
SWbemRpnEncodedQuery **pOutput
|
||
);
|
||
|
||
static LPWSTR ReplaceClassName(QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
||
LPCWSTR wszClassName);
|
||
};
|
||
|
||
#endif
|
||
|
||
|
||
|