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