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 seenfunctionarg();
00144 void seenfunctionend();
00145
00146 void seenfuncidentifier( iter_t begin, iter_t end);
00147 void seencallfuncstatement();
00148 void seencallfuncargs();
00149
00150 void seenreturnstatement();
00151 void seenreturnlabel();
00152 void seenreturnvalue();
00153 void seenreturntype( iter_t begin, iter_t end );
00154
00155 void seenifstatement();
00156 void endifblock();
00157 void endifstatement();
00158
00159 void seenwhilestatement();
00160 void endwhilestatement();
00161
00162 void seenbreakstatement();
00163
00164 void seenforstatement();
00165 void seenforinit();
00166 void seenforinit_expr();
00167 void seenforincr();
00168 void seenemptyforincr();
00169 void endforstatement();
00170
00171 void startofprogram();
00172 void programdef( iter_t begin, iter_t end );
00173 void seenprogramend();
00174 void programtext(iter_t, iter_t);
00175
00176 void setStack(Service::shared_ptr st);
00178 void clearParseState();
00179 void setup();
00180 void setup2();
00181 void cleanup(bool remove_service);
00182
00183 rule_t newline, terminationclause, jumpdestination, terminationpart, andpart,
00184 dostatement, trystatement, statement, line, content, program,
00185 production, valuechange, returnstatement, function, functions, arguments, funcstatement,
00186 continuepart, returnpart, callpart, ifstatement, ifblock, whilestatement, breakstatement,
00187 openbrace, closebrace, opencurly, closecurly, forstatement, semicolon,
00188 condition, catchpart, funcargs, functionarg, emitstatement ;
00189
00190 CommonParser& commonparser;
00191 ConditionParser conditionparser;
00192 ValueChangeParser valuechangeparser;
00193 ExpressionParser expressionparser;
00194 ArgumentsParser* argsparser;
00195 PeerParser peerparser;
00196
00197 boost::shared_ptr<FunctionGraphBuilder> program_builder;
00198 std::vector< FunctionGraphPtr > program_list;
00199
00200 base::ActionInterface* for_init_command;
00201 std::stack<base::ActionInterface*> for_incr_command;
00202 std::string program_text;
00203 bool exportf;
00204 int ln_offset;
00205 public:
00206 ProgramGraphParser( iter_t& positer, TaskContext* context, ExecutionEngine* caller, CommonParser& cp);
00207 ~ProgramGraphParser();
00208
00213 std::vector<ProgramInterfacePtr> parse( iter_t& begin, iter_t end );
00214
00215 std::vector<ProgramInterfacePtr> parseFunction( iter_t& begin, iter_t end );
00216
00221 void initBodyParser(const std::string& name, Service::shared_ptr stck, int offset);
00222
00228 rule_t& bodyParser();
00229
00233 rule_t& statementParser();
00234
00238 rule_t& programParser();
00239
00243 ProgramInterfacePtr programParserResult();
00247 rule_t& functionParser();
00248
00249 ProgramInterfacePtr bodyParserResult();
00250
00251 };
00252 }}
00253
00254 #endif