00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef skINTERPRETER_H
00022 #define skINTERPRETER_H
00023
00024 #include "skRValueTable.h"
00025 #include "skiExecutable.h"
00026 #include "skNull.h"
00027 #include "skParseNode.h"
00028 #include "skExecutableIterator.h"
00029 #include "skRValueTable.h"
00030
00031 class CLASSEXPORT skRValueArray;
00032 class CLASSEXPORT skExprNode;
00033 class CLASSEXPORT skStringList;
00034 class CLASSEXPORT skMethodDefNode;
00035 class CLASSEXPORT skTraceCallback;
00036 class CLASSEXPORT skStatementStepper;
00037
00038 #ifndef EXCEPTIONS_DEFINED
00039 #include "skScriptError.h"
00040 #endif
00041
00042 class CLASSEXPORT skStackFrame;
00043
00051 class CLASSEXPORT skInterpreter : public skExecutable
00052 {
00053 public:
00054
00055
00056
00057
00068 skMethodDefNode * parseString(const skString& location,const skString& code,skExecutableContext& ctxt);
00080 skMethodDefNode * parseExternalParams(const skString& location,skStringList& paramNames,const skString& code,skExecutableContext& ctxt);
00094 void executeString(const skString& location,skiExecutable * obj,const skString& code,skRValueArray& args,skRValue& return_value,skMethodDefNode ** parseTree,skExecutableContext& ctxt);
00095
00109 void executeStringExternalParams(const skString& location,skiExecutable * obj,skStringList& paramNames,const skString& code,skRValueArray& args,skRValue& r,skMethodDefNode ** keepParseTree,skExecutableContext& ctxt);
00110
00121 void executeParseTree(const skString& location,skiExecutable * obj,skMethodDefNode * parseTree,skRValueArray& args,skRValue& return_value,skExecutableContext& ctxt);
00122
00123
00134 skExprNode * parseExpression(const skString& location,const skString& expression,skExecutableContext& ctxt);
00146 void evaluateExpression(const skString& location,skiExecutable * obj,
00147 const skString& expression,skRValueTable& vars,
00148 skRValue& return_value,skExecutableContext& ctxt);
00149
00161 void evaluateExpression(const skString& location,skiExecutable * obj,
00162 skExprNode * expression,skRValueTable& vars,
00163 skRValue& return_value,skExecutableContext& ctxt);
00164
00165
00166
00167
00168
00174 void addGlobalVariable(const skString& name,skRValue value);
00179 void removeGlobalVariable(const skString& name);
00187 bool findGlobalVariable(const skString& name,skRValue& return_value);
00188
00193 const skRValueTable& getGlobalVariables() const;
00194
00195
00196
00197
00198
00203 virtual bool setValue(const skString& s,const skString& attribute,const skRValue& v);
00209 virtual bool getValue(const skString& s,const skString& attribute,skRValue& v);
00219 virtual bool method(const skString& method_name,skRValueArray& arguments,skRValue& return_value,skExecutableContext& ctxt);
00220
00225 virtual void getInstanceVariables(skRValueTable& table);
00226
00227
00228
00229
00230
00234 void trace(const skString& msg);
00238 void setTraceCallback(skTraceCallback * callback);
00239
00243 void setStatementStepper(skStatementStepper * stepper);
00244
00250 void runtimeError(skStackFrame& ctxt,const skString& msg);
00251
00252
00253
00254
00255
00259 skInterpreter();
00263 ~skInterpreter();
00264
00265
00269 static skNull g_Null;
00270
00271 private:
00272
00273
00274
00275
00276
00280 skInterpreter(const skInterpreter&);
00284 skInterpreter& operator=(const skInterpreter&);
00285
00286
00287
00288
00293 skRValue evaluate(skStackFrame& frame,skExprNode * n);
00298 skRValue evalMethod(skStackFrame& frame,skIdListNode * ids);
00308 void makeMethodCall(skStackFrame& frame,skRValue& robject,const skString& method_name,skExprNode * array_index, const skString& attribute,skExprListNode * exprs,skRValue& ret);
00309
00310
00311
00316 void executeAssignStat(skStackFrame& frame,skAssignNode * n);
00317
00318
00319
00326 bool executeStat(skStackFrame& frame,skStatNode * pstat,skRValue& r);
00327
00334 bool executeStats(skStackFrame& frame,skStatListNode * n,skRValue& r);
00335
00342 bool executeReturnStat(skStackFrame& frame,skReturnNode * n,skRValue& r);
00343
00350 bool executeIfStat(skStackFrame& frame,skIfNode * n,skRValue& r);
00351
00358 bool executeWhileStat(skStackFrame& frame,skWhileNode * n,skRValue& r);
00359
00366 bool executeSwitchStat(skStackFrame& frame,skSwitchNode * n,skRValue& r);
00367
00374 bool executeForEachStat(skStackFrame& frame,skForEachNode * n,skRValue& r);
00375
00382 bool executeForStat(skStackFrame& frame,skForNode * n,skRValue& r);
00383
00384
00385
00391 void addLocalVariable(skRValueTable& var,const skString& name,skRValue value);
00398 skString checkIndirectId(skStackFrame& frame,const skString& name);
00406 skRValue findValue(skStackFrame& frame,const skString& name,skExprNode * array_index,const skString& attribute);
00412 void followIdList(skStackFrame& frame,skIdListNode * idList,skRValue& object);
00413
00414
00423 bool extractFieldArrayValue(skStackFrame& frame,skRValue& robject,const skString& field_name,skExprNode * array_index,const skString& attrib,skRValue& ret);
00431 bool extractArrayValue(skStackFrame& frame,skRValue& robject,skExprNode * array_index,const skString& attrib,skRValue& ret) ;
00439 bool extractValue(skStackFrame& frame,skRValue& robject,const skString& name,const skString& attrib,skRValue& ret) ;
00440
00448 bool insertArrayValue(skStackFrame& frame,skRValue& robject, skExprNode * array_index,const skString& attr,const skRValue& value);
00456 bool insertValue(skStackFrame& frame,skRValue& robject,const skString& name, const skString& attr,const skRValue& value);
00457
00458
00460 skRValueTable m_GlobalVars;
00462 bool m_Tracing;
00464 skTraceCallback * m_TraceCallback;
00466 skStatementStepper * m_StatementStepper;
00467 };
00468
00469 inline skString skInterpreter::checkIndirectId(skStackFrame& frame,const skString& name)
00470
00471 {
00472
00473 skString ret=name;
00474 if (name.at(0)=='@'){
00475 ret=name.substr(1,name.length()-1);
00476 skRValue new_name=findValue(frame,ret,0,skString());
00477 ret=new_name.str();
00478 }
00479 return ret;
00480 }
00481
00482
00483 #endif
00484
00485