Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "parser-debug.hpp"
00029 #include "parse_exception.hpp"
00030 #ifdef ORO_PRAGMA_INTERFACE
00031 #pragma implementation
00032 #endif
00033 #include "ConditionParser.hpp"
00034
00035 #include "ConditionDuration.hpp"
00036 #include "ConditionTrue.hpp"
00037 #include "ConditionFalse.hpp"
00038 #include "ConditionBoolDataSource.hpp"
00039 #include "ConditionComposite.hpp"
00040
00041 #include <boost/bind.hpp>
00042
00043 #include "TryCommand.hpp"
00044
00045 namespace RTT
00046 {
00047 using namespace detail;
00048 using boost::bind;
00049
00050
00051
00052 ConditionParser::ConditionParser( TaskContext* c, ExecutionEngine* caller, CommonParser& cp )
00053 : ds_bool( 0 ), context( c ), commonparser(cp), expressionparser( c, caller, cp )
00054 {
00055 BOOST_SPIRIT_DEBUG_RULE( condition );
00056
00061 condition =
00062 expressionparser.parser() [
00063 bind( &ConditionParser::seenexpression, this ) ];
00064 }
00065
00066 void ConditionParser::reset()
00067 {
00068
00069 ds_bool = 0;
00070 }
00071
00072 ConditionParser::~ConditionParser()
00073 {
00074 }
00075
00076 void ConditionParser::seenexpression()
00077 {
00078
00079 DataSourceBase::shared_ptr mcurdata =
00080 expressionparser.getResult();
00081 expressionparser.dropResult();
00082
00083
00084
00085 ds_bool =
00086 dynamic_cast<DataSource<bool>*>( mcurdata.get() );
00087 if ( ds_bool )
00088 {
00089 mcurdata = 0;
00090 }
00091 else
00092 {
00093
00094 throw parse_exception_semantic_error(
00095 "Attempt to use a non-boolean value as a condition." );
00096 }
00097 }
00098
00099 ConditionInterface* ConditionParser::getParseResult()
00100 {
00101
00102 return new ConditionBoolDataSource( ds_bool.get() );
00103 }
00104
00108 std::pair<ActionInterface*,ConditionInterface*> ConditionParser::getParseResultAsCommand()
00109 {
00110 EvalCommand* ec = new EvalCommand( ds_bool );
00111 EvalCommandResult* ecr = new EvalCommandResult( ec->cache() );
00112 return std::make_pair( ec, ecr );
00113
00114 }
00115 }