diff --git a/Makefile b/Makefile index 642130d..a733c6d 100644 --- a/Makefile +++ b/Makefile @@ -106,6 +106,7 @@ SRCS = \ src/minitscript/minitscript/NetworkMethods.cpp \ src/minitscript/minitscript/ScriptMethods.cpp \ src/minitscript/minitscript/SetMethods.cpp \ + src/minitscript/minitscript/Setup.cpp \ src/minitscript/minitscript/StringMethods.cpp \ src/minitscript/minitscript/TimeMethods.cpp \ src/minitscript/minitscript/Transpiler.cpp \ diff --git a/Makefile.nmake b/Makefile.nmake index 8392f07..87b3e8e 100644 --- a/Makefile.nmake +++ b/Makefile.nmake @@ -49,6 +49,7 @@ SRCS = \ src/minitscript/minitscript/NetworkMethods.cpp \ src/minitscript/minitscript/ScriptMethods.cpp \ src/minitscript/minitscript/SetMethods.cpp \ + src/minitscript/minitscript/Setup.cpp \ src/minitscript/minitscript/StringMethods.cpp \ src/minitscript/minitscript/TimeMethods.cpp \ src/minitscript/minitscript/Transpiler.cpp \ diff --git a/src/minitscript/minitscript/MinitScript.cpp b/src/minitscript/minitscript/MinitScript.cpp index 8d3725d..0942650 100644 --- a/src/minitscript/minitscript/MinitScript.cpp +++ b/src/minitscript/minitscript/MinitScript.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -89,6 +90,7 @@ using minitscript::minitscript::MapMethods; using minitscript::minitscript::MathMethods; using minitscript::minitscript::NetworkMethods; using minitscript::minitscript::ScriptMethods; +using minitscript::minitscript::Setup; using minitscript::minitscript::SetMethods; using minitscript::minitscript::StringMethods; using minitscript::minitscript::TimeMethods; @@ -960,192 +962,6 @@ int MinitScript::getStackletScopeScriptIdx(int scriptIdx) { return MinitScript::SCRIPTIDX_NONE; } - -bool MinitScript::setupFunctionAndStackletScriptIndices(int scriptIdx) { - // - auto& script = scripts[scriptIdx]; - auto statementIdx = STATEMENTIDX_FIRST; - // - for (auto& syntaxTreeNode: script.syntaxTree) { - auto& statement = script.statements[statementIdx++]; - // - if (setupFunctionAndStackletScriptIndices(syntaxTreeNode, statement) == false) { - // - return false; - } - } - // - return true; - -} - -bool MinitScript::setupFunctionAndStackletScriptIndices(SyntaxTreeNode& syntaxTreeNode, const Statement& statement) { - switch (syntaxTreeNode.type) { - case SyntaxTreeNode::SCRIPTSYNTAXTREENODE_LITERAL: - { - switch(syntaxTreeNode.value.getType()) { - case(MinitScript::TYPE_ARRAY): - case(MinitScript::TYPE_MAP): - { - if (setupFunctionAndStackletScriptIndices(syntaxTreeNode.value, statement, syntaxTreeNode.subLineIdx) == false) return false; - // - break; - } - case(MinitScript::TYPE_FUNCTION_ASSIGNMENT): - { - string function; - auto functionScriptIdx = SCRIPTIDX_NONE; - if (syntaxTreeNode.value.getFunctionValue(function, functionScriptIdx) == false || - (functionScriptIdx = getFunctionScriptIdx(function)) == SCRIPTIDX_NONE) { - // - _Console::printLine( - getStatementInformation(statement, syntaxTreeNode.subLineIdx) + - ": Function not found: " + - syntaxTreeNode.value.getValueAsString() - ); - // - parseErrors.push_back( - getStatementInformation(statement, syntaxTreeNode.subLineIdx) + - ": Function not found: " + - syntaxTreeNode.value.getValueAsString() - ); - // - return false; - } - // - syntaxTreeNode.value.setFunctionAssignment(function, functionScriptIdx); - // - break; - } - case(MinitScript::TYPE_STACKLET_ASSIGNMENT): - { - string stacklet; - auto stackletScriptIdx = SCRIPTIDX_NONE; - if (syntaxTreeNode.value.getStackletValue(stacklet, stackletScriptIdx) == false || - (stackletScriptIdx = getFunctionScriptIdx(stacklet)) == SCRIPTIDX_NONE) { - // - _Console::printLine( - getStatementInformation(statement, syntaxTreeNode.subLineIdx) + - ": Stacklet not found" + - syntaxTreeNode.value.getValueAsString() - ); - // - parseErrors.push_back( - getStatementInformation(statement, syntaxTreeNode.subLineIdx) + - ": Stacklet not found: " + - syntaxTreeNode.value.getValueAsString() - ); - // - return false; - } - // - syntaxTreeNode.value.setStackletAssignment(stacklet, stackletScriptIdx); - // - break; - } - default: - break; - } - // - break; - } - case SyntaxTreeNode::SCRIPTSYNTAXTREENODE_EXECUTE_METHOD: - case SyntaxTreeNode::SCRIPTSYNTAXTREENODE_EXECUTE_FUNCTION: - { - for (auto& argument: syntaxTreeNode.arguments) { - if (setupFunctionAndStackletScriptIndices(argument, statement) == false) return false; - } - // - break; - } - default: - break; - } - // - return true; -} - -bool MinitScript::setupFunctionAndStackletScriptIndices(Variable& variable, const Statement& statement, int subLineIdx) { - switch (variable.getType()) { - case TYPE_ARRAY: - { - auto arrayPointer = variable.getArrayPointer(); - if (arrayPointer == nullptr) break; - for (auto arrayEntry: *arrayPointer) { - if (setupFunctionAndStackletScriptIndices(*arrayEntry, statement, subLineIdx) == false) return false; - } - // - break; - } - case TYPE_MAP: - { - // - auto mapPointer = variable.getMapPointer(); - if (mapPointer == nullptr) break; - for (auto& [mapKey, mapValue]: *mapPointer) { - if (setupFunctionAndStackletScriptIndices(*mapValue, statement, subLineIdx) == false) return false; - } - // - break; - } - case TYPE_FUNCTION_ASSIGNMENT: - { - string function; - auto functionScriptIdx = SCRIPTIDX_NONE; - if (variable.getFunctionValue(function, functionScriptIdx) == false || - (functionScriptIdx = getFunctionScriptIdx(function)) == SCRIPTIDX_NONE) { - // - _Console::printLine( - getStatementInformation(statement, subLineIdx) + - ": Function not found: " + - variable.getValueAsString() - ); - // - parseErrors.push_back( - getStatementInformation(statement, subLineIdx) + - ": Function not found: " + - variable.getValueAsString() - ); - // - return false; - } - // - variable.setFunctionAssignment(function, functionScriptIdx); - // - break; - } - case TYPE_STACKLET_ASSIGNMENT: - { - string stacklet; - auto stackletScriptIdx = SCRIPTIDX_NONE; - if (variable.getStackletValue(stacklet, stackletScriptIdx) == false || - (stackletScriptIdx = getFunctionScriptIdx(stacklet)) == SCRIPTIDX_NONE) { - // - _Console::printLine( - getStatementInformation(statement, subLineIdx) + - ": Stacklet not found" + - variable.getValueAsString() - ); - // - parseErrors.push_back( - getStatementInformation(statement, subLineIdx) + - ": Stacklet not found: " + - variable.getValueAsString() - ); - // - return false; - } - // - variable.setStackletAssignment(stacklet, stackletScriptIdx); - // - break; - } - default: break; - } - // - return true; -} - void MinitScript::emit(const string& condition) { // defer emit if a function/stacklet is still running if (isFunctionRunning() == true) { @@ -2578,7 +2394,7 @@ void MinitScript::parseScript(const string& pathName, const string& fileName, bo // set up stacklet and function indices for (auto scriptIdx = 0; scriptIdx < scripts.size(); scriptIdx++) { // - if (setupFunctionAndStackletScriptIndices(scriptIdx) == false) { + if (Setup::setupFunctionAndStackletScriptIndices(this, scriptIdx, parseErrors) == false) { scriptValid = false; return; } diff --git a/src/minitscript/minitscript/MinitScript.h b/src/minitscript/minitscript/MinitScript.h index 011cb9d..d440cf2 100644 --- a/src/minitscript/minitscript/MinitScript.h +++ b/src/minitscript/minitscript/MinitScript.h @@ -72,6 +72,7 @@ class minitscript::minitscript::MinitScript { friend class JSONMethods; friend class MathMethods; friend class ScriptMethods; + friend class Setup; friend class Transpiler; friend class Validations; @@ -3861,28 +3862,6 @@ class minitscript::minitscript::MinitScript { */ int getStackletScopeScriptIdx(int scriptIdx); - /** - * Setup function and stacket script indices - * @param scriptIdx script index - */ - bool setupFunctionAndStackletScriptIndices(int scriptIdx); - - /** - * Setup function and stacket script indices - * @param syntaxTreeNode syntax tree node - * @param statement statement - */ - bool setupFunctionAndStackletScriptIndices(SyntaxTreeNode& syntaxTreeNode, const Statement& statement); - - /** - * Setup function and stacket script indices - * @param variable variable - * @param statement statement - * @param subLineIdx sub line index - * @return success - */ - bool setupFunctionAndStackletScriptIndices(Variable& variable, const Statement& statement, int subLineIdx); - /** * Returns if char is operator char * @param c char to test diff --git a/src/minitscript/minitscript/Setup.cpp b/src/minitscript/minitscript/Setup.cpp new file mode 100644 index 0000000..467c8c1 --- /dev/null +++ b/src/minitscript/minitscript/Setup.cpp @@ -0,0 +1,198 @@ +#include +#include + +#include +#include +#include + +using std::string; +using std::vector; + +using minitscript::minitscript::MinitScript; +using minitscript::minitscript::Setup; + +bool Setup::setupFunctionAndStackletScriptIndices(MinitScript* minitScript, int scriptIdx, vector& parseErrors) { + // + auto& scripts = minitScript->scripts; + auto& script = scripts[scriptIdx]; + auto statementIdx = MinitScript::STATEMENTIDX_FIRST; + // + for (auto& syntaxTreeNode: script.syntaxTree) { + auto& statement = script.statements[statementIdx++]; + // + if (setupFunctionAndStackletScriptIndices(minitScript, syntaxTreeNode, statement, parseErrors) == false) { + // + return false; + } + } + // + return true; + +} + +bool Setup::setupFunctionAndStackletScriptIndices(MinitScript* minitScript, MinitScript::SyntaxTreeNode& syntaxTreeNode, const MinitScript::Statement& statement, vector& parseErrors) { + switch (syntaxTreeNode.type) { + case MinitScript::SyntaxTreeNode::SCRIPTSYNTAXTREENODE_LITERAL: + { + switch(syntaxTreeNode.value.getType()) { + case(MinitScript::TYPE_ARRAY): + case(MinitScript::TYPE_MAP): + { + if (setupFunctionAndStackletScriptIndices(minitScript, syntaxTreeNode.value, statement, syntaxTreeNode.subLineIdx, parseErrors) == false) return false; + // + break; + } + case(MinitScript::TYPE_FUNCTION_ASSIGNMENT): + { + string function; + auto functionScriptIdx = MinitScript::SCRIPTIDX_NONE; + if (syntaxTreeNode.value.getFunctionValue(function, functionScriptIdx) == false || + (functionScriptIdx = minitScript->getFunctionScriptIdx(function)) == MinitScript::SCRIPTIDX_NONE) { + // + _Console::printLine( + minitScript->getStatementInformation(statement, syntaxTreeNode.subLineIdx) + + ": Function not found: " + + syntaxTreeNode.value.getValueAsString() + ); + // + parseErrors.push_back( + minitScript->getStatementInformation(statement, syntaxTreeNode.subLineIdx) + + ": Function not found: " + + syntaxTreeNode.value.getValueAsString() + ); + // + return false; + } + // + syntaxTreeNode.value.setFunctionAssignment(function, functionScriptIdx); + // + break; + } + case(MinitScript::TYPE_STACKLET_ASSIGNMENT): + { + string stacklet; + auto stackletScriptIdx = MinitScript::SCRIPTIDX_NONE; + if (syntaxTreeNode.value.getStackletValue(stacklet, stackletScriptIdx) == false || + (stackletScriptIdx = minitScript->getFunctionScriptIdx(stacklet)) == MinitScript::SCRIPTIDX_NONE) { + // + _Console::printLine( + minitScript->getStatementInformation(statement, syntaxTreeNode.subLineIdx) + + ": Stacklet not found" + + syntaxTreeNode.value.getValueAsString() + ); + // + parseErrors.push_back( + minitScript->getStatementInformation(statement, syntaxTreeNode.subLineIdx) + + ": Stacklet not found: " + + syntaxTreeNode.value.getValueAsString() + ); + // + return false; + } + // + syntaxTreeNode.value.setStackletAssignment(stacklet, stackletScriptIdx); + // + break; + } + default: + break; + } + // + break; + } + case MinitScript::SyntaxTreeNode::SCRIPTSYNTAXTREENODE_EXECUTE_METHOD: + case MinitScript::SyntaxTreeNode::SCRIPTSYNTAXTREENODE_EXECUTE_FUNCTION: + { + for (auto& argument: syntaxTreeNode.arguments) { + if (setupFunctionAndStackletScriptIndices(minitScript, argument, statement, parseErrors) == false) return false; + } + // + break; + } + default: + break; + } + // + return true; +} + +bool Setup::setupFunctionAndStackletScriptIndices(MinitScript* minitScript, MinitScript::Variable& variable, const MinitScript::Statement& statement, int subLineIdx, vector& parseErrors) { + switch (variable.getType()) { + case MinitScript::TYPE_ARRAY: + { + auto arrayPointer = variable.getArrayPointer(); + if (arrayPointer == nullptr) break; + for (auto arrayEntry: *arrayPointer) { + if (setupFunctionAndStackletScriptIndices(minitScript, *arrayEntry, statement, subLineIdx, parseErrors) == false) return false; + } + // + break; + } + case MinitScript::TYPE_MAP: + { + // + auto mapPointer = variable.getMapPointer(); + if (mapPointer == nullptr) break; + for (auto& [mapKey, mapValue]: *mapPointer) { + if (setupFunctionAndStackletScriptIndices(minitScript, *mapValue, statement, subLineIdx, parseErrors) == false) return false; + } + // + break; + } + case MinitScript::TYPE_FUNCTION_ASSIGNMENT: + { + string function; + auto functionScriptIdx = MinitScript::SCRIPTIDX_NONE; + if (variable.getFunctionValue(function, functionScriptIdx) == false || + (functionScriptIdx = minitScript->getFunctionScriptIdx(function)) == MinitScript::SCRIPTIDX_NONE) { + // + _Console::printLine( + minitScript->getStatementInformation(statement, subLineIdx) + + ": Function not found: " + + variable.getValueAsString() + ); + // + parseErrors.push_back( + minitScript->getStatementInformation(statement, subLineIdx) + + ": Function not found: " + + variable.getValueAsString() + ); + // + return false; + } + // + variable.setFunctionAssignment(function, functionScriptIdx); + // + break; + } + case MinitScript::TYPE_STACKLET_ASSIGNMENT: + { + string stacklet; + auto stackletScriptIdx = MinitScript::SCRIPTIDX_NONE; + if (variable.getStackletValue(stacklet, stackletScriptIdx) == false || + (stackletScriptIdx = minitScript->getFunctionScriptIdx(stacklet)) == MinitScript::SCRIPTIDX_NONE) { + // + _Console::printLine( + minitScript->getStatementInformation(statement, subLineIdx) + + ": Stacklet not found" + + variable.getValueAsString() + ); + // + parseErrors.push_back( + minitScript->getStatementInformation(statement, subLineIdx) + + ": Stacklet not found: " + + variable.getValueAsString() + ); + // + return false; + } + // + variable.setStackletAssignment(stacklet, stackletScriptIdx); + // + break; + } + default: break; + } + // + return true; +} diff --git a/src/minitscript/minitscript/Setup.h b/src/minitscript/minitscript/Setup.h new file mode 100644 index 0000000..13eefd1 --- /dev/null +++ b/src/minitscript/minitscript/Setup.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include + +#include +#include + +using minitscript::minitscript::MinitScript; + +using std::string; +using std::vector; + +/** + * MinitScript setup methods + * @author Andreas Drewke + */ +class minitscript::minitscript::Setup { +public: + /** + * Setup function and stacket script indices + * @param minitScript MinitScript instance + * @param scriptIdx script index + * @param parseErrors parse errors + */ + static bool setupFunctionAndStackletScriptIndices(MinitScript* minitScript, int scriptIdx, vector& parseErrors); + + /** + * Setup function and stacket script indices + * @param minitScript MinitScript instance + * @param syntaxTreeNode syntax tree node + * @param statement statement + * @param parseErrors parse errors + */ + static bool setupFunctionAndStackletScriptIndices(MinitScript* minitScript, MinitScript::SyntaxTreeNode& syntaxTreeNode, const MinitScript::Statement& statement, vector& parseErrors); + + /** + * Setup function and stacket script indices + * @param minitScript MinitScript instance + * @param variable variable + * @param statement statement + * @param subLineIdx sub line index + * @param parseErrors parse errors + * @return success + */ + static bool setupFunctionAndStackletScriptIndices(MinitScript* minitScript, MinitScript::Variable& variable, const MinitScript::Statement& statement, int subLineIdx, vector& parseErrors); + +}; diff --git a/src/minitscript/minitscript/fwd-minitscript.h b/src/minitscript/minitscript/fwd-minitscript.h index 6f9c403..d1312cc 100644 --- a/src/minitscript/minitscript/fwd-minitscript.h +++ b/src/minitscript/minitscript/fwd-minitscript.h @@ -24,6 +24,7 @@ namespace minitscript { class MinitScript; class ScriptMethods; class SetMethods; + class Setup; class StringMethods; class TimeMethods; class Transpiler;