ExpressionParser.hpp
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 "../DataSource.hpp"
00046 #include "../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 detail
00056 {
00065 class DataCallParser
00066 {
00067 DataSourceBase::shared_ptr ret;
00068 std::string mobject;
00069 std::string mmethod;
00070
00071 rule_t datacall, arguments;
00072
00073 void seenmethodname( iter_t begin, iter_t end )
00074 {
00075 std::string name( begin, end );
00076 mmethod = name;
00077 };
00078
00079 void seendataname();
00080 void seendatacall();
00081 CommonParser& commonparser;
00082 ExpressionParser& expressionparser;
00083 PeerParser peerparser;
00084 std::stack<ArgumentsParser*> argparsers;
00085 public:
00086 DataCallParser( ExpressionParser& p, CommonParser& cp, TaskContext* pc );
00087 ~DataCallParser();
00088
00089 rule_t& parser()
00090 {
00091 return datacall;
00092 };
00093
00094 DataSourceBase* getParseResult()
00095 {
00096 return ret.get();
00097 };
00098 };
00099
00107 class ExpressionParser
00108 {
00109 rule_t expression, unarynotexp, unaryminusexp, unaryplusexp, div_or_mul,
00110 modexp, plusexp, minusexp, smallereqexp, smallerexp,
00111 greatereqexp, greaterexp, equalexp, notequalexp, orexp, andexp,
00112 ifthenelseexp, dotexp, groupexp, atomicexpression,
00113 time_expression, time_spec, indexexp, comma, open_brace, close_brace;
00114
00121 std::stack<DataSourceBase::shared_ptr> parsestack;
00122
00123
00124
00125 std::string mobjectname;
00126
00127
00128
00129 std::string mpropname;
00130
00131
00132 nsecs tsecs;
00133
00134 void seen_unary( const std::string& op );
00135 void seen_binary( const std::string& op );
00136 void seen_dotmember( iter_t begin, iter_t end );
00137 void seenvalue();
00138 void seendatacall();
00139 void seentimespec( int n );
00140 void seentimeunit( iter_t begin, iter_t end );
00141 void inverttime();
00142 void seentimeexpr();
00143
00144 DataCallParser datacallparser;
00148 CommonParser& commonparser;
00149 ValueParser valueparser;
00150 bool _invert_time;
00151 OperatorRepository::shared_ptr opreg;
00152 public:
00153 ExpressionParser( TaskContext* pc, CommonParser& common_parser );
00154 ~ExpressionParser();
00155
00156 rule_t& parser();
00157
00158 DataSourceBase::shared_ptr getResult();
00159
00160
00161
00162
00163 void dropResult();
00164
00165 bool hasResult() { return !parsestack.empty(); }
00166 };
00167 }}
00168
00169 #endif