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 79ad8b9..dd9c7cd 100644
--- a/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj
+++ b/Advanced Software Engineering/Advanced Software Engineering/Advanced Software Engineering.csproj
@@ -96,6 +96,7 @@
+
diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/WhileChunk.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/WhileChunk.cs
new file mode 100644
index 0000000..2835c01
--- /dev/null
+++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/WhileChunk.cs
@@ -0,0 +1,23 @@
+using Advanced_Software_Engineering.Verbs.Value;
+using System.Collections.Generic;
+
+namespace Advanced_Software_Engineering.Verbs.Flow {
+ public class WhileChunk : VerbChunk, IVerbChunk, IVerb {
+
+ IValue conditional;
+ ValueStorage valueStorage;
+
+ public WhileChunk(ValueStorage valueStorage, IValue conditional) : base() {
+ this.conditional = conditional;
+ this.valueStorage = valueStorage;
+ valueStorage.IncreaseStack();
+ }
+
+ public new void ExecuteVerb() {
+ valueStorage.IncreaseStack();
+ while (conditional.ToBool()) base.ExecuteVerb();
+ valueStorage.DecreaseStack();
+ }
+
+ }
+}
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 d2fcd87..bbf2b12 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
@@ -55,8 +55,6 @@ namespace Advanced_Software_Engineering.Verbs.Value {
}
private IValue Evaluate() {
- if (evaluated) return evaluatedValue;
-
IValue variable1 = this.variable1.Clone();
IValue variable2 = this.variable2.Clone();
@@ -92,7 +90,7 @@ namespace Advanced_Software_Engineering.Verbs.Value {
case "color":
throw new Exception("Colors are immutable");
}
- evaluated = true;
+
return evaluatedValue;
}
diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs
index 2157b75..9fd9c38 100644
--- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs
+++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs
@@ -97,6 +97,16 @@ namespace Advanced_Software_Engineering {
} else throw new Exception(command + " has an incorrect number of parameters");
break;
+ case "while":
+ if (commandParameters.Length == 1) {
+ verbChunks.Add(new WhileChunk(rootValueStorage, ValueFactory.CreateValue(rootValueStorage, commandParameters[0])));
+ chunkDepth = verbChunks.Count - 1;
+ currentChunk = verbChunks[chunkDepth];
+ parsed = true;
+ tmpVerb = new NoOp();
+ } 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