diff --git a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs index 48e1021..4451e13 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs @@ -70,7 +70,8 @@ namespace Advanced_Software_Engineering { pen = new Pen(defaultColor, defaultWidth); brush = new SolidBrush(defaultColor); fill = false; - valueStorage = new ValueStorage(); + valueStorage.Reset(); + verbChunks = new List(); } /// 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 6bb1f2e..5ab0cc5 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs @@ -5,17 +5,24 @@ namespace Advanced_Software_Engineering.Verbs.Flow { public class IfChunk : VerbChunk, IVerb { IValue conditional; + ValueStorage valueStorage; - public IfChunk(IValue conditional) : base() { + public IfChunk(ValueStorage valueStorage, IValue conditional) : base() { this.conditional = conditional; + this.valueStorage = valueStorage; + valueStorage.IncreaseStack(); } - public IfChunk(IValue conditional, IVerb oneLineVerb) : base(new List { oneLineVerb }) { + public IfChunk(ValueStorage valueStorage, IValue conditional, IVerb oneLineVerb) : base(new List { oneLineVerb }) { this.conditional = conditional; + this.valueStorage = valueStorage; + valueStorage.IncreaseStack(); } public new void ExecuteVerb() { + valueStorage.IncreaseStack(); if (conditional.ToBool()) base.ExecuteVerb(); + valueStorage.DecreaseStack(); } } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueHelper.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueHelper.cs index faaad5c..afc029c 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueHelper.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueHelper.cs @@ -129,9 +129,11 @@ namespace Advanced_Software_Engineering.Verbs.Value { value = value.Replace(op, " " + op + " "); } + bool removedFirstChar = false; value = HelperFunctions.Strip(value); if (value[0] == "="[0]) { value = value.Substring(1); + removedFirstChar = true; } // now will definitly look like this: // 10 + i or i @@ -165,7 +167,7 @@ namespace Advanced_Software_Engineering.Verbs.Value { try { // assignmentStrings will look something like this: // ["i"] or ["10", "+", "i"] - if (assignmentStrings.Length == 1) return ValueFactory.CreateValue(storage, assignmentStrings[0]); + if (assignmentStrings.Length == 1 && removedFirstChar) return ValueFactory.CreateValue(storage, assignmentStrings[0]); else if (assignmentStrings.Length == 3) { // assignmentStrings looks like this => ["10", "+", "i"] IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[0]); diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs index bdf1b93..ef3a20b 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs @@ -5,28 +5,47 @@ namespace Advanced_Software_Engineering.Verbs.Value { public class ValueStorage { protected int currentStack; - protected Dictionary> Variables = new Dictionary>(); + protected Dictionary> Variables = new Dictionary>(); + protected List VariableList = new List(); public ValueStorage() { Reset(); } public void Reset() { - Variables.Clear(); + //for every ivalue + Variables = new Dictionary>(); + //for (int index = 0; index < VariableList.Count; index++) VariableList[index] = null; SetStack(0); } - public void Reset(int stack) { - Variables[stack].Clear(); - } - public void SetStack(int stack) { - currentStack = stack; + currentStack = stack < 0 ? 0 : stack; if (!Variables.ContainsKey(stack)) Variables.Add(currentStack, new Dictionary()); } + public void IncreaseStack() { + currentStack++; + SetStack(currentStack); + } + + public void DecreaseStack() { + currentStack--; + SetStack(currentStack); + } + public void SetVariable(string name, int stack, IValue value) { - Variables[stack][name] = value; + if (stack == 0) Variables[stack][name] = value; + else { + if (CheckVariableExists(name, stack)) Variables[stack][name] = value; + else if (CheckVariableExists(name, 0)) Variables[0][name] = value; + else// if(value == null) { + Variables[stack][name] = value; + //VariableList.Add(Variables[stack][name]); + //} else { + // throw new Exception("Tried setting a variable that was not declared"); + //} + } } public void SetVariable(string name, IValue value) { diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs index 8ebafdf..6021d44 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs @@ -26,6 +26,7 @@ namespace Advanced_Software_Engineering { public static IVerb MakeVerb(Drawer drawer, string fullCommand) { ValueStorage rootValueStorage = drawer.GetValueStorage(); + List verbChunks = drawer.verbChunks; if (verbChunks.Count == 0) verbChunks.Add(null); @@ -35,6 +36,7 @@ namespace Advanced_Software_Engineering { CommandAndParameterParserResult result = HelperFunctions.CommandAndParameterParser(fullCommand); string command = result.getCommand(); + if (command == null) return new NoOp(); string[] commandParameters = result.getParameters(); if (command == null) throw new Exception("There is no command to process"); @@ -81,16 +83,16 @@ namespace Advanced_Software_Engineering { switch (command) { case "if": if (commandParameters.Length == 1) { - verbChunks.Add(new IfChunk(ValueFactory.CreateValue(rootValueStorage, commandParameters[0]))); + verbChunks.Add(new IfChunk(rootValueStorage, ValueFactory.CreateValue(rootValueStorage, commandParameters[0]))); chunkDepth = verbChunks.Count - 1; currentChunk = verbChunks[chunkDepth]; parsed = true; tmpVerb = new NoOp(); - } else if (commandParameters.Length >= 2) { + } else if (commandParameters.Length >= 2) { //single line if string commandAfterIf = fullCommand.Substring(fullCommand.IndexOf(",") + 1); // find the first , IValue conditional = ValueFactory.CreateValue(rootValueStorage, commandParameters[0]); //make the conditional IVerb AfterIf = MakeVerb(drawer, commandAfterIf); //make the following command - tmpVerb = new IfChunk(conditional, AfterIf); //Create the chunk + tmpVerb = new IfChunk(rootValueStorage, conditional, AfterIf); //Create the chunk parsed = true; } else throw new Exception(command + " has an incorrect number of parameters"); break; @@ -252,6 +254,7 @@ namespace Advanced_Software_Engineering { chunkDepth = verbChunks.Count - 1; tmpVerb = currentChunk; currentChunk = verbChunks[chunkDepth]; + rootValueStorage.DecreaseStack(); } else throw new Exception(command + " doesn't take parameters"); break;