/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
#ifndef PARKEYWORDS_H
#define PARKEYWORDS_H
/* -*-C++-*-
*******************************************************************************
*
* File:         ParKeyWords.h
* Description:  All keywords including those defined in ANSI 5.2,
*               Used by ulexer
*******************************************************************************
*/

#include "NABasicObject.h"
#define   SQLPARSERGLOBALS_FLAGS
#include "SqlParserGlobals.h"	// Parser Flags
#include "NAWinNT.h"		// for NAWchar, WIDE_(), etc.
#include "NABoolean.h" 

#ifndef SQLPARSER_H
#include <sqlparser.h>   // Angled brackets are intentional here
#define SQLPARSER_H
#endif

// -----------------------------------------------------------------------
// contents of this file
// -----------------------------------------------------------------------
class ParKeyWord;
class ParKeyWords;

enum { 
  FLAGSNONE_   = 0x000,         // No FLAGS

  FIRST_       = 0x001,         // can appear as first word of compound token
                                // eg. BROWSE in BROWSE ACCESS -> 
                                // TOK_BROWSE_ACCESS

  SECOND_      = 0x002,         // can appear as second word of compound token
                                // eg. ACCESS in BROWSE ACCESS -> 
                                // TOK_BROWSE_ACCESS

  THIRD_       = 0x004,         // can appear as third word of compound token
                                // eg. ONLY in FOR READ ONLY ->
                                // TOK_FOR_READ_ONLY

  RESWORD_     = 0x008,         // a reserved word (ANSI, Pot. ANSI or COMPAQ)

  NONRESWORD_  = 0x010,         // a non-reserved word.  These are words that
                                // should be reserved (ANSI or Pot. ANSI) but
                                // are not for various reason. See ABSOLUTE,
                                // DATA, and OPERATION in ComResWords.cpp.

  NONRESTOKEN_ = 0x020,         // a non-reserved token.  These are words that
                                // can be used as a token or an identifier 
                                // depending on the context.  This flag is 
                                // used only for notation.  The Parser also 
                                // maintains this list.

  MPWORD_      = 0x040,         // a SQL/MP Reserved word.

  ALLOWOLDNEW_ = 0x080,         // Indicates that the word is allowed if the
                                // ALLOWOLDNEW parser flag is set.  In certain
                                // contexts the words OLD and NEW are allowed
                                // as identifiers.  This flag identifies the
                                // extra words which are allowed in this
                                // context.

  ANS_         = 0x100,         // Indicates that the word is reserved by ANSI
                                // This flag is used only for notation.

  POTANS_      = 0x200,         // Indicates that the word is potentially 
                                // reserved by ANSI. This flag is used only
                                // for notation.

  COMPAQ_      = 0x400,         // Indicates that the word is reserved by
                                // COMPAQ. This flag is used only for notation.

  CONDITIONAL_RES_ = 0x800      // Indicates that the word is reserved 
                                // conditionally.                                 
};

// ***********************************************************************
//
//  ParKeyWord : A description of a key word.
//
// ***********************************************************************
#pragma nowarn(1506)   // warning elimination
class ParKeyWord : public NABasicObject
{
public:

  // Constructors.
  //
  ParKeyWord(const ParKeyWord &other, NAMemory * h=0); 
  ParKeyWord(NAMemory * h=0) {};
  ParKeyWord(const char *kwd, Int32 code, UInt32 flags, NAMemory * h=0);
  
  // Destructor
  //
  virtual ~ParKeyWord() {};

  // Is this key word allowed in the first, second or third position
  // of a compound token.
  //
  inline NABoolean canBeFirst () const { return flags_ & FIRST_; };
  inline NABoolean canBeSecond() const { return flags_ & SECOND_; };
  inline NABoolean canBeThird () const { return flags_ & THIRD_; };

  // Accessor methods.
  //
  inline const char *getKeyWord() const { return keyword_; };
  inline Int32 getTokenCode() const { return tokenCode_; };

  // Is the word an identifier.
  //
  inline NABoolean isIdentifier() const {
    return ((tokenCode_ == IDENTIFIER) ||
	    (inMPContext() && !isMPReserved() && !(flags_ & NONRESTOKEN_)));
  };

  // Is the word reserved, depends on isMPContext.
  //
  inline NABoolean isReserved() const { 
    if (inMPContext()) {
      return isMPReserved();
    } else {
      return ((flags_ & RESWORD_) &&
	      !(allowOldAndNew() && (flags_ & ALLOWOLDNEW_)));
    }
  };

  inline NABoolean isConditionallyReserved() const {
    return ( flags_ & (CONDITIONAL_RES_ | RESWORD_ ) );
  };

  NABoolean useAsIdentifierInNonSpecialMode() const;

private:
  
  // Are the keywords OLD and NEW allowed as identifiers.
  //
  inline static NABoolean allowOldAndNew(void) {
    return Get_SqlParser_Flags(ALLOW_OLD_AND_NEW_KEYWORD) ? TRUE : FALSE;
  }

  // Are we parsing/lexing MP Stored text.
  // This affect which words are reserved, identifiers, or tokens.
  //
  inline static NABoolean inMPContext(void) {
    return FALSE;
  }
  
  // Is the word reserved by SQL/MP.
  // 
  inline NABoolean isMPReserved() const { return flags_ & MPWORD_; };


  // The keyword.
  //
  const char *keyword_;

  // The token representing the keyword.
  //
  Int32 tokenCode_;

  // Attributes of the key word.
  //
  UInt32 flags_;
};
#pragma warn(1506)  // warning elimination 

// ***********************************************************************
//
//  ParKeyWords : A table of keywords (ParKeyWord).
//
//  This class has no non-static data associated with it.  It simple
//  provides an interface to static data of the keyword table.
//
// ***********************************************************************
class ParKeyWords : public NABasicObject
{
public:
  
  // Constructor.
  //
  ParKeyWords(const ParKeyWords &other, NAMemory * h=0); 
  ParKeyWords(NAMemory * h=0);

  // Initialize the key word table.  This will load in any changes to
  // the table and sort it if these things have not already been done.
  //
  static void initKeyWordTable(void);

  // Find the given keyword in the key word table.  If it is not
  // found, return a pointer to the identifier keyword (see identWord_
  // below).
  //
  static const ParKeyWord *lookupKeyWord(NAWchar *id);

  // Check if key word table had been sorted
  //
  static const NABoolean keyWordTableSorted(void) {
    return keyWordTableSorted_;
  }

private:

  // Comparision method for searching keyword table.
  //
  static Int32 keyCompare(const void *keyval, const void *datum); 
  
  // Encapulates the searching of the keyword table.
  //
  static inline ParKeyWord *searchKeyWordTbl(ParKeyWord *key) {
    return (ParKeyWord *)bsearch(key,
				 keyWords_,
				 numEntries_,
				 sizeof(ParKeyWord),
				 keyCompare);
  }

  // Static data associated with all instances of this class.
  //

  // The array of keywords.
  //
  static ParKeyWord keyWords_[];

  // The default IDENTIFIER keyword.  Used by lookupKeyWord() if the
  // given word is not found in the keyword table.
  //
  static ParKeyWord identWord_;

  // The number of entries in the keyword table.
  //
  static size_t numEntries_;

  // The max length of all the keywords.
  //
  static size_t maxKeyWordLength_;

  // Indicates if the keyword table has been sorted.
  //
  static NABoolean keyWordTableSorted_;
};

#endif // PARKEYWORDS_H
