Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/src/CexmcCustomFilter.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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:  CexmcCustomFilter.cc
 30  *
 31  *    Description:  custom filter grammar and compiler
 32  *
 33  *        Version:  1.0
 34  *        Created:  17.07.2010 15:37:38
 35  *       Revision:  none
 36  *       Compiler:  gcc
 37  *
 38  *         Author:  Alexey Radkov (), 
 39  *        Company:  PNPI
 40  *
 41  * =============================================================================
 42  */
 43 
 44 #ifdef CEXMC_USE_CUSTOM_FILTER
 45 
 46 #include "CexmcCustomFilter.hh"
 47 
 48 
 49 namespace  CexmcCustomFilter
 50 {
 51     void  Compiler::operator()( ParseResult &  parseResult, Action  value )
 52                                                                         const
 53     {
 54         parseResult.action = value;
 55     }
 56 
 57 
 58     void  Compiler::operator()( ParseResult &  parseResult, Subtree &  value )
 59                                                                         const
 60     {
 61         parseResult.expression = value;
 62     }
 63 
 64 
 65     void  Compiler::operator()( Subtree &  ast, Node &  node ) const
 66     {
 67         try
 68         {
 69             ast = boost::get< Subtree >( node );
 70         }
 71         catch ( const boost::bad_get & )
 72         {
 73             ast.type = Operator( Top );
 74             ast.children.push_back( node );
 75         }
 76     }
 77 
 78 
 79     void  Compiler::operator()( Node &  self, Node &  left, Node &  right,
 80                                 Operator  value ) const
 81     {
 82         Subtree &  ast( boost::get< Subtree >( self ) );
 83 
 84         ast.children.push_back( left );
 85         ast.type = value;
 86 
 87         Subtree *  astRight( boost::get< Subtree >( &right ) );
 88 
 89         if ( ! astRight )
 90         {
 91             ast.children.push_back( right );
 92             return;
 93         }
 94 
 95         bool        haveSamePriorities( false );
 96         Operator *  rightOp( boost::get< Operator >( &astRight->type ) );
 97 
 98         if ( rightOp )
 99             haveSamePriorities = value.priority == rightOp->priority;
100 
101         if ( value.hasRLAssoc || ! haveSamePriorities )
102         {
103             ast.children.push_back( right );
104             return;
105         }
106 
107         Subtree *  astDeepestRight( astRight );
108 
109         /* propagate left binary operators with LR associativity (i.e. all in
110          * our grammar) deep into the AST until any operator with a different
111          * priority (which includes operators in parentheses that have priority
112          * 0) or a unary operator or a function occured */
113         while ( true )
114         {
115             Subtree *   candidate = boost::get< Subtree >(
116                                             &astDeepestRight->children[ 0 ] );
117             if ( ! candidate )
118                 break;
119 
120             if ( candidate->children.size() < 2 )
121                 break;
122 
123             bool        haveSamePriorities_( false );
124             Operator *  candidateOp( boost::get< Operator >(
125                                                         &candidate->type ) );
126 
127             if ( candidateOp )
128                 haveSamePriorities_ = value.priority == candidateOp->priority;
129 
130             /* FIXME: what to do if candidate has RL association? Our grammar is
131              * not a subject of this issue; probably no grammar is a subject */
132             if ( ! haveSamePriorities_ )
133                 break;
134 
135             astDeepestRight = candidate;
136         }
137 
138         Subtree    astResult;
139         astResult.children.push_back( ast.children[ 0 ] );
140         astResult.children.push_back( astDeepestRight->children[ 0 ] );
141         astResult.type = value;
142         astDeepestRight->children[ 0 ] = astResult;
143         self = right;
144     }
145 
146 
147     void  Compiler::operator()( Node &  self, Node &  child, Operator  value )
148                                                                         const
149     {
150         Subtree &  ast( boost::get< Subtree >( self ) );
151         ast.children.push_back( child );
152         ast.type = value;
153     }
154 
155 
156     void  Compiler::operator()( Node &  self, Node &  primary ) const
157     {
158         self = primary;
159 
160         Subtree *  ast( boost::get< Subtree >( &self ) );
161 
162         if ( ! ast )
163             return;
164 
165         Operator *  op( boost::get< Operator >( &ast->type ) );
166 
167         if ( op )
168             op->priority = 0;
169     }
170 
171 
172     void  Compiler::operator()( Node &  self, Node &  child,
173                                 std::string &  value ) const
174     {
175         Subtree &  ast( boost::get< Subtree >( self ) );
176 
177         ast.children.push_back( child );
178         ast.type = value;
179     }
180 
181 
182     void  Compiler::operator()( Leaf &  self, std::string &  name ) const
183     {
184         Variable &  variable( boost::get< Variable >( self ) );
185         variable.name = name;
186     }
187 
188 
189     void  Compiler::operator()( Leaf &  self, int  value, size_t  index ) const
190     {
191         Variable &  variable( boost::get< Variable >( self ) );
192         switch ( index )
193         {
194         case 0 :
195             variable.index1 = value;
196             break;
197         case 1 :
198             variable.index2 = value;
199             break;
200         default :
201             break;
202         }
203     }
204 }
205 
206 #endif
207 
208