bdb_query_parser_main.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_query_parser_main.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:37:32  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bdb_query_parser_main.cpp,v 1000.1 2004/06/01 18:37:32 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Anatoliy Kuznetsov
  35.  *
  36.  * File Description:
  37.  *   Query parser entry point. 
  38.  *    Glues together code generated by BISON, lexical tokenizer, 
  39.  *    error processing, etc.
  40.  *
  41.  */
  42. #include <ncbi_pch.hpp>
  43. #include <bdb/bdb_query.hpp>
  44. #include <bdb/bdb_expt.hpp>
  45. #include <bdb/bdb_query_parser.hpp>
  46. #include <util/resource_pool.hpp>
  47. USING_NCBI_SCOPE;
  48. /*extern "C" */ static int yyerror (const char *s);
  49. /* extern "C" */static int yylex (CBDB_Query::TQueryClause** lvalp, void* param);
  50. BEGIN_NCBI_SCOPE
  51. /// Query tree garbage collection functor.
  52. ///
  53. /// Finds nodes in the query tree and removes them from the 
  54. /// memory pool. All lost nodes are deleted by the pool object.
  55. ///
  56. /// @internal
  57. class CQueryTreeCleanPoolFunc
  58. {
  59. public: 
  60.     CQueryTreeCleanPoolFunc(CResourcePool<CBDB_Query::TQueryClause>& mem_pool)
  61.     : m_Pool(mem_pool)
  62.     {}
  63.   
  64.     ETreeTraverseCode 
  65.     operator()(CTreeNode<CBDB_QueryNode>& tr, int delta)
  66.     {
  67.         if (delta == 0 || delta == 1) {
  68.             m_Pool.Forget(&tr);
  69.         }
  70.         return eTreeTraverse;
  71.     }
  72. private:
  73.     CResourcePool<CBDB_Query::TQueryClause>&  m_Pool;
  74. };
  75. /// Class passed to Lex/Bison (yylex/yyparse) functions.
  76. /// Works as a glue to pass all the information 
  77. /// (both parsed stream and output syntactic tree)
  78. ///
  79. /// @internal
  80. class CBDB_QueryParserEnvironment
  81. {
  82. public:
  83.     CBDB_QueryParserEnvironment(const char* query_str)
  84.     : m_Query(query_str),
  85.       m_Ptr(query_str),
  86.       m_QueryClause(0)
  87.     {}
  88.     ~CBDB_QueryParserEnvironment()
  89.     {
  90.         if (m_QueryClause) {
  91.             // Sync the memory pool not to delete the in-tree nodes
  92.             CQueryTreeCleanPoolFunc func(m_NodePool);
  93.             TreeDepthFirstTraverse(*m_QueryClause, func);
  94.             delete m_QueryClause;
  95.         }
  96.     }
  97.     const char*  GetQueryBuffer() const { return m_Query; }
  98.     const char*  GetBufPtr() const { return m_Ptr; }
  99.     void SetBufPtr(const char* ptr) { m_Ptr = ptr; }
  100.     int GetChar()
  101.     {
  102.         int r = *m_Ptr++;
  103.         return r;
  104.     }
  105.     /// Skip number of characters
  106.     void Skip(int num)
  107.     {
  108.         m_Ptr += num;
  109.     }
  110.     void UnGetChar() { --m_Ptr; }
  111.     void AttachQueryClause(CBDB_Query::TQueryClause* qc)
  112.     {
  113.         m_QueryClause = qc;
  114.     }
  115.     CBDB_Query::TQueryClause* GetQueryClause() { return m_QueryClause; }
  116.     /// Return query clause.
  117.     ///
  118.     /// Caller is responsible for deleteion
  119.     CBDB_Query::TQueryClause* DetachQueryClause() 
  120.     { 
  121.         if (m_QueryClause) {
  122.             // Sync the memory pool
  123.             CQueryTreeCleanPoolFunc func(m_NodePool);
  124.             TreeDepthFirstTraverse(*m_QueryClause, func);
  125.             CBDB_Query::TQueryClause* qc = m_QueryClause;
  126.             m_QueryClause = 0;
  127.             return qc; 
  128.         }
  129.         return 0;
  130.     }
  131.     void AddNodeToPool(CBDB_Query::TQueryClause* qnode)
  132.     {
  133.         m_NodePool.Put(qnode);
  134.     }
  135.     CResourcePool<CBDB_Query::TQueryClause>& GetPool()
  136.     {
  137.         return m_NodePool;
  138.     }
  139. private:
  140.     const char*    m_Query;   ///< Request buffer. (Source for the scanner)
  141.     const char*    m_Ptr;     ///< Current position in the request buffer
  142.     /// Query clause tree. This is the result of the statement parsing.
  143.     CBDB_Query::TQueryClause*               m_QueryClause;
  144.     /// Memory pool of query clause tree nodes. 
  145.     /// Used to avoid memory leaks when BISON shifts stack and calls
  146.     /// yyerror (throws a C++ exception)
  147.     CResourcePool<CBDB_Query::TQueryClause> m_NodePool;
  148. };
  149. END_NCBI_SCOPE
  150. #include "bdb_query_bison.tab.c"
  151. #include "bdb_query_lexer.cpp"
  152. /// Called by yyparse on error 
  153. static
  154. int yyerror (const char *s) 
  155. {
  156.     BDB_THROW(eQuerySyntaxError, s);
  157.     return 0;
  158. }
  159. BEGIN_NCBI_SCOPE
  160. void BDB_ParseQuery(const char* query_str, CBDB_Query* query)
  161. {
  162.     CBDB_QueryParserEnvironment env(query_str);
  163.     /*int res = */ yyparse((void*) &env);
  164.     CBDB_Query::TQueryClause* qc = env.GetQueryClause();
  165.     if (qc) {
  166.         qc = env.DetachQueryClause();
  167.         query->SetQueryClause(qc);
  168.     } else {
  169.         // Check if we have only one token node created by the tokenizer
  170.         // means it's just a single word request (legal)
  171.         CResourcePool<CBDB_Query::TQueryClause>& pool = env.GetPool();
  172.         CResourcePool<CBDB_Query::TQueryClause>::TPoolList& vec = 
  173.                                                         pool.GetFreeList();
  174.         // the only node in pool
  175.         if (vec.size() == 1) {
  176.             CBDB_Query::TQueryClause* qc = vec[0];
  177.             query->SetQueryClause(qc);
  178.             pool.ForgetAll();
  179.         }
  180.     }
  181. }
  182. END_NCBI_SCOPE
  183. /*
  184.  * ===========================================================================
  185.  * $Log: bdb_query_parser_main.cpp,v $
  186.  * Revision 1000.1  2004/06/01 18:37:32  gouriano
  187.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  188.  *
  189.  * Revision 1.5  2004/05/17 20:55:11  gorelenk
  190.  * Added include of PCH ncbi_pch.hpp
  191.  *
  192.  * Revision 1.4  2004/03/10 16:19:24  kuznets
  193.  * Improved parser to handle single word requests
  194.  *
  195.  * Revision 1.3  2004/02/25 13:40:39  kuznets
  196.  * + CBDB_QueryParserEnvironment::Skip
  197.  *
  198.  * Revision 1.2  2004/02/24 19:26:14  kuznets
  199.  * Fix compilation(GCC & SUN Workshop)
  200.  *
  201.  * Revision 1.1  2004/02/24 16:37:38  kuznets
  202.  * Initial revision
  203.  *
  204.  *
  205.  * ==========================================================================
  206.  */