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 EXECUTION_PROGRAM_PARSER_HPP
00039 #define EXECUTION_PROGRAM_PARSER_HPP
00040
00041 #include "parser-types.hpp"
00042
00043 #include "CommonParser.hpp"
00044 #include "PeerParser.hpp"
00045 #include "ConditionParser.hpp"
00046 #include "ExpressionParser.hpp"
00047 #include "../TaskContext.hpp"
00048 #include "FunctionGraphBuilder.hpp"
00049 #include "ValueChangeParser.hpp"
00050
00051 #include <map>
00052 #include <vector>
00053 #include <string>
00054
00055
00056 #include "ProgramService.hpp"
00057
00058
00059
00060
00061 namespace RTT { namespace scripting
00062 {
00072 class ProgramGraphParser
00073 {
00074 typedef FunctionGraphBuilder::CommandNode CommandNode;
00075 typedef FunctionGraphBuilder::ConditionEdge ConditionEdge;
00076 typedef FunctionGraphBuilder::Graph Graph;
00077
00082 TaskContext* rootc;
00083
00087 Service::shared_ptr context;
00088
00092 TaskContext* fcontext;
00093
00097 TaskContext* peer;
00098
00099 our_pos_iter_t& mpositer;
00100
00101
00102 FunctionGraphPtr mfunc;
00103
00104
00105 FunctionGraphPtr mcallfunc;
00106
00107
00108 typedef std::map<std::string, FunctionGraphPtr> funcmap;
00109 funcmap mfuncs;
00110
00111
00112 std::string rettype;
00113
00114
00115
00116 ConditionInterface* implcond;
00117 std::vector<ConditionInterface*> implcond_v;
00118 std::vector<base::DataSourceBase::shared_ptr> callfnargs;
00119
00120
00121 ConditionInterface* mcondition;
00122
00123 ConditionInterface* try_cond;
00124
00125 void seencondition();
00126
00127 void seencallfunclabel( iter_t begin, iter_t end );
00128
00129 void seencontinue( );
00130
00131 void skip_eol();
00132 void noskip_eol();
00133 void seenyield();
00134 void seenstatement();
00135 void seentrystatement();
00136 void startcatchpart();
00137 void seencatchpart();
00138
00139 void seenvaluechange();
00140
00141 void functiondef( iter_t begin, iter_t end );
00142 void exportdef( );
00143 void globaldef( );
00144 void seenfunctionarg();
00145 void seenfunctionend();
00146 void seenvalidinput();
00147
00148 void seenfuncidentifier( iter_t begin, iter_t end);
00149 void seencallfuncstatement();
00150 void seencallfuncargs();
00151
00152 void seenreturnstatement();
00153 void seenreturnlabel();
00154 void seenreturnvalue();
00155 void seenreturntype( iter_t begin, iter_t end );
00156
00157 void seenifstatement();
00158 void endifblock();
00159 void endifstatement();
00160
00161 void seenwhilestatement();
00162 void endwhilestatement();
00163
00164 void seenbreakstatement();
00165
00166 void seenforstatement();
00167 void seenforinit();
00168 void seenforinit_expr();
00169 void seenforincr();
00170 void seenemptyforincr();
00171 void endforstatement();
00172
00173 void startofprogram();
00174 void programdef( iter_t begin, iter_t end );
00175 void seenprogramend();
00176 void programtext(iter_t, iter_t);
00177
00178 void setStack(Service::shared_ptr st);
00180 void clearParseState();
00181 void setup();
00182 void setup2();
00183 void cleanup(bool remove_service);
00184
00185 rule_t newline, terminationclause, jumpdestination, terminationpart, andpart,
00186 dostatement, trystatement, statement, line, content, program,
00187 production, valuechange, returnstatement, function, functions, arguments, funcstatement,
00188 continuepart, returnpart, callpart, ifstatement, ifblock, whilestatement, breakstatement,
00189 openbrace, closebrace, opencurly, closecurly, forstatement, semicolon,
00190 condition, catchpart, funcargs, functionarg, emitstatement ;
00191
00192 CommonParser& commonparser;
00193 ConditionParser conditionparser;
00194 ValueChangeParser valuechangeparser;
00195 ExpressionParser expressionparser;
00196 ArgumentsParser* argsparser;
00197 PeerParser peerparser;
00198
00199 boost::shared_ptr<FunctionGraphBuilder> program_builder;
00200 std::vector< FunctionGraphPtr > program_list;
00201
00202 base::ActionInterface* for_init_command;
00203 std::stack<base::ActionInterface*> for_incr_command;
00204 std::string program_text;
00205 bool exportf,globalf, parserused;
00206 int ln_offset;
00207 public:
00208 ProgramGraphParser( iter_t& positer, TaskContext* context, ExecutionEngine* caller, CommonParser& cp);
00209 ~ProgramGraphParser();
00210
00215 std::vector<ProgramInterfacePtr> parse( iter_t& begin, iter_t end );
00216
00217 std::vector<ProgramInterfacePtr> parseFunction( iter_t& begin, iter_t end );
00218
00223 void initBodyParser(const std::string& name, Service::shared_ptr stck, int offset);
00224
00230 rule_t& bodyParser();
00231
00235 rule_t& statementParser();
00236
00240 rule_t& programParser();
00241
00245 ProgramInterfacePtr programParserResult();
00249 rule_t& functionParser();
00250
00251 ProgramInterfacePtr bodyParserResult();
00252
00257 bool parserUsed() const;
00258 };
00259 }}
00260
00261 #endif