From 229ce3ca5637ce784ff5f01a5c03bf623967455d Mon Sep 17 00:00:00 2001 From: Lukasz Baldyga Date: Thu, 3 Dec 2020 20:13:20 +0000 Subject: [PATCH] recursion ***somewhat*** works --- .../Advanced Software Engineering.csproj | 1 - .../Verbs/Flow/DeclareMethod.cs | 10 ++++--- .../Verbs/Flow/IncreaseStack.cs | 26 ------------------- .../Verbs/Flow/MethodChunk.cs | 25 ++++++++++++++++-- .../Verbs/Flow/VerbChunk.cs | 4 +++ .../Verbs/Value/DeclareVariable.cs | 3 ++- .../Verbs/Value/ValueStorage.cs | 2 +- .../Verbs/Value/ValueTypes/ExpressionValue.cs | 5 +++- .../Verbs/Value/ValueTypes/VariableValue.cs | 2 +- .../Verbs/VerbFactory.cs | 24 +++++------------ 10 files changed, 48 insertions(+), 54 deletions(-) delete mode 100644 Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs diff --git a/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj b/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj index 8fe2f6e..79ad8b9 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj +++ b/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj @@ -94,7 +94,6 @@ - diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs index 9b934fd..f70c6c7 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs @@ -7,15 +7,17 @@ using System.Threading.Tasks; namespace Advanced_Software_Engineering.Verbs.Flow { class DeclareMethod : IVerb, IVerbChunk { - - MethodChunk methodChunk; + string methodName; + Drawer drawer; - public DeclareMethod(MethodChunk methodChunk) { - this.methodChunk = methodChunk; + public DeclareMethod(Drawer drawer, string methodName) { + this.drawer = drawer; + this.methodName = methodName; } public void AddVerb(IVerb verb) { + MethodChunk methodChunk = drawer.Methods[methodName]; methodChunk.AddVerb(verb); } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs deleted file mode 100644 index c8c9272..0000000 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Advanced_Software_Engineering.Verbs.Value; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Advanced_Software_Engineering.Verbs.Flow { - public class IncreaseStack : IVerb { - - ValueStorage valueStorage; - - public IncreaseStack(ValueStorage valueStorage) { - valueStorage.IncreaseStack(); - this.valueStorage = valueStorage; - } - - public void ExecuteVerb() { - valueStorage.IncreaseStack(); - } - - public string GetDescription() { - return "Increase the stack"; - } - } -} diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/MethodChunk.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/MethodChunk.cs index db1337f..2dfacdd 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/MethodChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/MethodChunk.cs @@ -8,6 +8,7 @@ namespace Advanced_Software_Engineering.Verbs.Flow { ValueStorage valueStorage; DeclareVariable[] variables; + UpdateVariable[] updateVariables; bool init = false; IValue result; @@ -26,12 +27,32 @@ namespace Advanced_Software_Engineering.Verbs.Flow { return variables; } + public void SetVariableValues(UpdateVariable[] updateVariables) { + this.updateVariables = updateVariables; + } + + public MethodChunk DuplicateForExecution() { + MethodChunk method = new MethodChunk(valueStorage, variables); + method.SetVariableValues(updateVariables); + + foreach (IVerb verb in base.GetVerbs()) method.AddVerb(verb); + + return method; + } + public new void ExecuteVerb() { init = false; result = null; - // The stack increased artificially - //valueStorage.IncreaseStack(); + valueStorage.IncreaseStack(); + + //Declare everything + foreach (DeclareVariable variable in variables) variable.ExecuteVerb(); + + //Set the values of everything + foreach (UpdateVariable variable in updateVariables) variable.ExecuteVerb(); + + //Run code base.ExecuteVerb(); if (valueStorage.CheckVariableExists("ret")) { result = valueStorage.GetVariable("ret"); diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/VerbChunk.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/VerbChunk.cs index 7f32e29..b4a0a91 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/VerbChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/VerbChunk.cs @@ -21,6 +21,10 @@ namespace Advanced_Software_Engineering.Verbs.Flow { foreach (IVerb verb in verbs) verb.ExecuteVerb(); } + public IVerb[] GetVerbs() { + return verbs.ToArray(); + } + public string GetDescription() { string s = "VerbChunk Start"; foreach (IVerb verb in verbs) s += "\n" + verb.GetDescription(); diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs index ba8f5ad..b7569b3 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs @@ -109,7 +109,8 @@ namespace Advanced_Software_Engineering.Verbs.Value { } public void ExecuteVerb() { - storage.SetVariable(name, value); + if (value != null) storage.SetVariable(name, value.Clone()); + else storage.SetVariable(name, value); } public string GetDescription() { diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs index 609ec12..1abf4c4 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs @@ -62,7 +62,7 @@ namespace Advanced_Software_Engineering.Verbs.Value { public IValue GetVariable(string name) { for (int stack = currentStack; stack >= 0; stack--) { - if (CheckVariableExists(name, stack)) return GetVariable(name, stack); + if (CheckVariableExists(name, stack) && GetVariable(name, stack) != null) return GetVariable(name, stack); } throw new Exception("Cannot find variable " + name); } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/ExpressionValue.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/ExpressionValue.cs index ed4ce66..d2fcd87 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/ExpressionValue.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/ExpressionValue.cs @@ -57,7 +57,10 @@ namespace Advanced_Software_Engineering.Verbs.Value { private IValue Evaluate() { if (evaluated) return evaluatedValue; - string outputType = variable1.Clone().GetOriginalType(); + IValue variable1 = this.variable1.Clone(); + IValue variable2 = this.variable2.Clone(); + + string outputType = variable1.GetOriginalType(); switch (outputType) { case "bool": diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs index 19b08c7..512b3f4 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs @@ -46,7 +46,7 @@ namespace Advanced_Software_Engineering.Verbs.Value.ValueTypes { } public IValue Clone() { - return new VariableValue(storage, variableName); + return get().Clone(); } } } \ No newline at end of file diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs index 782e017..2157b75 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs @@ -113,10 +113,12 @@ namespace Advanced_Software_Engineering { } methodParameters = methodParameterList.ToArray(); } + + //Get method name string methodName = commandParameters[0]; MethodChunk methodChunk = new MethodChunk(rootValueStorage, methodParameters); - DeclareMethod declareMethod = new DeclareMethod(methodChunk); + DeclareMethod declareMethod = new DeclareMethod(drawer, methodName); drawer.Methods.Add(methodName, methodChunk); verbChunks.Add(declareMethod); @@ -159,27 +161,15 @@ namespace Advanced_Software_Engineering { * */ - VerbChunk localChunk = new VerbChunk(); - localChunk.AddVerb(new IncreaseStack(rootValueStorage)); - - // Declare all of the variables first - foreach (DeclareVariable variable in methodChunk.GetVariables()) localChunk.AddVerb(variable); // Update the values of the variables + List UpdateVariableList = new List(); for (int variableIndex = 0; variableIndex < methodVariableNames.Length; variableIndex++) { - UpdateVariable variableDeclaration = new UpdateVariable(rootValueStorage, methodVariableNames[variableIndex], parameters[variableIndex]); - localChunk.AddVerb(variableDeclaration); + UpdateVariableList.Add(new UpdateVariable(rootValueStorage, methodVariableNames[variableIndex], parameters[variableIndex])); } - // localChunk.AddVerb(methodChunk); - - //Add chunk to chunk stack - localChunk.AddVerb(methodChunk); - //verbChunks.Add(localChunk); - - //chunkDepth = verbChunks.Count - 1; - //currentChunk = verbChunks[chunkDepth]; - tmpVerb = localChunk; + methodChunk.SetVariableValues(UpdateVariableList.ToArray()); + tmpVerb = methodChunk.DuplicateForExecution(); } //process drawing commands and extras