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