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 }