Scanframe Modular Application 0.1.0
Loading...
Searching...
No Matches
ScriptInterpreter.h
Go to the documentation of this file.
1#pragma once
5#include <misc/global.h>
6
7namespace sf
8{
9
14{
15 public:
21
26
31
35 ChangeListener::emitter_type& getChangeEmitter()
36 {
37 return _emitterChange;
38 }
39
44 [[nodiscard]] std::string getScriptName() const;
45
50 void setScriptName(const std::string& name);
51
55 void setOutputStream(std::ostream* os);
56
60 enum EState
61 {
63 esError = 0,
73 esCurrent
74 };
75
80 {
90 emAbort
91 };
92
96 struct CodePos
97 {
98 CodePos() = default;
99
101 : _line(line)
102 , _offset(offset)
103 {}
104
105 pos_type _line{0};
106 pos_type _offset{0};
107 };
108
113 EState execute(EExecMode exec_mode = emRun);
114
121 bool compile(const char* cmd);
122
126 [[nodiscard]] const char* getStateName(EState exec_state = esCurrent) const;
127
131 [[nodiscard]] EState getState() const;
132
136 [[nodiscard]] std::string getDebugText() const;
137
141 [[nodiscard]] CodePos getErrorPos() const;
142
146 [[nodiscard]] ip_type getInstructionPtr() const;
147
151 [[nodiscard]] ip_type getErrorInstructionPtr() const;
152
156 [[nodiscard]] std::string getInstructionText(ip_type ip) const;
157
161 void flush();
162
169 bool callFunction(const std::string& name, bool step_mode);
170
174 void callFunction(ip_type ip, bool step_mode);
175
181 void setMaxLoopTime(unsigned long usec);
182
183 // Overloaded from base class.
184 [[nodiscard]] strings getInfoNames() const override;
185
192 [[nodiscard]] const IdInfo* getInfo(const std::string& name) const override;
193
198 {
203 {
204 eiGoto = -3,
205 eiContinue = -2,
206 eiBreak = -1,
207 eiNone = 0,
213 eiLastEntry
214 };
215
219 Instruction() = default;
220
224 Instruction(EInstr instr, ip_type ip, const CodePos& pos, std::string script = std::string());
225
229 EInstr _instr{eiNone};
233 CodePos _codePos{0, 0};
237 std::string _script{};
241 ip_type _absIp{-1};
242
246 [[nodiscard]] const char* getMnemonic() const;
247
252 [[nodiscard]] ip_type getJumpIp() const;
253 };
254
258 struct VariableInfo;
262 struct LabelInfo;
263
267 [[nodiscard]] const TVector<Instruction>& getInstructions() const
268 {
269 return _instructions;
270 }
271
275 [[nodiscard]] const TVector<VariableInfo*>& getVariables() const
276 {
277 return _variables;
278 }
279
285 [[nodiscard]] strings getIdentifiers(EIdentifier id) const override;
286
291 [[nodiscard]] bool isStepMode() const;
292
293 protected:
298 {
300 ecNormal = 0,
307 };
308
326
330 bool getSetValue(const IdInfo* info, Value* value, Value::vector_type* params, bool flag_set) override;
331
336 virtual bool compileAdditionalStatement(const IdInfo* info, const std::string& source);
337
343 virtual void exitFunction(EExitCode exitcode, const Value& value);
344
348 virtual void clear();
349
353 virtual void linkInstruction();
354
358 void setState(EState exec_state);
359
365 ip_type getLabelIp(const std::string& name);
366
376 std::ostream* _outputStream{nullptr};
377
378 private:
382 void getExternalSource(std::string& source);
383
387 ip_type addInstruction(Instruction::EInstr instr, ip_type ip, pos_type pos, const std::string& script = std::string());
388
392 void setJumpInstruction(ip_type ip, ip_type jmp_ip = -1);
393
397 void setBreakInstruction(ip_type start_ip, ip_type jmp_ip);
398
402 void setContinueInstruction(ip_type start_ip, ip_type jmp_ip);
403
407 void skipWhite();
408
412 void setPosition(pos_type pos);
413
417 bool getIdName(std::string& name);
418
424 bool doCompile();
425
429 bool compileKeyword(const IdInfo* Info, pos_type pos);
430
434 void doStep();
435
439 void doExecute();
440
446 bool isKeyWord(EKeyWord keyword);
447
453 const char* getKeyWordText(EKeyWord keyword);
454
461 bool getScript(std::string& script, char ending);
462
466 void getVarScript(std::string& script);
467
471 std::string getProfilePath();
472
477 const EState _currentState{esEmpty};
481 EState _prevState{esEmpty};
485 Value _accumulator{};
489 const char* _command;
493 pos_type _codePos{0};
497 pos_type _codeLine{0};
501 bool _flagSentry{false};
505 bool _flagStepMode{false};
509 TVector<Instruction> _instructions{};
513 ip_type _currentInstructionPtr{-1};
517 ip_type _errorInstructionPtr{-1};
521 ip_type _mainFunction{-1};
522
526 struct _MISC_CLASS StackEntry
527 {
528 explicit StackEntry(ip_type ip)
529 {
530 _ip = ip;
531 }
532
536 ip_type _ip{0};
537 };
538
542 TVector<StackEntry> _stack;
546 TVector<VariableInfo*> _variables;
550 TVector<LabelInfo*> _labels;
554 ElapseTimer _sleepTimer;
558 std::string _scriptName;
562 Value::int_type _trace{0};
566 static IdInfo _info[];
570 static const char* _instructionNames[];
574 static const char* _stateNames[];
578 static const char* _exitCodeNames[];
579
583 ChangeListener::emitter_type _emitterChange;
584};
585
586}// namespace sf
Timer for turning true when a certain amount of time has passed.
Definition ElapseTimer.h:12
Simple script engine able.
Definition ScriptEngine.h:13
Script interpreter for running a loaded script.
Definition ScriptInterpreter.h:14
void flush()
Calls the protected virtual clear function.
ip_type getLabelIp(const std::string &name)
Gets the ip from the label name.
void setState(EState exec_state)
Sets the execution state.
virtual bool compileAdditionalStatement(const IdInfo *info, const std::string &source)
Compile external supplied keyword.
strings getIdentifiers(EIdentifier id) const override
Gets a list of available identifiers.
ip_type getErrorInstructionPtr() const
Gets the error instruction pointer in case of an error.
std::string getInstructionText(ip_type ip) const
Gets the instruction text at pointer IP.
void setScriptName(const std::string &name)
Sets the name given by the user. Is used for referencing when debugging.
ElapseTimer _loopTimer
Timer to prevent endless loops.
Definition ScriptInterpreter.h:372
std::string getDebugText() const
const IdInfo * getInfo(const std::string &name) const override
EExecMode
Enumerate for indicating the mode of execution.
Definition ScriptInterpreter.h:80
@ emInit
Definition ScriptInterpreter.h:82
@ emRun
Definition ScriptInterpreter.h:84
@ emStep
Definition ScriptInterpreter.h:88
@ emStart
Definition ScriptInterpreter.h:86
virtual void exitFunction(EExitCode exitcode, const Value &value)
Function is called at the exit of the script.
EExitCode
Possible exit codes.
Definition ScriptInterpreter.h:298
@ ecError
Definition ScriptInterpreter.h:302
@ ecApplication
Definition ScriptInterpreter.h:306
@ ecScript
Definition ScriptInterpreter.h:304
const TVector< Instruction > & getInstructions() const
Gets the instruction text at pointer IP.
Definition ScriptInterpreter.h:267
bool callFunction(const std::string &name, bool step_mode)
EState getState() const
bool compile(const char *cmd)
Compiles the passed script text and outputs debug info to the stream.
ChangeListener::emitter_type & getChangeEmitter()
Gets the emitter for change events.
Definition ScriptInterpreter.h:35
void callFunction(ip_type ip, bool step_mode)
Makes it possible to execute function/gosub.
~ScriptInterpreter() override
Virtual destructor.
bool getSetValue(const IdInfo *info, Value *value, Value::vector_type *params, bool flag_set) override
Overridden from ScriptEngine class.
void setOutputStream(std::ostream *os)
Sets and enables debugging output stream.
EState
State of the running script.
Definition ScriptInterpreter.h:61
@ esReady
Definition ScriptInterpreter.h:71
@ esRunning
Definition ScriptInterpreter.h:69
@ esCompiled
Definition ScriptInterpreter.h:67
@ esEmpty
Definition ScriptInterpreter.h:65
EKeyWord
Keywords available for the script.
Definition ScriptInterpreter.h:313
@ kwWhile
Definition ScriptInterpreter.h:316
@ kwReturn
Definition ScriptInterpreter.h:322
@ kwBreak
Definition ScriptInterpreter.h:319
@ kwExternal
Definition ScriptInterpreter.h:323
@ kwExtern
Definition ScriptInterpreter.h:324
@ kwSubroutine
Definition ScriptInterpreter.h:321
@ kwIf
Definition ScriptInterpreter.h:315
@ kwGoto
Definition ScriptInterpreter.h:318
@ kwContinue
Definition ScriptInterpreter.h:320
@ kwElse
Definition ScriptInterpreter.h:317
TListener< const ScriptInterpreter * > ChangeListener
Declare type for listening and at the same time a type for emitting the changes of the script like St...
Definition ScriptInterpreter.h:20
virtual void clear()
Clears compiled data can be overloaded by derived classes.
std::string getScriptName() const
Gets the name given by the user. Is used for referencing when debugging.
void setMaxLoopTime(unsigned long usec)
Sets the maximum loop time for this instance.
const TVector< VariableInfo * > & getVariables() const
Gets the current variables declared in the script.
Definition ScriptInterpreter.h:275
EState execute(EExecMode exec_mode=emRun)
Executes a macro depending on the execution mode.
strings getInfoNames() const override
Gets names of info structures in lines.
CodePos getErrorPos() const
virtual void linkInstruction()
Links the labels of the calls in the script.
const char * getStateName(EState exec_state=esCurrent) const
Gets the execution state name from the passed state or the current one on state 'esCurrent'.
bool isStepMode() const
Get the step mode of the script.
ScriptInterpreter()
Default constructor.
ip_type getInstructionPtr() const
ssize_t ip_type
Instruction pointer type.
Definition ScriptObject.h:37
EIdentifier
Keyword identifiers.
Definition ScriptObject.h:43
std::string::size_type pos_type
Source position type.
Definition ScriptObject.h:33
Template class used to bind listeners to a handler_type instance.
Definition TListener.h:135
Counted vector having additional methods and operators for ease of usage. This template class extends...
Definition TVector.h:20
Value container class able to performing arithmetic functions.
Definition Value.h:19
#define _MISC_CLASS
Definition misc/global.h:40
Definition Application.h:10
TStrings< std::string > strings
Vector of std::strings with additional functionality.
Definition TStrings.h:193
Position in the source with line and offset.
Definition ScriptInterpreter.h:97
CodePos(pos_type line, pos_type offset)
Definition ScriptInterpreter.h:100
Executable instruction as result of interpreting the script.
Definition ScriptInterpreter.h:198
const char * getMnemonic() const
Gets the mnemonic of the current instruction.
EInstr
Interpreter available instructions.
Definition ScriptInterpreter.h:203
@ eiCalculate
Definition ScriptInterpreter.h:208
@ eiTestJump
Definition ScriptInterpreter.h:209
@ eiJump
Definition ScriptInterpreter.h:210
@ eiCall
Definition ScriptInterpreter.h:211
@ eiRetFunction
Definition ScriptInterpreter.h:212
Instruction()=default
Default constructor.
Instruction(EInstr instr, ip_type ip, const CodePos &pos, std::string script=std::string())
Initializing constructor.
ip_type getJumpIp() const
Gets the jump ip from this instruction when applicable.
Used to create static lookup lists.
Definition ScriptObject.h:62