public void Equal_Optimize_FullyConstant_Value() { var originalnode = new EqualsComparisonNode(new ShortValueNode(1), new ShortValueNode(1)); var optimizednode = originalnode.Optimize(NoVariables); Assert.AreEqual(1, optimizednode.GetValue()); }
public void EqualsComparison_Optimize_UnknownVariableRemains() { var originalnode = new EqualsComparisonNode(new ShortValueNode(1), new VariableValueNode("x")); var optimizednode = originalnode.Optimize(NoVariables); Assert.IsInstanceOfType(optimizednode, typeof(EqualsComparisonNode)); }
public void EqualsComparison_Optimize_FullyConstantCollapses() { var originalnode = new EqualsComparisonNode(new ShortValueNode(1), new ShortValueNode(1)); var optimizednode = originalnode.Optimize(NoVariables); Assert.IsInstanceOfType(optimizednode, typeof(ConstantNode)); }
public void Equal_Optimize_RecursiveReduction() { var originalnode = new EqualsComparisonNode( new VariableValueNode("a"), new VariableValueNode("b") ); var optimizednode = originalnode.Optimize(new Dictionary <string, ushort> { { "a", 0 }, { "b", 1 } }); Assert.IsInstanceOfType(optimizednode, typeof(ConstantNode)); }
public BinaryExpressionNode ParseBinaryExpresssion(Token operatorToken, AstNode leftOperand, AstNode rightOperand) { BinaryExpressionNode expression = null; switch (operatorToken.Type) { case TokenType.Plus: expression = new AdditionNode(operatorToken.SourceLine); break; case TokenType.Minus: expression = new SubstractionNode(operatorToken.SourceLine); break; case TokenType.Asterisk: expression = new MultiplicationNode(operatorToken.SourceLine); break; case TokenType.Slash: expression = new DivisionNode(operatorToken.SourceLine); break; case TokenType.Equals: expression = new EqualsComparisonNode(operatorToken.SourceLine); break; case TokenType.NotEquals: expression = new NotEqualsComparisonNode(operatorToken.SourceLine); break; case TokenType.Less: expression = new LessComparisonNode(operatorToken.SourceLine); break; case TokenType.EqualsOrLess: expression = new EqualsOrLessComparisonNode(operatorToken.SourceLine); break; case TokenType.Greater: expression = new GreaterComparisonNode(operatorToken.SourceLine); break; case TokenType.EqualsOrGreater: expression = new EqualsOrGreaterComparisonNode(operatorToken.SourceLine); break; case TokenType.And: expression = new LogicalAndNode(operatorToken.SourceLine); break; case TokenType.Or: expression = new LogicalOrNode(operatorToken.SourceLine); break; default: throw new CompilerException($"`{MethodBase.GetCurrentMethod().Name}` called with a bad token. Expected a binary operator, token has type `{operatorToken.Type}` instead."); } expression.LeftOperand = leftOperand; expression.RightOperand = rightOperand; return(expression); }