From affc6d6e53cd6193f761c4f0ed62c98ba8d8ace2 Mon Sep 17 00:00:00 2001 From: Lukasz Baldyga Date: Mon, 30 Nov 2020 18:25:19 +0000 Subject: [PATCH] Implemented single line if statements --- .../Verbs/Flow/IfChunk.cs | 5 + .../Verbs/Value/ValueHelper.cs | 121 ++++---- .../Verbs/VerbFactory.cs | 290 ++++++++++-------- 3 files changed, 222 insertions(+), 194 deletions(-) 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 a9aa7a5..6bb1f2e 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Flow/IfChunk.cs @@ -1,4 +1,5 @@ using Advanced_Software_Engineering.Verbs.Value; +using System.Collections.Generic; namespace Advanced_Software_Engineering.Verbs.Flow { public class IfChunk : VerbChunk, IVerb { @@ -9,6 +10,10 @@ namespace Advanced_Software_Engineering.Verbs.Flow { this.conditional = conditional; } + public IfChunk(IValue conditional, IVerb oneLineVerb) : base(new List { oneLineVerb }) { + this.conditional = conditional; + } + public new void ExecuteVerb() { if (conditional.ToBool()) base.ExecuteVerb(); } 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 ac0b792..faaad5c 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueHelper.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueHelper.cs @@ -1,4 +1,5 @@ -using System; +using Advanced_Software_Engineering.Verbs.Value.ValueTypes; +using System; using System.Drawing; namespace Advanced_Software_Engineering.Verbs.Value { @@ -122,77 +123,77 @@ namespace Advanced_Software_Engineering.Verbs.Value { public static IValue ConvertToIValue(string text, ValueStorage storage = null) { text = HelperFunctions.Strip(text); + string value = text; + //seperate assignment characters from everything else TODO FIX + foreach (string op in new string[] { "=", "+", "-", "*", "/", "<", ">", "!" }) { + value = value.Replace(op, " " + op + " "); + } + + value = HelperFunctions.Strip(value); + if (value[0] == "="[0]) { + value = value.Substring(1); + } + // now will definitly look like this: + // 10 + i or i + + string[] assignmentStrings = HelperFunctions.StripStringArray(value.Split(" "[0])).ToArray(); + //No assignmnet - if (!text.Contains("=")) { - if (!text.Contains("#")) { - //Check if string is a number - if (!text.Contains(".")) { - try { - return ValueFactory.CreateValue(text, "int"); - } catch (Exception) { } - } - //Check if string is a double - else { - try { - return ValueFactory.CreateValue(text, "double"); - } catch (Exception) { } - } - - //Check if color + if (!text.Contains("#")) { + //Check if string is a number + if (!text.Contains(".")) { try { - return ValueFactory.CreateValue(text, "color"); + return ValueFactory.CreateValue(text, "int"); } catch (Exception) { } + } - //check for expression - if (storage != null) { - try { - string value = text; - //seperate assignment characters from everything else - foreach (string op in new string[] { "=", "+", "-", "*", "/" }) { - value = value.Replace(op, " " + op + " "); - } - - value = HelperFunctions.Strip(value); - if (value[0] == "="[0]) { - value = value.Substring(1); - } - // now will definitly look like this: - // 10 + i or i - - string[] assignmentStrings = HelperFunctions.StripStringArray(value.Split(" "[0])).ToArray(); - - // assignmentStrings will look something like this: - // ["i"] or ["10", "+", "i"] - if (assignmentStrings.Length == 1) return ValueFactory.CreateValue(storage, assignmentStrings[0]); - else if (assignmentStrings.Length == 3) { - // assignmentStrings looks like this => ["10", "+", "i"] - IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[0]); - string op = assignmentStrings[1]; - IValue value2 = ValueFactory.CreateValue(storage, assignmentStrings[2]); - return new ExpressionValue(value1, value2, op); - } - } catch (Exception) { } - } - } else { - //Check if color + //Check if string is a double + else { try { - return ValueFactory.CreateValue(text, "color"); + return ValueFactory.CreateValue(text, "double"); + } catch (Exception) { } + } + + //Check if color + try { + return ValueFactory.CreateValue(text, "color"); + } catch (Exception) { } + + //check for expression + if (storage != null) { + try { + // assignmentStrings will look something like this: + // ["i"] or ["10", "+", "i"] + if (assignmentStrings.Length == 1) return ValueFactory.CreateValue(storage, assignmentStrings[0]); + else if (assignmentStrings.Length == 3) { + // assignmentStrings looks like this => ["10", "+", "i"] + IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[0]); + string op = assignmentStrings[1]; + IValue value2 = ValueFactory.CreateValue(storage, assignmentStrings[2]); + return new ExpressionValue(value1, value2, op); + } } catch (Exception) { } } } else { - //Check if string is a bool + //Check if color + try { + return ValueFactory.CreateValue(text, "color"); + } catch (Exception) { } + } - //Check if expression - if (storage != null) { - string value = text; - value = HelperFunctions.Strip(value); - if (value[0] == "="[0]) { - value = value.Substring(1); - } - return ConvertToIValue(value, storage); + if (storage != null) { + // Check if string is a comparison + // assignmentStrings will look something like this: + // ["i"] or ["10", "=", "i"] + if (assignmentStrings.Length == 3) { + IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[0]); + string op = assignmentStrings[1]; + IValue value2 = ValueFactory.CreateValue(storage, assignmentStrings[2]); + return new ComparisonValue(value1, value2, op); } } + throw new Exception("Could not convert " + text + " to any type"); } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs index cc21d4c..2cc5a30 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs @@ -46,7 +46,8 @@ namespace Advanced_Software_Engineering { string[] commandParameters = result.getParameters(); if (command == null) throw new Exception("There is no command to process"); - IVerb tmpVerb; + IVerb tmpVerb = null; + bool parsed = false; //check for names in directory if (rootValueStorage.CheckVariableExists(command)) { @@ -59,7 +60,7 @@ namespace Advanced_Software_Engineering { } //process declarations - if (!(commandParameters == null)) + if (!(commandParameters == null) && !parsed) { switch (command) { case "var": if (commandParameters.Length == 1) { @@ -80,159 +81,180 @@ namespace Advanced_Software_Engineering { return new NoOp(); } break; + } } - List parameters = new List(); - if (!(commandParameters == null)) foreach (string parameter in commandParameters) { - parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter)); - } - int parameterLength = parameters.Count; - - - //process drawing commands and extras + //Parse flow verbs switch (command) { - //Drawing commands - case "move": - case "moveto": - //Check parameters - if (parameterLength == 2) { - tmpVerb = new MoveTo(drawer, new PointValue(parameters[0], parameters[1])); + case "if": + if (commandParameters.Length == 1) { + verbChunks.Add(new IfChunk(ValueFactory.CreateValue(rootValueStorage, commandParameters[0]))); + chunkDepth = verbChunks.Count - 1; + currentChunk = verbChunks[chunkDepth]; + parsed = true; + tmpVerb = new NoOp(); + } else if(commandParameters.Length >= 2) { + 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 + parsed = true; } else throw new Exception(command + " has an incorrect number of parameters"); break; + } - case "drawto": - case "line": - case "lineto": - //Check parameters - if (parameterLength == 2) { - tmpVerb = new DrawTo(drawer, new PointValue(parameters[0], parameters[1])); - } else throw new Exception(command + " has an incorrect number of parameters"); - break; + if (!parsed) { + List parameters = new List(); + if (!(commandParameters == null)) foreach (string parameter in commandParameters) { + parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter)); + } + int parameterLength = parameters.Count; - case "regularpolygon": - case "rp": - //Check parameters - if (parameterLength == 2) { - tmpVerb = new RegularPolygon(drawer, parameters[0], parameters[1], new IntValue(0), new BoolValue(true)); - } else if (parameterLength == 3) { - 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; + //process drawing commands and extras + switch (command) { + //Drawing commands + case "move": + case "moveto": + //Check parameters + if (parameterLength == 2) { + tmpVerb = new MoveTo(drawer, new PointValue(parameters[0], parameters[1])); + } else throw new Exception(command + " has an incorrect number of parameters"); + break; - case "square": - //Check parameters - if (parameterLength == 1) { - tmpVerb = new - Square(drawer, parameters[0]); - } else if (parameterLength == 2) { - tmpVerb = new Square(drawer, 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) { + tmpVerb = new DrawTo(drawer, new PointValue(parameters[0], parameters[1])); + } else throw new Exception(command + " has an incorrect number of parameters"); + break; - case "quadrilateral": - //Check parameters - if (parameterLength == 8) { - 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 "regularpolygon": + case "rp": + //Check parameters + if (parameterLength == 2) { + tmpVerb = new RegularPolygon(drawer, parameters[0], parameters[1], new IntValue(0), new BoolValue(true)); + } else if (parameterLength == 3) { + 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 "rectangle": - //Check parameters - if (parameterLength == 2) { - tmpVerb = new Rectangle(drawer, parameters[0], parameters[1]); - } else if (parameterLength == 8) { - return 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 "square": + //Check parameters + if (parameterLength == 1) { + tmpVerb = new + Square(drawer, parameters[0]); + } else if (parameterLength == 2) { + tmpVerb = new Square(drawer, parameters[0], parameters[1]); + } else throw new Exception(command + " has an incorrect number of parameters"); + break; - case "circle": - //Check parameters - if (parameterLength == 1) { - tmpVerb = new Circle(drawer, parameters[0]); - } else throw new Exception(command + " has an incorrect number of parameters"); - break; + case "quadrilateral": + //Check parameters + if (parameterLength == 8) { + 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 "triangle": - //Check parameters - if (parameterLength == 1) { - tmpVerb = new - Triangle(drawer, parameters[0]); - } else if (parameterLength == 2) { - tmpVerb = new - Triangle(drawer, parameters[0], parameters[1]); - } else if (parameterLength == 6) { - 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 "rectangle": + //Check parameters + if (parameterLength == 2) { + tmpVerb = new Rectangle(drawer, parameters[0], parameters[1]); + } else if (parameterLength == 8) { + 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 "dot": - if (parameterLength == 0) { - tmpVerb = new Dot(drawer); - } else throw new Exception(command + " doesn't take parameters"); - break; + case "circle": + //Check parameters + if (parameterLength == 1) { + tmpVerb = new Circle(drawer, parameters[0]); + } else throw new Exception(command + " has an incorrect number of parameters"); + break; - case "clear": - if (parameterLength == 0) { - tmpVerb = new Clear(drawer); - } else throw new Exception(command + " doesn't take parameters"); - break; + case "triangle": + //Check parameters + if (parameterLength == 1) { + tmpVerb = new + Triangle(drawer, parameters[0]); + } else if (parameterLength == 2) { + tmpVerb = new + Triangle(drawer, parameters[0], parameters[1]); + } else if (parameterLength == 6) { + 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 "reset": - case "resetpen": - if (parameterLength == 0) { - tmpVerb = new ResetPen(drawer); - } else throw new Exception(command + " doesn't take parameters"); - break; + case "dot": + if (parameterLength == 0) { + tmpVerb = new Dot(drawer); + } else throw new Exception(command + " doesn't take parameters"); + break; - case "fillon": - if (parameterLength == 0) { - tmpVerb = new Fill(drawer, true); - } else throw new Exception(command + " doesn't take parameters"); - break; + case "clear": + if (parameterLength == 0) { + tmpVerb = new Clear(drawer); + } else throw new Exception(command + " doesn't take parameters"); + break; - case "filloff": - if (parameterLength == 0) { - tmpVerb = new Fill(drawer, false); - } else throw new Exception(command + " doesn't take parameters"); - break; + case "reset": + case "resetpen": + if (parameterLength == 0) { + tmpVerb = new ResetPen(drawer); + } else throw new Exception(command + " doesn't take parameters"); + break; - case "pen": - if (parameterLength == 1) { - tmpVerb = new PenColor(drawer, parameters[0]); - } else if (parameterLength == 3) { - tmpVerb = new PenColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2])); - } else if (parameterLength == 4) { - 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 "fillon": + if (parameterLength == 0) { + tmpVerb = new Fill(drawer, true); + } else throw new Exception(command + " doesn't take parameters"); + break; - case "fill": - if (parameterLength == 1) { - tmpVerb = new FillColor(drawer, parameters[0]); - } else if (parameterLength == 3) { - tmpVerb = new FillColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], new IntValue(255))); - } else if (parameterLength == 4) { - 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; + case "filloff": + if (parameterLength == 0) { + tmpVerb = new Fill(drawer, false); + } else throw new Exception(command + " doesn't take parameters"); + break; - default: - throw new Exception("Unknown command or cannot parse"); + case "pen": + if (parameterLength == 1) { + tmpVerb = new PenColor(drawer, parameters[0]); + } else if (parameterLength == 3) { + tmpVerb = new PenColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2])); + } else if (parameterLength == 4) { + 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) { + tmpVerb = new FillColor(drawer, parameters[0]); + } else if (parameterLength == 3) { + tmpVerb = new FillColor(drawer, new ColorValue(parameters[0], parameters[1], parameters[2], new IntValue(255))); + } else if (parameterLength == 4) { + 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;