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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef EXPRESSIONPARSER_HPP
00039 #define EXPRESSIONPARSER_HPP
00040
00041 #include "parser-types.hpp"
00042 #include "CommonParser.hpp"
00043 #include "PeerParser.hpp"
00044 #include "ValueParser.hpp"
00045 #include "../internal/DataSource.hpp"
00046 #include "../types/Operators.hpp"
00047 #include "../Time.hpp"
00048
00049 #include <stack>
00050
00051 #ifdef ORO_PRAGMA_INTERFACE
00052 #pragma interface
00053 #endif
00054
00055 namespace RTT { namespace scripting
00056 {
00065 class DataCallParser
00066 {
00067 base::DataSourceBase::shared_ptr ret;
00068 boost::shared_ptr<base::AttributeBase> mhandle;
00069 std::string mobject;
00070 std::string mmethod;
00071 ExecutionEngine* mcaller;
00072 bool mis_send;
00073
00074 rule_t datacall, arguments, peerpath, object, method;
00075
00076 void seenmethodname( iter_t begin, iter_t end );
00077 void seenobjectname( iter_t begin, iter_t end );
00078 void seendataname();
00079 void seendatacall();
00080 void seensend();
00081 CommonParser& commonparser;
00082 ExpressionParser& expressionparser;
00083 PeerParser peerparser;
00084 std::stack<ArgumentsParser*> argparsers;
00085 public:
00086 DataCallParser( ExpressionParser& p, CommonParser& cp, TaskContext* pc, ExecutionEngine* caller );
00087 ~DataCallParser();
00088
00089 rule_t& parser()
00090 {
00091 return datacall;
00092 }
00093
00094 base::DataSourceBase* getParseResult()
00095 {
00096 return ret.get();
00097 }
00098 boost::shared_ptr<base::AttributeBase> getParseHandle()
00099 {
00100 return mhandle;
00101 }
00102 };
00103
00107 class ConstructorParser
00108 {
00109 base::DataSourceBase::shared_ptr ret;
00110 rule_t type_name, arguments;
00111
00112 CommonParser& commonparser;
00113 ExpressionParser& expressionparser;
00114 std::stack<ArgumentsParser*> argparsers;
00115 public:
00116 ConstructorParser( ExpressionParser& p, CommonParser& cp);
00117 ~ConstructorParser();
00118
00119 void seen_type_name( iter_t begin, iter_t end );
00120 void seen_constructor( void );
00121
00122 rule_t& parser()
00123 {
00124 return type_name;
00125 }
00126
00127 base::DataSourceBase* getParseResult()
00128 {
00129 return ret.get();
00130 }
00131 };
00132
00140 class ExpressionParser
00141 {
00142 rule_t expression, unarynotexp, unaryminusexp, unaryplusexp, div_or_mul,
00143 modexp, plus_or_min, smallereqexp, smallerexp,
00144 greatereqexp, greaterexp, equalexp, notequalexp, orexp, andexp,
00145 ifthenelseexp, dotexp, groupexp, atomicexpression,
00146 time_expression, time_spec, indexexp, comma, close_brace,
00147 value_expression, call_expression, assignexp, constructor_expression;
00148
00155 std::stack<base::DataSourceBase::shared_ptr> parsestack;
00160 boost::shared_ptr<base::AttributeBase> mhandle;
00161
00162
00163
00164 std::string mobjectname;
00165
00166
00167
00168 std::string mpropname;
00169
00170
00171 nsecs tsecs;
00172
00173 void seen_unary( const std::string& op );
00174 void seen_binary( const std::string& op );
00175 void seen_index();
00176 void seen_assign();
00177 void seen_dotmember( iter_t begin, iter_t end );
00178 void seenvalue();
00179 void seendatacall();
00180 void seenconstructor();
00181 void seentimespec( int n );
00182 void seentimeunit( iter_t begin, iter_t end );
00183 void inverttime();
00184 void seentimeexpr();
00185
00186 DataCallParser datacallparser;
00187 ConstructorParser constrparser;
00191 CommonParser& commonparser;
00192 ValueParser valueparser;
00193 bool _invert_time;
00194 types::OperatorRepository::shared_ptr opreg;
00195
00196 TaskContext* context;
00197 public:
00198 ExpressionParser( TaskContext* pc, ExecutionEngine* caller, CommonParser& common_parser );
00199 ~ExpressionParser();
00200
00201 rule_t& parser();
00202
00203 base::DataSourceBase::shared_ptr getResult();
00204
00210 boost::shared_ptr<base::AttributeBase> getHandle();
00211
00212
00213
00214
00215
00216 void dropResult();
00217
00218 bool hasResult() { return !parsestack.empty(); }
00219 };
00220 }}
00221
00222 #endif