6 #include <unordered_map>
7 #include <unordered_set>
17 using std::unordered_map;
18 using std::unordered_set;
36 static void transpile(
MinitScript* minitScript,
const string& transpilationFileName,
const vector<string>& minitScriptExtensionFileNames);
43 static void untranspile(
const string& scriptFileName,
const string& transpilationFileName);
93 if (scriptIdx < 0 || scriptIdx >= minitScript->
getScripts().size())
return string();
94 const auto& script = minitScript->
getScripts()[scriptIdx];
107 (script.name.empty() ==
false?script.name:(
108 StringTools::regexMatch(script.condition,
"[a-zA-Z0-9_]+") ==
true?
121 if (scriptIdx < 0 || scriptIdx >= minitScript->
getScripts().size())
return string();
122 const auto& script = minitScript->
getScripts()[scriptIdx];
124 (script.name.empty() ==
false?script.name:(
125 StringTools::regexMatch(script.condition,
"[a-zA-Z0-9_]+") ==
true?
140 const array<char, 11> escapeSequences = {
'0',
'a',
'b',
'f',
'n',
'r',
't',
'v',
'U',
'"'};
141 for (
const auto c: escapeSequences) {
145 result = StringTools::replace(result,
"\0",
"\\0");
146 result = StringTools::replace(result,
"\a",
"\\a");
147 result = StringTools::replace(result,
"\b",
"\\b");
148 result = StringTools::replace(result,
"\f",
"\\f");
149 result = StringTools::replace(result,
"\n",
"\\n");
150 result = StringTools::replace(result,
"\r",
"\\r");
151 result = StringTools::replace(result,
"\t",
"\\t");
152 result = StringTools::replace(result,
"\v",
"\\v");
153 result = StringTools::replace(result,
"\"",
"\\\"");
158 for (
auto i = 0; i < result.size(); i++) {
161 auto nc = i < result.size() - 1?result[i + 1]:
'\0';
162 if (c ==
'\\' && lc !=
'\\' && nc !=
'\\' && find(escapeSequences.begin(), escapeSequences.end(), nc) == escapeSequences.end()) {
181 auto doubleDotIdx = StringTools::indexOf(variableStatement,
"::");
182 if (doubleDotIdx == string::npos) doubleDotIdx = 0;
183 auto dotIdx = StringTools::indexOf(variableStatement,
".", doubleDotIdx);
184 if (dotIdx != string::npos)
return true;
185 auto squareBracketIdx = StringTools::indexOf(variableStatement,
"[", doubleDotIdx);
186 if (squareBracketIdx != string::npos)
return true;
196 auto doubleDotIdx = StringTools::indexOf(variableStatement,
"::");
197 if (doubleDotIdx == string::npos) doubleDotIdx = 0;
198 auto dotIdx = StringTools::indexOf(variableStatement,
".", doubleDotIdx);
199 if (dotIdx == string::npos) dotIdx = variableStatement.size();
200 auto squareBracketIdx = StringTools::indexOf(variableStatement,
"[", doubleDotIdx);
201 if (squareBracketIdx == string::npos) squareBracketIdx = variableStatement.size();
202 auto cppVariableName = StringTools::substring(variableStatement, 0, dotIdx < squareBracketIdx?dotIdx:squareBracketIdx);
203 return cppVariableName;
212 auto doubleDotIdx = StringTools::indexOf(variableStatement,
"::");
213 if (doubleDotIdx == string::npos) doubleDotIdx = 0;
214 auto dotIdx = StringTools::indexOf(variableStatement,
".", doubleDotIdx);
215 if (dotIdx == string::npos) dotIdx = variableStatement.size();
216 auto squareBracketIdx = StringTools::indexOf(variableStatement,
"[", doubleDotIdx);
217 if (squareBracketIdx == string::npos) squareBracketIdx = variableStatement.size();
218 auto cppVariableName =
"_" + StringTools::substring(variableStatement, 1, dotIdx < squareBracketIdx?dotIdx:squareBracketIdx);
219 cppVariableName = StringTools::replace(cppVariableName,
"$",
"_");
220 cppVariableName = StringTools::replace(cppVariableName,
":",
"_");
221 cppVariableName = StringTools::replace(cppVariableName,
".",
"_");
222 return cppVariableName;
231 auto doubleDotIdx = StringTools::indexOf(variableStatement,
"::");
232 if (doubleDotIdx == string::npos) doubleDotIdx = 0;
233 auto dotIdx = StringTools::indexOf(variableStatement,
".", doubleDotIdx);
234 if (dotIdx == string::npos) dotIdx = variableStatement.size();
235 auto squareBracketIdx = StringTools::indexOf(variableStatement,
"[", doubleDotIdx);
236 if (squareBracketIdx == string::npos) squareBracketIdx = variableStatement.size();
237 auto cppVariableName =
"_" + StringTools::substring(variableStatement, 1, dotIdx < squareBracketIdx?dotIdx:squareBracketIdx);
238 cppVariableName = StringTools::replace(cppVariableName,
"$",
"_");
239 cppVariableName = StringTools::replace(cppVariableName,
":",
"_");
240 cppVariableName = StringTools::replace(cppVariableName,
".",
"_");
241 return cppVariableName;
271 static void determineVariables(
MinitScript* minitScript, unordered_set<string>& globalVariables, vector<unordered_set<string>>& localVariables);
290 const vector<string>& minitScriptExtensionsCode,
291 const string& className,
293 unordered_map<
string, vector<string>>& methodCodeMap
318 string& generatedCode,
319 int scriptConditionIdx,
321 const string& variableName,
322 const string& indent,
323 bool getMethodArgumentVariable,
325 bool getVariableReference,
327 bool setVariableReference,
329 const string& returnValueStatement =
"returnValue = ",
330 const string& statementEnd =
";\n",
331 int getArgumentIdx = 0,
332 int setArgumentIdx = 1
353 string& generatedDefinitions,
354 const string& minitScriptClassName,
355 int scriptConditionIdx,
357 const string& methodName,
360 const unordered_map<
string, vector<string>>& methodCodeMap,
361 const unordered_set<string>& allMethods,
363 const vector<int>& argumentIndices = {},
375 vector<string>& generatedDeclarations,
376 vector<string>& generatedDefinitions
397 int scriptConditionIdx,
399 const MinitScript::Variable& variable,
400 const unordered_map<
string, vector<string>>& methodCodeMap,
401 const unordered_set<string>& allMethods,
402 const string& methodName,
404 const string& minitScriptClassName,
405 string& generatedDefinitions,
407 int initializerDepth = 0,
408 const string& postStatement =
string()
429 string& generatedDefinitions,
430 int scriptConditionIdx,
432 const string& minitScriptClassName,
433 const string& methodName,
434 const MinitScript::SyntaxTreeNode& syntaxTree,
435 const MinitScript::Statement& statement,
436 const unordered_map<
string, vector<string>>& methodCodeMap,
437 const unordered_set<string>& allMethods,
439 const vector<int>& argumentIndices = {},
465 string& generatedCode,
466 const MinitScript::SyntaxTreeNode& syntaxTree,
467 const MinitScript::Statement& statement,
468 int scriptConditionIdx,
471 const unordered_map<
string, vector<string>>& methodCodeMap,
472 const unordered_set<string>& allMethods,
473 bool& scriptStateChanged,
475 vector<string>& enabledNamedConditions,
477 const vector<int>& argumentIndices = {},
478 const string& returnValue = string(),
479 const string& injectCode = string(),
480 int additionalIndent = 0
495 const string& className,
496 string& generatedCode,
498 const unordered_map<
string, vector<string>>& methodCodeMap,
499 const unordered_set<string>& allMethods
515 string& generatedCode,
517 const unordered_map<
string, vector<string>>& methodCodeMap,
518 const unordered_set<string>& allMethods,
519 const string& returnValue,
520 const string& injectCode,
528 static const string createSourceCode(
const MinitScript::SyntaxTreeNode& syntaxTreeNode);
541 const string& condition,
542 const vector<MinitScript::Script::Argument>& functionArguments,
544 const MinitScript::SyntaxTreeNode& conditionSyntaxTree,
545 const vector<MinitScript::SyntaxTreeNode>& syntaxTree
const vector< Script > & getScripts()
static bool transpileStatement(MinitScript *minitScript, string &generatedCode, const MinitScript::SyntaxTreeNode &syntaxTree, const MinitScript::Statement &statement, int scriptConditionIdx, int scriptIdx, int &statementIdx, const unordered_map< string, vector< string >> &methodCodeMap, const unordered_set< string > &allMethods, bool &scriptStateChanged, bool &scriptStopped, vector< string > &enabledNamedConditions, int depth=0, const vector< int > &argumentIndices={}, const string &returnValue=string(), const string &injectCode=string(), int additionalIndent=0)
Transpile statement.
static void untranspile(const string &scriptFileName, const string &transpilationFileName)
Untranspile.
static const unordered_set< string > getAllClassesMethodNames(MinitScript *minitScript)
Get all classes method names.
static bool transpileCondition(MinitScript *minitScript, string &generatedCode, int scriptIdx, const unordered_map< string, vector< string >> &methodCodeMap, const unordered_set< string > &allMethods, const string &returnValue, const string &injectCode, int depth=0)
Transpile a condition.
static const string createSourceCode(MinitScript *minitScript)
Create source code for whole script.
static const string createMethodName(MinitScript *minitScript, int scriptIdx)
Create method name.
static void generateVariableAccess(MinitScript *minitScript, string &generatedCode, int scriptConditionIdx, int scriptIdx, const string &variableName, const string &indent, bool getMethodArgumentVariable, bool getVariable, bool getVariableReference, bool setVariable, bool setVariableReference, bool setConstant, const string &returnValueStatement="returnValue = ", const string &statementEnd=";\n", int getArgumentIdx=0, int setArgumentIdx=1)
Generate variable access.
static void generateEvaluateMemberAccessArrays(MinitScript *minitScript, vector< string > &generatedDeclarations, vector< string > &generatedDefinitions)
Generate evaluate member access arrays.
static const string createLocalVariableName(const string &variableStatement)
Create local variable name.
static const string getScriptTypeEnumIdentifier(MinitScript::Script::Type type)
Get script type enum identifier.
static void transpile(MinitScript *minitScript, const string &transpilationFileName, const vector< string > &minitScriptExtensionFileNames)
Transpile MinitScript script instance.
static const string createShortMethodName(MinitScript *minitScript, int scriptIdx)
Create short method name.
static const vector< string > getAllClassesMethodNamesSorted(MinitScript *minitScript)
Get all classes method names sorted.
static const string getScriptTypeReadableName(MinitScript::Script::Type type)
Get script type name.
static void gatherMethodCode(const vector< string > &minitScriptExtensionsCode, const string &className, int registerLine, unordered_map< string, vector< string >> &methodCodeMap)
Gather method code.
static const string escapeString(const string &str)
Escape string variable.
static bool variableHasStatement(const string &variableStatement)
Check if variable has access statement.
static void generateArrayAccessMethods(MinitScript *minitScript, string &generatedDefinitions, const string &minitScriptClassName, int scriptConditionIdx, int scriptIdx, const string &methodName, const MinitScript::SyntaxTreeNode &syntaxTree, const MinitScript::Statement &statement, const unordered_map< string, vector< string >> &methodCodeMap, const unordered_set< string > &allMethods, bool condition, const vector< int > &argumentIndices={}, int depth=0)
Generate array access methods.
static const string createVariableName(const string &variableStatement)
Create variable name.
static void generateArrayMapSetVariable(MinitScript *minitScript, int scriptConditionIdx, int scriptIdx, const MinitScript::Variable &variable, const unordered_map< string, vector< string >> &methodCodeMap, const unordered_set< string > &allMethods, const string &methodName, bool condition, const string &minitScriptClassName, string &generatedDefinitions, int depth=0, int initializerDepth=0, const string &postStatement=string())
Generate array/map/set variable.
static const unordered_map< string, vector< string > > getClassesMethodNames(MinitScript *minitScript)
Get method names per classes.
static void generateArrayMapSetInitializer(MinitScript *minitScript, string &generatedDefinitions, int scriptConditionIdx, int scriptIdx, const string &minitScriptClassName, const string &methodName, const MinitScript::SyntaxTreeNode &syntaxTree, const MinitScript::Statement &statement, const unordered_map< string, vector< string >> &methodCodeMap, const unordered_set< string > &allMethods, bool condition, const vector< int > &argumentIndices={}, int depth=0)
Generate array/map/set variable.
static const string createGlobalVariableName(const string &variableStatement)
Create global variable name.
static void determineVariables(MinitScript *minitScript, unordered_set< string > &globalVariables, vector< unordered_set< string >> &localVariables)
Determine variables.