Implemented single line if statements

This commit is contained in:
Lukasz Baldyga committed 2020-11-30 18:25:19 +00:00
1 parent 555de0b62b
commit affc6d6e53
3 files changed
+59 -31

No files matched your search

@@ -1,4 +1,5 @@
using Advanced_Software_Engineering.Verbs.Value; using Advanced_Software_Engineering.Verbs.Value;
using System.Collections.Generic;
namespace Advanced_Software_Engineering.Verbs.Flow { namespace Advanced_Software_Engineering.Verbs.Flow {
public class IfChunk : VerbChunk, IVerb { public class IfChunk : VerbChunk, IVerb {
@@ -9,6 +10,10 @@ namespace Advanced_Software_Engineering.Verbs.Flow {
this.conditional = conditional; this.conditional = conditional;
} }
public IfChunk(IValue conditional, IVerb oneLineVerb) : base(new List<IVerb> { oneLineVerb }) {
this.conditional = conditional;
}
public new void ExecuteVerb() { public new void ExecuteVerb() {
if (conditional.ToBool()) base.ExecuteVerb(); if (conditional.ToBool()) base.ExecuteVerb();
} }
@@ -1,4 +1,5 @@
using System; using Advanced_Software_Engineering.Verbs.Value.ValueTypes;
using System;
using System.Drawing; using System.Drawing;
namespace Advanced_Software_Engineering.Verbs.Value { namespace Advanced_Software_Engineering.Verbs.Value {
@@ -122,8 +123,23 @@ namespace Advanced_Software_Engineering.Verbs.Value {
public static IValue ConvertToIValue(string text, ValueStorage storage = null) { public static IValue ConvertToIValue(string text, ValueStorage storage = null) {
text = HelperFunctions.Strip(text); 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 //No assignmnet
if (!text.Contains("=")) {
if (!text.Contains("#")) { if (!text.Contains("#")) {
//Check if string is a number //Check if string is a number
if (!text.Contains(".")) { if (!text.Contains(".")) {
@@ -147,21 +163,6 @@ namespace Advanced_Software_Engineering.Verbs.Value {
//check for expression //check for expression
if (storage != null) { if (storage != null) {
try { 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: // assignmentStrings will look something like this:
// ["i"] or ["10", "+", "i"] // ["i"] or ["10", "+", "i"]
if (assignmentStrings.Length == 1) return ValueFactory.CreateValue(storage, assignmentStrings[0]); if (assignmentStrings.Length == 1) return ValueFactory.CreateValue(storage, assignmentStrings[0]);
@@ -180,19 +181,19 @@ namespace Advanced_Software_Engineering.Verbs.Value {
return ValueFactory.CreateValue(text, "color"); return ValueFactory.CreateValue(text, "color");
} catch (Exception) { } } catch (Exception) { }
} }
} else {
//Check if string is a bool
//Check if expression
if (storage != null) { if (storage != null) {
string value = text; // Check if string is a comparison
value = HelperFunctions.Strip(value); // assignmentStrings will look something like this:
if (value[0] == "="[0]) { // ["i"] or ["10", "=", "i"]
value = value.Substring(1); if (assignmentStrings.Length == 3) {
} IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[0]);
return ConvertToIValue(value, storage); 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"); throw new Exception("Could not convert " + text + " to any type");
} }
@@ -46,7 +46,8 @@ namespace Advanced_Software_Engineering {
string[] commandParameters = result.getParameters(); string[] commandParameters = result.getParameters();
if (command == null) throw new Exception("There is no command to process"); 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 //check for names in directory
if (rootValueStorage.CheckVariableExists(command)) { if (rootValueStorage.CheckVariableExists(command)) {
@@ -59,7 +60,7 @@ namespace Advanced_Software_Engineering {
} }
//process declarations //process declarations
if (!(commandParameters == null)) if (!(commandParameters == null) && !parsed) {
switch (command) { switch (command) {
case "var": case "var":
if (commandParameters.Length == 1) { if (commandParameters.Length == 1) {
@@ -81,15 +82,35 @@ namespace Advanced_Software_Engineering {
} }
break; break;
} }
}
//Parse flow verbs
switch (command) {
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;
}
if (!parsed) {
List<IValue> parameters = new List<IValue>(); List<IValue> parameters = new List<IValue>();
if (!(commandParameters == null)) foreach (string parameter in commandParameters) { if (!(commandParameters == null)) foreach (string parameter in commandParameters) {
parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter)); parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter));
} }
int parameterLength = parameters.Count; int parameterLength = parameters.Count;
//process drawing commands and extras //process drawing commands and extras
switch (command) { switch (command) {
//Drawing commands //Drawing commands
@@ -147,7 +168,7 @@ namespace Advanced_Software_Engineering {
if (parameterLength == 2) { if (parameterLength == 2) {
tmpVerb = new Rectangle(drawer, parameters[0], parameters[1]); tmpVerb = new Rectangle(drawer, parameters[0], parameters[1]);
} else if (parameterLength == 8) { } else if (parameterLength == 8) {
return new Quadrilateral(drawer, tmpVerb = new Quadrilateral(drawer,
new PointValue(parameters[0], parameters[1]), new PointValue(parameters[0], parameters[1]),
new PointValue(parameters[2], parameters[3]), new PointValue(parameters[2], parameters[3]),
new PointValue(parameters[4], parameters[5]), new PointValue(parameters[4], parameters[5]),
@@ -234,6 +255,7 @@ namespace Advanced_Software_Engineering {
default: default:
throw new Exception("Unknown command or cannot parse"); throw new Exception("Unknown command or cannot parse");
} }
}
if (chunkDepth == 0) return tmpVerb; if (chunkDepth == 0) return tmpVerb;
currentChunk.AddVerb(tmpVerb); currentChunk.AddVerb(tmpVerb);