Orocos Real-Time Toolkit  2.9.0
PropertyParser.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  tag: Peter Soetens Sat May 21 20:15:51 CEST 2005 PropertyParser.cxx
3 
4  PropertyParser.cxx - description
5  -------------------
6  begin : Sat May 21 2005
7  copyright : (C) 2005 Peter Soetens
8  email : peter.soetens@mech.kuleuven.ac.be
9 
10  ***************************************************************************
11  * This library is free software; you can redistribute it and/or *
12  * modify it under the terms of the GNU General Public *
13  * License as published by the Free Software Foundation; *
14  * version 2 of the License. *
15  * *
16  * As a special exception, you may use this file as part of a free *
17  * software library without restriction. Specifically, if other files *
18  * instantiate templates or use macros or inline functions from this *
19  * file, or you compile this file and link it with other files to *
20  * produce an executable, this file does not by itself cause the *
21  * resulting executable to be covered by the GNU General Public *
22  * License. This exception does not however invalidate any other *
23  * reasons why the executable file might be covered by the GNU General *
24  * Public License. *
25  * *
26  * This library is distributed in the hope that it will be useful, *
27  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
28  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
29  * Lesser General Public License for more details. *
30  * *
31  * You should have received a copy of the GNU General Public *
32  * License along with this library; if not, write to the Free Software *
33  * Foundation, Inc., 59 Temple Place, *
34  * Suite 330, Boston, MA 02111-1307 USA *
35  * *
36  ***************************************************************************/
37 
38 
39 
40 #include "PropertyParser.hpp"
41 #include "parser-debug.hpp"
42 #include "parse_exception.hpp"
43 #include "../TaskContext.hpp"
44 #include "parser-types.hpp"
45 
46 #include <Property.hpp>
47 #include <PropertyBag.hpp>
48 #include <boost/bind.hpp>
49 
50 namespace RTT
51 {
52  using boost::bind;
53  using namespace detail;
54  using namespace boost;
55 
56 
57  error_status<> PropertyParser::handle_no_property(scanner_t const& scan, parser_error<PropertyErrors, iter_t>&e )
58  {
59  //std::cerr<<"Returning accept"<<std::endl;
60  // ok, got as far as possible, _property contains the furthest we got.
61  return error_status<>( error_status<>::accept, advance_on_error );
62  }
63 
65  : commonparser(cp), _bag(0), _property(0)
66  {
67  BOOST_SPIRIT_DEBUG_RULE( propertylocator );
68  // find as far as possible a property without throwing an exception
69  // outside our interface
70  propertylocator =
71  !my_guard
72  ( +(commonparser.notassertingidentifier >> ".")[boost::bind( &PropertyParser::locateproperty, this, _1, _2 ) ])
73  [ boost::bind(&PropertyParser::handle_no_property, this, _1, _2) ];
74  }
75 
77  {
78  _bag = bg;
79  _property = 0;
80  advance_on_error = 0;
81  }
82 
84  {
85  _property = 0;
86  _bag = 0;
87  advance_on_error = 0;
88  }
89 
90  void PropertyParser::locateproperty( iter_t begin, iter_t end )
91  {
92  std::string name( begin, end );
93  name.erase( name.length() -1 ); // compensate for extra "."
94 
95  //std::cerr<< "PropParser: trying: "<< name;
96  if ( _bag && _bag->find(name) ) {
97  //std::cerr<< " found !" <<std::endl;
98  // guaranteed to be non-null :
99  PropertyBase* propbase = _bag->find( name );
100  Property<PropertyBag>* propbag = dynamic_cast<Property<PropertyBag> *>( propbase );
101  if ( propbag ) {
102  //std::cerr<< "PropParser: is a bag." <<std::endl;
103  // success
104  advance_on_error += end.base() - begin.base();
105  _bag = &(propbag->set());
106  _property = propbase;
107  }
108  else {
109  //std::cerr<< "PropParser: not a bag." <<std::endl;
110  throw_(begin, bag_not_found );
111  // a property was found, but it was not a bag.
112  // Do not Consume the input
113  }
114  // if _property is not a bag, throw. The next
115  // locateproperty will throw or if no more 'subprop.' found,
116  }
117  else {
118  //std::cerr<< " not found !" <<std::endl;
119  // do not consume input.
120  throw_(begin, bag_not_found );
121  }
122  }
123 
125  {
126  return propertylocator;
127  }
128 }
129 
Base class for all properties.
A container for holding references to properties.
Definition: PropertyBag.hpp:96
This class contains some very common parser definitions.
void reset()
After reset, property() == 0 and bag == 0.
scanner< iter_t, scanner_pol_t > scanner_t
base::PropertyBase * find(const std::string &name) const
Find the base::PropertyBase with name name.
A property represents a named value of any type with a description.
Definition: Property.hpp:76
void setPropertyBag(PropertyBag *pb)
Change the bag we want to traverse.
rule< scanner_t > rule_t
rule_t & locator()
The locator tries to go as far as possible in the bag-to-property path and will never throw...
reference_t set()
Access to the value of the Property.
Definition: Property.hpp:257
rule_t notassertingidentifier
identifier with <template> marks in it
Contains TaskContext, Activity, OperationCaller, Operation, Property, InputPort, OutputPort, Attribute.
Definition: Activity.cpp:52
our_pos_iter_t iter_t