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