diff --git a/Source/Parser/Expressions/Trigger/ModifiedMemoryAccessorExpression.cs b/Source/Parser/Expressions/Trigger/ModifiedMemoryAccessorExpression.cs index 26205548..0fbce040 100644 --- a/Source/Parser/Expressions/Trigger/ModifiedMemoryAccessorExpression.cs +++ b/Source/Parser/Expressions/Trigger/ModifiedMemoryAccessorExpression.cs @@ -602,7 +602,10 @@ public ExpressionBase ApplyMathematic(ExpressionBase right, MathematicOperation case RequirementOperator.Multiply: // a * 0 => 0 case RequirementOperator.BitwiseAnd: // a & 0 => 0 - return new IntegerConstantExpression(0); + if (MemoryAccessor.Field.IsFloat) + return new FloatConstantExpression(0.0f); + else + return new IntegerConstantExpression(0); case RequirementOperator.BitwiseXor: // a ^ 0 => a ModifyingOperator = RequirementOperator.None; @@ -620,7 +623,11 @@ public ExpressionBase ApplyMathematic(ExpressionBase right, MathematicOperation break; case RequirementOperator.Modulus: // a % 1 => 0 - return new IntegerConstantExpression(0); + if (!MemoryAccessor.Field.IsFloat) + return new IntegerConstantExpression(0); + + // float % 1 returns the fractional part + break; } } diff --git a/Tests/Parser/Expressions/Trigger/MemoryAccessorExpressionTests.cs b/Tests/Parser/Expressions/Trigger/MemoryAccessorExpressionTests.cs index 65ec615d..49695dc2 100644 --- a/Tests/Parser/Expressions/Trigger/MemoryAccessorExpressionTests.cs +++ b/Tests/Parser/Expressions/Trigger/MemoryAccessorExpressionTests.cs @@ -114,6 +114,46 @@ public void TestBuildTrigger(string input, string expected) ExpressionType.MemoryAccessor, "byte(0x001234) & 0x000000F7")] [TestCase("byte(0x001234)", "&", "0x0000007F", ExpressionType.MemoryAccessor, "byte(0x001234) & 0x0000007F")] + [TestCase("byte(0x001234)", "*", "1", + ExpressionType.MemoryAccessor, "byte(0x001234)")] + [TestCase("byte(0x001234)", "*", "0", + ExpressionType.IntegerConstant, "0")] + [TestCase("byte(0x001234)", "*", "1.0", + ExpressionType.MemoryAccessor, "byte(0x001234)")] + [TestCase("byte(0x001234)", "*", "0.0", + ExpressionType.IntegerConstant, "0")] + [TestCase("byte(0x001234)", "/", "1", + ExpressionType.MemoryAccessor, "byte(0x001234)")] + [TestCase("byte(0x001234)", "/", "0", + ExpressionType.Error, "Division by zero")] + [TestCase("byte(0x001234)", "%", "1", + ExpressionType.IntegerConstant, "0")] + [TestCase("byte(0x001234)", "%", "0", + ExpressionType.Error, "Division by zero")] + [TestCase("byte(0x001234)", "%", "1.0", + ExpressionType.IntegerConstant, "0")] + [TestCase("byte(0x001234)", "&", "0", + ExpressionType.IntegerConstant, "0")] + [TestCase("byte(0x001234)", "^", "0", + ExpressionType.MemoryAccessor, "byte(0x001234)")] + [TestCase("float(0x001234)", "*", "1.0", + ExpressionType.MemoryAccessor, "float(0x001234)")] + [TestCase("float(0x001234)", "*", "0.0", + ExpressionType.FloatConstant, "0.0")] + [TestCase("float(0x001234)", "*", "1", + ExpressionType.MemoryAccessor, "float(0x001234)")] + [TestCase("float(0x001234)", "*", "0", + ExpressionType.FloatConstant, "0.0")] + [TestCase("float(0x001234)", "/", "1.0", + ExpressionType.MemoryAccessor, "float(0x001234)")] + [TestCase("float(0x001234)", "/", "0.0", + ExpressionType.Error, "Division by zero")] + [TestCase("float(0x001234)", "%", "1.0", + ExpressionType.MemoryAccessor, "float(0x001234) % 1.0")] + [TestCase("float(0x001234)", "%", "0.0", + ExpressionType.Error, "Division by zero")] + [TestCase("float(0x001234)", "%", "1", + ExpressionType.MemoryAccessor, "float(0x001234) % 1")] public void TestCombine(string left, string operation, string right, ExpressionType expectedType, string expected) { // MemoryAccessorExpression.Combine just converts to a ModifiedMemoryAccessor and