Sql_1.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*++
  2. // Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved 
  3. Module Name:
  4.     SQL_1.H
  5. Abstract:
  6.     Level 1 Syntax SQL Parser
  7. History:
  8. --*/
  9. #ifndef _SQL_1_H_
  10. #define _SQL_1_H_
  11. struct SQL_LEVEL_1_TOKEN
  12. {
  13.     enum { OP_EXPRESSION = 1, TOKEN_AND, TOKEN_OR, TOKEN_NOT };
  14.     enum { IFUNC_NONE = 0, IFUNC_UPPER = 1, IFUNC_LOWER = 2 };
  15.     int nTokenType; //  OP_EXPRESSION,TOKEN_AND, TOKEN_OR, TOKEN_NOT
  16.     
  17.     // If the field is a OP_EXPRESSION, then the following are used.
  18.     enum { OP_EQUAL = 1, OP_NOT_EQUAL, OP_EQUALorGREATERTHAN,
  19.        OP_EQUALorLESSTHAN, OP_LESSTHAN, OP_GREATERTHAN, OP_LIKE };
  20.     
  21.     BSTR    pPropertyName; // Name of the property on which the operator is applied
  22.     int     nOperator; // Operator that is applied on property
  23.     BOOL bConstIsStrNumeric; // True if the vConstValue is a BSTR and is a UINT32 or any 64bit number
  24. VARIANT vConstValue; // Value applied by operator
  25.     BSTR    pPropName2;         // Property compared to.
  26.     DWORD   dwPropertyFunction; // 0=no instrinsic function applied
  27.     DWORD   dwConstFunction;    // "
  28.     
  29.     SQL_LEVEL_1_TOKEN();
  30.     SQL_LEVEL_1_TOKEN(SQL_LEVEL_1_TOKEN&);
  31.    ~SQL_LEVEL_1_TOKEN(); 
  32.     SQL_LEVEL_1_TOKEN& operator=(SQL_LEVEL_1_TOKEN &Src);
  33.     
  34.     void Dump(FILE *);
  35. };
  36. // Contains RPN version of expression.
  37. // ===================================
  38. struct SQL_LEVEL_1_RPN_EXPRESSION
  39. {
  40.     int nNumTokens;
  41.     int nCurSize;
  42.     SQL_LEVEL_1_TOKEN *pArrayOfTokens;
  43.     BSTR bsClassName;
  44. int nNumberOfProperties;          // Zero means all properties selected
  45.     int nCurPropSize;
  46. BSTR *pbsRequestedPropertyNames;  // Array of property names which values are to be returned if
  47.     
  48.     SQL_LEVEL_1_RPN_EXPRESSION();
  49.    ~SQL_LEVEL_1_RPN_EXPRESSION();
  50.    
  51.    //Note: this method deletes the token it is passed as an argument
  52.     void AddToken(SQL_LEVEL_1_TOKEN *pTok);
  53.     void AddToken(SQL_LEVEL_1_TOKEN &pTok);
  54.     void AddProperty(LPWSTR pProp);
  55.     void Dump(const char *pszTextFile);
  56. };
  57. class SQL1_Parser
  58. {
  59.     CGenLexer *m_pLexer;
  60.     int        m_nLine;
  61.     wchar_t*   m_pTokenText;
  62.     int        m_nCurrentToken;
  63.     SQL_LEVEL_1_RPN_EXPRESSION* m_pExpression;
  64. //Cleanup used by d'tor and SetSource
  65. void Cleanup();
  66. //Init used by c'tor and SetSource
  67. void Init(CGenLexSource *pSrc);
  68.     // Semantic transfer variables.
  69.     // ============================
  70.     VARIANT    m_vTypedConst;
  71.     int        m_nRelOp;
  72.     DWORD      m_dwConstFunction;
  73.     DWORD      m_dwPropFunction;
  74.     LPWSTR     m_pIdent;
  75.     LPWSTR     m_pPropComp;
  76. BOOL       m_bConstIsStrNumeric;
  77.         
  78.     // Parsing functions.
  79.     // ==================
  80.     BOOL Next();
  81.     
  82.     int parse();
  83.     int prop_list();
  84.     int class_name();
  85.     int opt_where();
  86.     int expr();
  87.     int property_name();
  88.     int prop_list_2();
  89.     int term();
  90.     int expr2();
  91.     int simple_expr();
  92.     int term2();
  93.     int leading_ident_expr();
  94.     int finalize();
  95.     int rel_operator();
  96.     int equiv_operator();
  97.     int comp_operator();
  98.     int is_operator();
  99.     int trailing_prop_expr();
  100.     int trailing_prop_expr2();
  101.     int trailing_or_null();
  102.     int trailing_const_expr();
  103.     int unknown_func_expr();
  104.     int typed_constant();
  105. public:
  106.     enum { 
  107.         SUCCESS,
  108.         SYNTAX_ERROR,
  109.         LEXICAL_ERROR,
  110.         FAILED,
  111.         BUFFER_TOO_SMALL
  112.         };
  113.     SQL1_Parser(CGenLexSource *pSrc);
  114.    ~SQL1_Parser();
  115.     int GetQueryClass(LPWSTR pBuf, int nBufSize);
  116.        
  117.     int Parse(SQL_LEVEL_1_RPN_EXPRESSION **pOutput);
  118.         // use operator delete on pOutput
  119.             
  120.     int CurrentLine() { return m_nLine; }
  121.     LPWSTR CurrentToken() { return m_pTokenText; }
  122. void SetSource(CGenLexSource *pSrc);
  123. };
  124. #endif