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 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<IVerb> { oneLineVerb }) {
this.conditional = conditional;
}
public new void ExecuteVerb() {
if (conditional.ToBool()) base.ExecuteVerb();
}
@@ -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,8 +123,23 @@ 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(".")) {
@@ -147,21 +163,6 @@ namespace Advanced_Software_Engineering.Verbs.Value {
//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]);
@@ -180,19 +181,19 @@ namespace Advanced_Software_Engineering.Verbs.Value {
return ValueFactory.CreateValue(text, "color");
} catch (Exception) { }
}
} else {
//Check if string is a bool
//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);
// 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");
}
@@ -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) {
@@ -81,15 +82,35 @@ namespace Advanced_Software_Engineering {
}
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>();
if (!(commandParameters == null)) foreach (string parameter in commandParameters) {
parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter));
}
int parameterLength = parameters.Count;
//process drawing commands and extras
switch (command) {
//Drawing commands
@@ -147,7 +168,7 @@ namespace Advanced_Software_Engineering {
if (parameterLength == 2) {
tmpVerb = new Rectangle(drawer, parameters[0], parameters[1]);
} else if (parameterLength == 8) {
return new Quadrilateral(drawer,
tmpVerb = new Quadrilateral(drawer,
new PointValue(parameters[0], parameters[1]),
new PointValue(parameters[2], parameters[3]),
new PointValue(parameters[4], parameters[5]),
@@ -234,6 +255,7 @@ namespace Advanced_Software_Engineering {
default:
throw new Exception("Unknown command or cannot parse");
}
}
if (chunkDepth == 0) return tmpVerb;
currentChunk.AddVerb(tmpVerb);