diff --git a/Slang/Main.cpp b/Slang/Main.cpp index 3706801..6cd8856 100644 --- a/Slang/Main.cpp +++ b/Slang/Main.cpp @@ -39,6 +39,8 @@ public: } }; +int ExecuteFunction(string functionName, vector inputVarVals); + bool isNumber(const string& str) { for (char const& c : str) { @@ -81,6 +83,44 @@ int count(string str, char ch) { return cnt; } +int countNoOverlap(string str, char ch1, char ch2) { + int cnt = 0; + + bool waitingForClose = false; + + for (int i = 0; i < (int)str.size(); i++) + { + if (str[i] == ch1) + waitingForClose = true; + else if (str[i] == ch2 && waitingForClose == true) + { + cnt++; + waitingForClose = false; + } + } + + return cnt; +} + +int indexInStr(string str, char ch) { + + for (int i = 0; i < (int)str.size(); i++) + if (str[i] == ch) + return i; + + return -1; +} + +int charIndexInVec(vector str, char ch) { + + for (int i = 0; i < (int)str.size(); i++) + for (int w = 0; w < (int)str[i].size(); w++) + if (str[i][w] == ch) + return i; + + return -1; +} + int countInVector(vector str, string ch) { int cnt = 0; @@ -117,6 +157,43 @@ vector removeTabs(vector str, int amnt) { return newStr; } +vector rangeInVec(vector str, int min, int max) { + if (max == -1) + max == (int)str.size(); + + vector newStr; + + for (int i = min; i < (int)str.size() && i < max; i++) + newStr.push_back(str[i]); + + return newStr; +} + +string rangeInStr(string str, int min, int max) { + if (max == -1) + max == (int)str.size(); + + string newStr; + + for (int i = min; i < (int)str.size() && i < max; i++) + newStr += str[i]; + + return newStr; +} + +string unWrapVec(vector vec) { + string newStr; + + for (int i = 0; i < (int)vec.size(); i++) + { + newStr += vec[i]; + if (i != (int)vec.size() - 1) + newStr += " "; + } + + return newStr; +} + string replace(string str, string strToReplace, string replaceWith) { string newStr; string savedLetters;; @@ -163,7 +240,7 @@ string AddItem(string variableContent, string addItem) } } -string GetRealValue(string var, vector variables, vector variableVals) +string GetRealValue(string var, vector& variables, vector& variableVals) { if (!isNumber(var) && count(var, '\"') == 0) { @@ -193,7 +270,7 @@ string GetRealValue(string var, vector variables, vector variabl return var; } -bool BooleanLogic(string valA, string determinant, string valB, vector variables, vector variableVals) +bool BooleanLogic(string valA, string determinant, string valB, vector& variables, vector& variableVals) { string valARealValue = GetRealValue(valA, variables, variableVals); string valBRealValue = GetRealValue(valB, variables, variableVals); @@ -219,13 +296,55 @@ bool BooleanLogic(string valA, string determinant, string valB, vector v return false; } -int ProcessLine(vector> words, int l, vector variables, vector variableValues) +string PEMDAS(string equ) +{ + if (split(equ, ',').size() == 1) + return equ; + + int parenthesisSetsCount = countNoOverlap(equ, '(', ')'); + + vector equationWords = split(equ, ' '); + for (int s = 0; s < parenthesisSetsCount; s++) + { + int startOfNextParenthesis = 0; + int numofParenthesis = 0; + vector insideParenthesis; + for (int p = startOfNextParenthesis; p < (int)equationWords.size(); p++) + { + numofParenthesis += count(equationWords[p], '(') - count(equationWords[p], ')'); + if (numofParenthesis == 0) + { + startOfNextParenthesis = indexInStr(equationWords[charIndexInVec(equationWords, '(')], '('); + break; + } + insideParenthesis.push_back(""); + for (int w = 0; w < (int)equationWords[p].size(); w++) + { + insideParenthesis[(int)insideParenthesis.size() - 1] += equationWords[p][w] + " "; + } + } + + equ = replace(equ, "(" + unWrapVec(insideParenthesis) + ")", PEMDAS(unWrapVec(insideParenthesis))); + } +} + +int ProcessLine(vector> words, int l, vector& variables, vector& variableValues) { if (words[l][0] == "print") { cout << GetRealValue(words[l][1], variables, variableValues) << endl; return 0; } + // Iterate through all functions + for (int t = 0; t < (int)functions.size(); t++) + { + if (words[l][0] == split(functions[t], ' ')[0]) + { + ExecuteFunction(words[l][0], rangeInVec(words[l], 1, -1)); + return 0; + } + } + // First iterate through all types to see if line // is a variable then store it with it's value for (int t = 0; t < (int)types.size(); t++) @@ -234,9 +353,9 @@ int ProcessLine(vector> words, int l, vector variables, v { //Checks if it is variable variables.push_back(words[l][1]); - variableValues.push_back((string)words[l][3]); + variableValues.push_back(GetRealValue((string)words[l][3], variables, variableValues)); //cout << words[l][1] << " is " << words[l][3] << endl << endl; - break; + return 0; } } // Second, iterate all existing local variable names @@ -247,16 +366,16 @@ int ProcessLine(vector> words, int l, vector variables, v if (words[l][1] == "=") variableValues[v] = words[l][2]; else if (words[l][1] == "+=") - variableValues[v] = AddItem(variableValues[v], words[l][2]); + variableValues[v] = AddItem(variableValues[v], GetRealValue(words[l][2], variables, variableValues)); else if (words[l][1] == "-=") - variableValues[v] = to_string(stof(variableValues[v]) - stof(words[l][2])); + variableValues[v] = to_string(stof(variableValues[v]) - stof(GetRealValue(words[l][2], variables, variableValues))); else if (words[l][1] == "*=") - variableValues[v] = to_string(stof(variableValues[v]) * stof(words[l][2])); + variableValues[v] = to_string(stof(variableValues[v]) * stof(GetRealValue(words[l][2], variables, variableValues))); else if (words[l][1] == "/=") - variableValues[v] = to_string(stof(variableValues[v]) / stof(words[l][2])); + variableValues[v] = to_string(stof(variableValues[v]) / stof(GetRealValue(words[l][2], variables, variableValues))); //cout << words[l][1] << " is " << words[l][3] << endl << endl; - break; + return 0; } } // Third, iterate all existing global variable names @@ -267,16 +386,16 @@ int ProcessLine(vector> words, int l, vector variables, v if (words[l][1] == "=") globalVariableValues[v] = words[l][2]; else if (words[l][1] == "+=") - globalVariableValues[v] = AddItem(globalVariableValues[v], words[l][2]); + globalVariableValues[v] = AddItem(globalVariableValues[v], GetRealValue(words[l][2], variables, variableValues)); else if (words[l][1] == "-=") - globalVariableValues[v] = to_string(stof(globalVariableValues[v]) - stof(words[l][2])); + globalVariableValues[v] = to_string(stof(globalVariableValues[v]) - stof(GetRealValue(words[l][2], variables, variableValues))); else if (words[l][1] == "*=") - globalVariableValues[v] = to_string(stof(globalVariableValues[v]) * stof(words[l][2])); + globalVariableValues[v] = to_string(stof(globalVariableValues[v]) * stof(GetRealValue(words[l][2], variables, variableValues))); else if (words[l][1] == "/=") - globalVariableValues[v] = to_string(stof(globalVariableValues[v]) / stof(words[l][2])); + globalVariableValues[v] = to_string(stof(globalVariableValues[v]) / stof(GetRealValue(words[l][2], variables, variableValues))); //cout << words[l][1] << " is " << words[l][3] << endl << endl; - break; + return 0; } } // Gathers while loop contents @@ -314,6 +433,7 @@ int ProcessLine(vector> words, int l, vector variables, v ProcessLine(words, l, variables, variableValues); } } + return 0; } // Gathers if statement contents if (words[l][0] == "if") @@ -350,6 +470,7 @@ int ProcessLine(vector> words, int l, vector variables, v ProcessLine(words, l, variables, variableValues); } } + return 0; } return 0; @@ -399,12 +520,10 @@ int parseSlang(string script) words.push_back(split(lines[i], ' ')); } + // First go through entire script and iterate through all types to see if line is a variable + // or function declaration, then store it with it's value for (int lineNum = 0; lineNum < (int)words.size(); lineNum++) - { - // First go through entire script and iterate through all types to see if line is a variable - // or function declaration, then store it with it's value for (int t = 0; t < (int)types.size(); t++) - { if (words[lineNum][0] == types[t]) { //Checks if it is function @@ -449,9 +568,8 @@ int parseSlang(string script) cout << words[lineNum][1] << " is " << words[lineNum][3] << endl << endl; } } - } - } + // Executes main, which is the starting function ExecuteFunction("Main", vector {"hi"}); return 0; diff --git a/Slang/Slang.vcxproj b/Slang/Slang.vcxproj index da7153a..e005a27 100644 --- a/Slang/Slang.vcxproj +++ b/Slang/Slang.vcxproj @@ -141,6 +141,7 @@ + diff --git a/Slang/Slang.vcxproj.filters b/Slang/Slang.vcxproj.filters index 78144ec..158c29a 100644 --- a/Slang/Slang.vcxproj.filters +++ b/Slang/Slang.vcxproj.filters @@ -18,6 +18,9 @@ Source Files + + Source Files + diff --git a/Slang/processLine.cpp b/Slang/processLine.cpp new file mode 100644 index 0000000..345471c --- /dev/null +++ b/Slang/processLine.cpp @@ -0,0 +1,155 @@ +//#include +//#include +//#include +//#include +//#include "Main.cpp" +// +//using namespace std; +// +//int ProcessLine(vector> words, int l, vector variables, vector variableValues) +//{ +// if (words[l][0] == "print") { +// cout << GetRealValue(words[l][1], variables, variableValues) << endl; +// return 0; +// } +// +// // Iterate through all functions +// for (int t = 0; t < (int)functions.size(); t++) +// { +// if (words[l][0] == split(functions[t], ' ')[0]) +// { +// ExecuteFunction(words[l][0], rangeInVec(words[l], 1, -1)); +// return 0; +// } +// } +// +// // First iterate through all types to see if line +// // is a variable then store it with it's value +// for (int t = 0; t < (int)types.size(); t++) +// { +// if (words[l][0] == types[t]) +// { +// //Checks if it is variable +// variables.push_back(words[l][1]); +// variableValues.push_back((string)words[l][3]); +// //cout << words[l][1] << " is " << words[l][3] << endl << endl; +// return 0; +// } +// } +// // Second, iterate all existing local variable names +// for (int v = 0; v < (int)variables.size(); v++) +// { +// if (words[l][0] == variables[v]) +// { +// if (words[l][1] == "=") +// variableValues[v] = words[l][2]; +// else if (words[l][1] == "+=") +// variableValues[v] = AddItem(variableValues[v], words[l][2]); +// else if (words[l][1] == "-=") +// variableValues[v] = to_string(stof(variableValues[v]) - stof(words[l][2])); +// else if (words[l][1] == "*=") +// variableValues[v] = to_string(stof(variableValues[v]) * stof(words[l][2])); +// else if (words[l][1] == "/=") +// variableValues[v] = to_string(stof(variableValues[v]) / stof(words[l][2])); +// +// //cout << words[l][1] << " is " << words[l][3] << endl << endl; +// return 0; +// } +// } +// // Third, iterate all existing global variable names +// for (int v = 0; v < (int)globalVariables.size(); v++) +// { +// if (words[l][0] == globalVariables[v]) +// { +// if (words[l][1] == "=") +// globalVariableValues[v] = words[l][2]; +// else if (words[l][1] == "+=") +// globalVariableValues[v] = AddItem(globalVariableValues[v], words[l][2]); +// else if (words[l][1] == "-=") +// globalVariableValues[v] = to_string(stof(globalVariableValues[v]) - stof(words[l][2])); +// else if (words[l][1] == "*=") +// globalVariableValues[v] = to_string(stof(globalVariableValues[v]) * stof(words[l][2])); +// else if (words[l][1] == "/=") +// globalVariableValues[v] = to_string(stof(globalVariableValues[v]) / stof(words[l][2])); +// +// //cout << words[l][1] << " is " << words[l][3] << endl << endl; +// return 0; +// } +// } +// // Gathers while loop contents +// if (words[l][0] == "while") +// { +// vector whileContents; +// vector whileParameters; +// +// for (int w = 1; w < (int)words[l].size(); w++) +// whileParameters.push_back(words[l][w]); +// +// int numOfBrackets = 1; +// for (int p = l + 2; p < (int)words.size(); p++) +// { +// numOfBrackets += countInVector(words[p], "{") - countInVector(words[p], "}"); +// if (numOfBrackets == 0) +// break; +// whileContents.push_back(""); +// for (int w = 0; w < (int)words[p].size(); w++) +// { +// whileContents[(int)whileContents.size() - 1] += words[p][w] + " "; +// } +// } +// whileContents = removeTabs(whileContents, 1); +// +// vector> words; +// for (int i = 0; i < (int)whileContents.size(); i++) +// words.push_back(split(whileContents[i], ' ')); +// +// while (BooleanLogic(whileParameters[0], whileParameters[1], whileParameters[2], variables, variableValues)) +// { +// //Iterate through all lines in while loop +// for (int l = 0; l < (int)whileContents.size(); l++) +// { +// ProcessLine(words, l, variables, variableValues); +// } +// } +// return 0; +// } +// // Gathers if statement contents +// if (words[l][0] == "if") +// { +// vector ifContents; +// vector ifParameters; +// +// for (int w = 1; w < (int)words[l].size(); w++) +// ifParameters.push_back(words[l][w]); +// +// int numOfBrackets = 1; +// for (int p = l + 2; p < (int)words.size(); p++) +// { +// numOfBrackets += countInVector(words[p], "{") - countInVector(words[p], "}"); +// if (numOfBrackets == 0) +// break; +// ifContents.push_back(""); +// for (int w = 0; w < (int)words[p].size(); w++) +// { +// ifContents[(int)ifContents.size() - 1] += words[p][w] + " "; +// } +// } +// ifContents = removeTabs(ifContents, 1); +// +// vector> words; +// for (int i = 0; i < (int)ifContents.size(); i++) +// words.push_back(split(ifContents[i], ' ')); +// +// if (BooleanLogic(ifParameters[0], ifParameters[1], ifParameters[2], variables, variableValues)) +// { +// //Iterate through all lines in while loop +// for (int l = 0; l < (int)ifContents.size(); l++) +// { +// ProcessLine(words, l, variables, variableValues); +// } +// } +// return 0; +// } +// +// return 0; +//} \ No newline at end of file diff --git a/Slang/script.sl b/Slang/script.sl index de070c5..304c2a4 100644 --- a/Slang/script.sl +++ b/Slang/script.sl @@ -2,39 +2,33 @@ int x = 1 void Main(input) { - string c = 8 - string d = 8 - string e = 8 - string f = 8 - string g = 8 - string h = 8 - string i = 8 - string j = 8 - c /= 2 - d /= 2 - e /= 2 - f /= 2 - g /= 2 - h /= 2 - i /= 2 - g /= 2 + int a = 8 + print input - while x < 10000 + int k = 0 + while x < 1000 { - g /= 2 - h /= 2 - i /= 2 - g /= 2 + a /= 7.2 + a += 9.12867 + int xThou = x + xThou /= 10000 + a *= xThou + x += 1 + if x > 0 { - print x + print a } } - x += 1 - print x - x -= 1 - print x + Next "seen" } -Main "hi" \ No newline at end of file +void Next() +{ + string green = "bean" + + print green +} + +Main hi \ No newline at end of file