From f39a3d3ca2be420cc2b8d2df03431eec5e13bcbd Mon Sep 17 00:00:00 2001 From: Lukasz Baldyga Date: Thu, 3 Dec 2020 13:36:32 +0000 Subject: [PATCH] Correctly implemented methods --- .../Advanced Software Engineering.csproj | 3 + .../Advanced Software Engineering/Drawer.cs | 12 ++- .../Verbs/Flow/DeclareMethod.cs | 30 +++++++ .../Verbs/Flow/IVerbChunk.cs | 15 ++++ .../Verbs/Flow/IfChunk.cs | 2 +- .../Verbs/Flow/IncreaseStack.cs | 26 ++++++ .../Verbs/Flow/MethodChunk.cs | 30 ++++++- .../Verbs/Flow/VerbChunk.cs | 2 +- .../Verbs/VerbFactory.cs | 83 ++++++++++++++++++- 9 files changed, 187 insertions(+), 16 deletions(-) create mode 100644 Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs create mode 100644 Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IVerbChunk.cs create 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 128acbf..8fe2f6e 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj +++ b/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj @@ -92,7 +92,10 @@ + + + diff --git a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs index 4451e13..5aa219c 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs @@ -14,8 +14,9 @@ namespace Advanced_Software_Engineering { public class Drawer { private ValueStorage valueStorage = new ValueStorage(); - private ValueStorage verbFactoryVariables = new ValueStorage(); - public List verbChunks = new List(); + public List verbChunks = new List(); + public bool verbChunkGeneratingMethod = false; + public Dictionary Methods = new Dictionary(); /// /// The starting color of the pen / brush @@ -71,7 +72,8 @@ namespace Advanced_Software_Engineering { brush = new SolidBrush(defaultColor); fill = false; valueStorage.Reset(); - verbChunks = new List(); + verbChunks = new List(); + Methods = new Dictionary(); } /// @@ -201,9 +203,5 @@ namespace Advanced_Software_Engineering { return valueStorage; } - public ValueStorage GetVerbFactoryVariables() { - return verbFactoryVariables; - } - } } \ No newline at end of file diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs new file mode 100644 index 0000000..9b934fd --- /dev/null +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/DeclareMethod.cs @@ -0,0 +1,30 @@ +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 { + class DeclareMethod : IVerb, IVerbChunk { + + MethodChunk methodChunk; + + + public DeclareMethod(MethodChunk methodChunk) { + this.methodChunk = methodChunk; + } + + public void AddVerb(IVerb verb) { + methodChunk.AddVerb(verb); + } + + public void ExecuteVerb() { + //Declaration of method happens at parse time + } + + public string GetDescription() { + return "Declares a method"; + } + } +} diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IVerbChunk.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IVerbChunk.cs new file mode 100644 index 0000000..5991325 --- /dev/null +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IVerbChunk.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Advanced_Software_Engineering.Verbs.Flow { + public interface IVerbChunk : IVerb { + void AddVerb(IVerb verb); + + void ExecuteVerb(); + + string GetDescription(); + } +} diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs index 5ab0cc5..b616872 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; namespace Advanced_Software_Engineering.Verbs.Flow { - public class IfChunk : VerbChunk, IVerb { + public class IfChunk : VerbChunk, IVerbChunk, IVerb { IValue conditional; ValueStorage valueStorage; diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs new file mode 100644 index 0000000..c8c9272 --- /dev/null +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IncreaseStack.cs @@ -0,0 +1,26 @@ +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 ea93969..db1337f 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/MethodChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/MethodChunk.cs @@ -1,26 +1,48 @@ using Advanced_Software_Engineering.Verbs.Value; using Advanced_Software_Engineering.Verbs.Value.ValueTypes; +using System.Collections.Generic; using System.Drawing; namespace Advanced_Software_Engineering.Verbs.Flow { public class MethodChunk : VerbChunk, IVerb, IValue { ValueStorage valueStorage; + DeclareVariable[] variables; bool init = false; + IValue result; - public MethodChunk(ValueStorage valueStorage) : base() { + public MethodChunk(ValueStorage valueStorage, DeclareVariable[] variables) : base() { this.valueStorage = valueStorage; + this.variables = variables; + } + + public List GetVariableNames() { + List VariableNames = new List(); + foreach (DeclareVariable variable in variables) VariableNames.Add(variable.GetName()); + return VariableNames; + } + + public DeclareVariable[] GetVariables() { + return variables; } public new void ExecuteVerb() { - valueStorage.IncreaseStack(); + init = false; + result = null; + // The stack increased artificially + //valueStorage.IncreaseStack(); + base.ExecuteVerb(); + if (valueStorage.CheckVariableExists("ret")) { + result = valueStorage.GetVariable("ret"); + init = true; + } valueStorage.DecreaseStack(); - init = true; + } public IValue GetResult() { - return valueStorage.GetVariable("res"); + return result; } public IValue Clone() { 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 a1c1200..7f32e29 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/VerbChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/VerbChunk.cs @@ -2,7 +2,7 @@ namespace Advanced_Software_Engineering.Verbs.Flow { - public class VerbChunk : IVerb { + public class VerbChunk : IVerbChunk, IVerb { private readonly List verbs; public VerbChunk(List verbs) { diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs index 6021d44..88d1e30 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs @@ -27,11 +27,11 @@ namespace Advanced_Software_Engineering { ValueStorage rootValueStorage = drawer.GetValueStorage(); - List verbChunks = drawer.verbChunks; + List verbChunks = drawer.verbChunks; if (verbChunks.Count == 0) verbChunks.Add(null); int chunkDepth = verbChunks.Count - 1; - VerbChunk currentChunk = verbChunks[chunkDepth]; + IVerbChunk currentChunk = verbChunks[chunkDepth]; CommandAndParameterParserResult result = HelperFunctions.CommandAndParameterParser(fullCommand); @@ -96,6 +96,36 @@ namespace Advanced_Software_Engineering { parsed = true; } else throw new Exception(command + " has an incorrect number of parameters"); break; + + case "def": + if (drawer.verbChunkGeneratingMethod) throw new Exception("Cannot declare a method while declaring method"); + else if (chunkDepth != 0) throw new Exception("Cannot declare a method above root chunk"); //TODO, explain better + else if (commandParameters.Length >= 1) { + rootValueStorage.IncreaseStack(); + //All parameters + DeclareVariable[] methodParameters = new DeclareVariable[] { }; + + //if assignments exist, make them + if(commandParameters.Length > 1) { + List methodParameterList = new List(); + for (int index = 1; index < commandParameters.Length; index++) { + methodParameterList.Add(new DeclareVariable(rootValueStorage, commandParameters[index])); + } + methodParameters = methodParameterList.ToArray(); + } + string methodName = commandParameters[0]; + + MethodChunk methodChunk = new MethodChunk(rootValueStorage, methodParameters); + DeclareMethod declareMethod = new DeclareMethod(methodChunk); + + drawer.Methods.Add(methodName, methodChunk); + verbChunks.Add(declareMethod); + chunkDepth = verbChunks.Count - 1; + currentChunk = verbChunks[chunkDepth]; + parsed = true; + tmpVerb = new NoOp(); + } else throw new Exception(command + " has an incorrect number of parameters"); + break; } if (!parsed) { @@ -103,10 +133,57 @@ namespace Advanced_Software_Engineering { if (!(commandParameters == null)) foreach (string parameter in commandParameters) { parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter)); } + int parameterLength = parameters.Count; + //Check if method + if(drawer.Methods.ContainsKey(command)) { + MethodChunk methodChunk = drawer.Methods[command]; + string[] methodVariableNames = methodChunk.GetVariableNames().ToArray(); + + //Handle errors + if (methodVariableNames.Length != parameterLength) throw new Exception("Method " + command + "Has an incorrect number of parameters"); + + + /* So something like this: + * def abc d + * circle d + * + * abc 5 + * + * would have to be translated into something like this + * @increase stack + * var d = 5 (of course in a higher stack) + * + * @run abc (abc doesn't increase it's own stack) + * + */ + + 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 + for (int variableIndex = 0; variableIndex < methodVariableNames.Length; variableIndex++) { + UpdateVariable variableDeclaration = new UpdateVariable(rootValueStorage, methodVariableNames[variableIndex], parameters[variableIndex]); + localChunk.AddVerb(variableDeclaration); + } + + // localChunk.AddVerb(methodChunk); + + //Add chunk to chunk stack + localChunk.AddVerb(methodChunk); + //verbChunks.Add(localChunk); + + //chunkDepth = verbChunks.Count - 1; + //currentChunk = verbChunks[chunkDepth]; + tmpVerb = localChunk; + } + //process drawing commands and extras - switch (command) { + else switch (command) { //Drawing commands case "move": case "moveto":