ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CexmcAST.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CexmcAST.hh
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 /*
27  * =============================================================================
28  *
29  * Filename: CexmcAST.hh
30  *
31  * Description: abstract syntax tree for custom filter scripting language
32  *
33  * Version: 1.0
34  * Created: 17.07.2010 14:39:37
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * =============================================================================
42  */
43 
44 #ifndef CEXMC_AST_HH
45 #define CEXMC_AST_HH
46 
47 #ifdef CEXMC_USE_CUSTOM_FILTER
48 
49 #include <vector>
50 #include <boost/variant/recursive_variant.hpp>
51 
52 
53 namespace CexmcAST
54 {
55  using boost::variant;
56  using boost::recursive_wrapper;
57 
58  enum OperatorType
59  {
60  Uninitialized,
61  Top,
62  UMinus,
63  Not,
64  Mult,
65  Div,
66  Plus,
67  Minus,
68  Less,
69  LessEq,
70  More,
71  MoreEq,
72  Eq,
73  NotEq,
74  And,
75  Or
76  };
77 
78 
79  struct Operator
80  {
81  Operator( OperatorType type_ = Uninitialized, int priority_ = 0,
82  bool hasRLAssoc_ = false ) :
83  type( type_ ), priority( priority_ ), hasRLAssoc( hasRLAssoc_ )
84  {}
85 
86  OperatorType type;
87 
88  int priority;
89 
90  bool hasRLAssoc;
91  };
92 
93 
94  struct Variable
95  {
96  Variable() : index1( 0 ), index2( 0 ), addr( ( const int * ) NULL )
97  {}
98 
99  std::string name;
100 
101  int index1;
102 
103  int index2;
104 
105  variant< const int *, const double * > addr;
106  };
107 
108 
109  struct Subtree;
110 
111  typedef std::string Function;
112 
113  typedef variant< int, double > Constant;
114 
115  typedef variant< Variable, Constant > Leaf;
116 
117  typedef recursive_wrapper< Subtree > Tree;
118 
119  typedef variant< Tree, Leaf > Node;
120 
121  typedef variant< Operator, Function > NodeType;
122 
123 
124  struct Subtree
125  {
126  Subtree() : type( Operator( Uninitialized ) )
127  {}
128 
129  void Print( int level = 0 ) const;
130 
131  void PrintLeaf( const Leaf * leaf, int level = 0 ) const;
132 
133  std::vector< Node > children;
134 
135  NodeType type;
136 
137  static const int printIndent = 4;
138  };
139 
140 
141  class BasicEval
142  {
143  protected:
144  typedef variant< int, double > ScalarValueType;
145 
146  protected:
147  virtual ~BasicEval();
148 
149  public:
150  bool operator()( const Subtree & ast ) const;
151 
152  protected:
153  ScalarValueType GetScalarValue( const Node & node ) const;
154 
155  virtual ScalarValueType GetFunScalarValue( const Subtree & ast )
156  const;
157 
158  virtual ScalarValueType GetVarScalarValue( const Variable & var )
159  const;
160 
161  ScalarValueType GetBasicFunScalarValue(
162  const Subtree & ast, bool & result )
163  const;
164  };
165 }
166 
167 #endif
168 
169 #endif
170