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

生物技术

开发平台:

C/C++

  1. /*  $Id: bdb_query_bison.y,v 1000.0 2004/04/12 17:14:47 gouriano Exp $
  2.  * ===========================================================================
  3.  *
  4.  *                            PUBLIC DOMAIN NOTICE
  5.  *               National Center for Biotechnology Information
  6.  *
  7.  *  This software/database is a "United States Government Work" under the
  8.  *  terms of the United States Copyright Act.  It was written as part of
  9.  *  the author's official duties as a United States Government employee and
  10.  *  thus cannot be copyrighted.  This software/database is freely available
  11.  *  to the public for use. The National Library of Medicine and the U.S.
  12.  *  Government have not placed any restriction on its use or reproduction.
  13.  *
  14.  *  Although all reasonable efforts have been taken to ensure the accuracy
  15.  *  and reliability of the software and data, the NLM and the U.S.
  16.  *  Government do not and cannot warrant the performance or results that
  17.  *  may be obtained by using this software or data. The NLM and the U.S.
  18.  *  Government disclaim all warranties, express or implied, including
  19.  *  warranties of performance, merchantability or fitness for any particular
  20.  *  purpose.
  21.  *
  22.  *  Please cite the author in any work or product based on this material.
  23.  *
  24.  * ===========================================================================
  25.  *
  26.  * Author: Anatoliy Kuznetsov
  27.  *
  28.  * File Description:
  29.  *   Bison grammar description for simple query language. 
  30.  *
  31.  */
  32. /* *************************** */
  33. /* C includes and definitions  */
  34. /* *************************** */
  35. %{
  36. #define YYSTYPE        CBDB_Query::TQueryClause*
  37. #define YYPARSE_PARAM  parm
  38. #define YYLEX_PARAM    parm
  39. #define YYINITDEPTH    50
  40. #define YYMAXDEPTH     1000
  41. #define YYDEBUG 1
  42. /* 
  43.     Utility function to save current yyparse result in the
  44.     parsing environment object (context).
  45. */
  46. inline static 
  47. void BisonSaveStageResult(YYSTYPE res, void* parm)
  48. {
  49.     CBDB_QueryParserEnvironment* env = 
  50.           (CBDB_QueryParserEnvironment*) parm;
  51.     env->AttachQueryClause(res);
  52.     env->AddNodeToPool(res);
  53. }
  54. %}
  55. /* *************************** */
  56. /* BISON Declarations          */
  57. /* *************************** */
  58. %pure_parser     /* Reentrant parser */
  59. %token NAME
  60. %token STRING
  61. %token NUM
  62. %left NOT
  63. %left AND
  64. %left OR
  65. %left EQ
  66. %left NOTEQ
  67. %left GT
  68. %left GE
  69. %left LT
  70. %left LE
  71. /* Grammar follows */
  72. %%
  73. input:  exp
  74. ;
  75. /*
  76. input:  input0
  77.         | input0 exp
  78. input0:    
  79.         | input0 'n' exp
  80.         | input0 ';' exp
  81. ;
  82. */
  83. exp:    
  84. NUM                
  85.         {
  86.             $$ = $1;         
  87.         }
  88.         | STRING
  89.         {
  90.             $$ = $1;         
  91.         }
  92.         | NAME
  93.         {
  94.             $$ = $1;         
  95.         }
  96.         | exp AND exp        
  97.         { 
  98.             $$ = CBDB_Query::NewLogicalNode(CBDB_QueryNode::eAnd, $1, $3);
  99.             BisonSaveStageResult($$, parm);
  100.         }
  101.         | exp OR exp
  102.         {
  103.             $$ = CBDB_Query::NewLogicalNode(CBDB_QueryNode::eOr, $1, $3);
  104.             BisonSaveStageResult($$, parm);
  105.         }
  106.         | exp EQ exp
  107.         {
  108.             $$ = CBDB_Query::NewOperatorNode(CBDB_QueryNode::eEQ, $1, $3);
  109.             BisonSaveStageResult($$, parm);
  110.         }
  111.         | exp NOTEQ exp
  112.         {
  113.             $$ = CBDB_Query::NewOperatorNode(CBDB_QueryNode::eEQ, $1, $3);
  114.             $$->GetValue().SetNot();
  115.             BisonSaveStageResult($$, parm);
  116.         }
  117.         | exp GT exp
  118.         {
  119.             $$ = CBDB_Query::NewOperatorNode(CBDB_QueryNode::eGT, $1, $3);
  120.             BisonSaveStageResult($$, parm);
  121.         }
  122.         | exp GE exp
  123.         {
  124.             $$ = CBDB_Query::NewOperatorNode(CBDB_QueryNode::eGE, $1, $3);
  125.             BisonSaveStageResult($$, parm);
  126.         }
  127.         | exp LT exp
  128.         {
  129.             $$ = CBDB_Query::NewOperatorNode(CBDB_QueryNode::eLT, $1, $3);
  130.             BisonSaveStageResult($$, parm);
  131.         }
  132.         | exp LE exp
  133.         {
  134.             $$ = CBDB_Query::NewOperatorNode(CBDB_QueryNode::eLE, $1, $3);
  135.             BisonSaveStageResult($$, parm);
  136.         }
  137.         | '(' exp ')'
  138.         { 
  139.             $$ = $2;
  140.         } 
  141.         | NOT exp
  142.         {
  143.             $$ = CBDB_Query::NewLogicalNode(CBDB_QueryNode::eNot, $2, 0);
  144.             BisonSaveStageResult($$, parm);
  145.         }
  146. ;
  147. %%