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 #ifdef ORO_PRAGMA_INTERFACE
00030 #pragma implementation
00031 #endif
00032 #include "ArgumentsParser.hpp"
00033
00034 #include <boost/bind.hpp>
00035 #include <boost/lexical_cast.hpp>
00036
00037 #include "ExpressionParser.hpp"
00038 #include "../TaskContext.hpp"
00039
00040
00041 namespace RTT
00042 {
00043 using namespace detail;
00044 using boost::bind;
00045
00046 namespace {
00047 boost::spirit::classic::assertion<std::string> expect_open("Open brace expected.");
00048 boost::spirit::classic::assertion<std::string> expect_close("Closing brace expected ( or could not find out what this line means ).");
00049 boost::spirit::classic::assertion<std::string> expect_arg("No argument given after comma.");
00050 }
00051
00052 ArgumentsParser::ArgumentsParser(
00053 ExpressionParser& p, TaskContext* peer, Service::shared_ptr tobject, const std::string& o,
00054 const std::string& m )
00055 : mparsed( false ), expressionparser( p ),
00056 mobject( o ), mmethod( m ), _peer(peer), mtobject(tobject)
00057 {
00058 BOOST_SPIRIT_DEBUG_RULE( argument );
00059 BOOST_SPIRIT_DEBUG_RULE( arguments );
00060
00061
00062
00063 arguments = (
00064 ch_p('(')
00065 >> !( argument >> *( ch_p( ',' ) >> expect_arg( argument ) ) )
00066 >> expect_close(ch_p(')')) )[
00067 bind( &ArgumentsParser::seenarguments, this ) ];
00068
00069
00070 argument =
00071 expressionparser.parser() [
00072 bind( &ArgumentsParser::seen_arg, this ) ];
00073 }
00074
00075 void ArgumentsParser::seen_arg()
00076 {
00077 margs.push_back( expressionparser.getResult() );
00078 expressionparser.dropResult();
00079 }
00080
00081 void ArgumentsParser::seenarguments()
00082 {
00083 mparsed = true;
00084 }
00085
00086 ArgumentsParser::~ArgumentsParser()
00087 {
00088 margs.clear();
00089 }
00090 }