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 f97764f..a1ac162 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj +++ b/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj @@ -76,6 +76,7 @@ True Resources.resx + diff --git a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs index a91bdea..48e1021 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs @@ -1,4 +1,5 @@ -using Advanced_Software_Engineering.Verbs.Value; +using Advanced_Software_Engineering.Verbs.Flow; +using Advanced_Software_Engineering.Verbs.Value; using System; using System.Collections.Generic; using System.Drawing; @@ -13,6 +14,8 @@ namespace Advanced_Software_Engineering { public class Drawer { private ValueStorage valueStorage = new ValueStorage(); + private ValueStorage verbFactoryVariables = new ValueStorage(); + public List verbChunks = new List(); /// /// The starting color of the pen / brush @@ -197,5 +200,9 @@ 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/IfChunk.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs index 615d9c7..a9aa7a5 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs @@ -9,7 +9,7 @@ namespace Advanced_Software_Engineering.Verbs.Flow { this.conditional = conditional; } - public void ExecuteVerb() { + public new void ExecuteVerb() { if (conditional.ToBool()) base.ExecuteVerb(); } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs index ebf762c..ed5eaee 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs @@ -1,4 +1,6 @@ using Advanced_Software_Engineering.Verbs.DrawingVerbs; +using Advanced_Software_Engineering.Verbs.DrawingVerbs.Actions; +using Advanced_Software_Engineering.Verbs.Flow; using Advanced_Software_Engineering.Verbs.Value; using Advanced_Software_Engineering.Verbs.Value.ValueObjects; using Advanced_Software_Engineering.Verbs.Value.ValueTypes; @@ -22,20 +24,29 @@ namespace Advanced_Software_Engineering { /// The command as a string /// A IVerb that maches the command public static IVerb MakeVerb(Drawer drawer, string fullCommand) { - int stackLevel = 0; - ValueStorage rootValueStorage = drawer.GetValueStorage(); + List verbChunks = drawer.verbChunks; + if (verbChunks.Count == 0) verbChunks.Add(null); + + int chunkDepth = verbChunks.Count - 1; + VerbChunk currentChunk = verbChunks[chunkDepth]; + CommandAndParameterParserResult result = HelperFunctions.CommandAndParameterParser(fullCommand); string command = result.getCommand(); string[] commandParameters = result.getParameters(); if (command == null) throw new Exception("There is no command to process"); + IVerb tmpVerb; + //check for names in directory if (rootValueStorage.CheckVariableExists(command)) { if (commandParameters.Length == 1) { - return new UpdateVariable(rootValueStorage, command, commandParameters[0]); + tmpVerb = new UpdateVariable(rootValueStorage, command, commandParameters[0]); + if (chunkDepth == 0) return tmpVerb; + currentChunk.AddVerb(tmpVerb); + return new NoOp(); } else throw new Exception(command + "needs something to be assigned to it"); } @@ -44,7 +55,10 @@ namespace Advanced_Software_Engineering { switch (command) { case "var": if (commandParameters.Length == 1) { - return new DeclareVariable(rootValueStorage, commandParameters[0]); + tmpVerb = new DeclareVariable(rootValueStorage, commandParameters[0]); + if (chunkDepth == 0) return tmpVerb; + currentChunk.AddVerb(tmpVerb); + return new NoOp(); } else throw new Exception(command + "s need to be initialised"); default: @@ -52,7 +66,10 @@ namespace Advanced_Software_Engineering { if (rootValueStorage.CheckVariableExists(command)) { string[] assignmentCommands = command.Split("="[0]); if (assignmentCommands.Length > 2) throw new Exception("Cannot have two assignments"); - return new UpdateVariable(rootValueStorage, assignmentCommands[0], ValueFactory.CreateValue(rootValueStorage, assignmentCommands[1])); + tmpVerb = new UpdateVariable(rootValueStorage, assignmentCommands[0], ValueFactory.CreateValue(rootValueStorage, assignmentCommands[1])); + if (chunkDepth == 0) return tmpVerb; + currentChunk.AddVerb(tmpVerb); + return new NoOp(); } break; } @@ -63,6 +80,8 @@ namespace Advanced_Software_Engineering { } int parameterLength = parameters.Count; + + //process drawing commands and extras switch (command) { //Drawing commands @@ -70,50 +89,55 @@ namespace Advanced_Software_Engineering { case "moveto": //Check parameters if (parameterLength == 2) { - return new MoveTo(drawer, new PointValue(parameters[0], parameters[1])); + tmpVerb = new MoveTo(drawer, new PointValue(parameters[0], parameters[1])); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "drawto": case "line": case "lineto": //Check parameters if (parameterLength == 2) { - return new DrawTo(drawer, new PointValue(parameters[0], parameters[1])); + tmpVerb = new DrawTo(drawer, new PointValue(parameters[0], parameters[1])); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "regularpolygon": case "rp": //Check parameters if (parameterLength == 2) { - return new RegularPolygon(drawer, parameters[0], parameters[1], new IntValue(0), new BoolValue(true)); + tmpVerb = new RegularPolygon(drawer, parameters[0], parameters[1], new IntValue(0), new BoolValue(true)); } else if (parameterLength == 3) { - return new RegularPolygon(drawer, parameters[0], parameters[1], parameters[2], new BoolValue(true)); + tmpVerb = new RegularPolygon(drawer, parameters[0], parameters[1], parameters[2], new BoolValue(true)); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "square": //Check parameters if (parameterLength == 1) { - return new + tmpVerb = new Square(drawer, parameters[0]); } else if (parameterLength == 2) { - return new Square(drawer, parameters[0], parameters[1]); + tmpVerb = new Square(drawer, parameters[0], parameters[1]); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "quadrilateral": //Check parameters if (parameterLength == 8) { - return new Quadrilateral(drawer, + tmpVerb = new Quadrilateral(drawer, new PointValue(parameters[0], parameters[1]), new PointValue(parameters[2], parameters[3]), new PointValue(parameters[4], parameters[5]), new PointValue(parameters[6], parameters[7]) ); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "rectangle": //Check parameters if (parameterLength == 2) { - return new Rectangle(drawer, parameters[0], parameters[1]); + tmpVerb = new Rectangle(drawer, parameters[0], parameters[1]); } else if (parameterLength == 8) { return new Quadrilateral(drawer, new PointValue(parameters[0], parameters[1]), @@ -122,77 +146,90 @@ namespace Advanced_Software_Engineering { new PointValue(parameters[6], parameters[7]) ); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "circle": //Check parameters if (parameterLength == 1) { - return new Circle(drawer, parameters[0]); + tmpVerb = new Circle(drawer, parameters[0]); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "triangle": //Check parameters if (parameterLength == 1) { - return new + tmpVerb = new Triangle(drawer, parameters[0]); } else if (parameterLength == 2) { - return new + tmpVerb = new Triangle(drawer, parameters[0], parameters[1]); } else if (parameterLength == 6) { - return new Triangle(drawer, + tmpVerb = new Triangle(drawer, new PointValue(parameters[0], parameters[1]), new PointValue(parameters[2], parameters[3]), new PointValue(parameters[4], parameters[5]) ); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "dot": if (parameterLength == 0) { - return new Dot(drawer); + tmpVerb = new Dot(drawer); } else throw new Exception(command + " doesn't take parameters"); + break; case "clear": if (parameterLength == 0) { - return new Clear(drawer); + tmpVerb = new Clear(drawer); } else throw new Exception(command + " doesn't take parameters"); + break; case "reset": case "resetpen": if (parameterLength == 0) { - return new ResetPen(drawer); + tmpVerb = new ResetPen(drawer); } else throw new Exception(command + " doesn't take parameters"); + break; case "fillon": if (parameterLength == 0) { - return new Fill(drawer, true); + tmpVerb = new Fill(drawer, true); } else throw new Exception(command + " doesn't take parameters"); + break; case "filloff": if (parameterLength == 0) { - return new Fill(drawer, false); + tmpVerb = new Fill(drawer, false); } else throw new Exception(command + " doesn't take parameters"); + break; case "pen": if (parameterLength == 1) { - return new PenColor(drawer, parameters[0]); + tmpVerb = new PenColor(drawer, parameters[0]); } else if (parameterLength == 3) { - return new PenColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2])); + tmpVerb = new PenColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2])); } else if (parameterLength == 4) { - return new PenColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], parameters[3])); + tmpVerb = new PenColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], parameters[3])); } else throw new Exception(command + " has an incorrect number of parameters"); + break; case "fill": if (parameterLength == 1) { - return new FillColor(drawer, parameters[0]); + tmpVerb = new FillColor(drawer, parameters[0]); } else if (parameterLength == 3) { - return new FillColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], new IntValue(255))); + tmpVerb = new FillColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], new IntValue(255))); } else if (parameterLength == 4) { - return new FillColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], parameters[3])); + tmpVerb = new FillColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], parameters[3])); } else throw new Exception(command + " has an incorrect number of parameters"); + break; default: - throw new Exception("Unknown command or cannot parse"); } + + if (chunkDepth == 0) return tmpVerb; + currentChunk.AddVerb(tmpVerb); + return new NoOp(); } } } \ No newline at end of file