Example #1
0
        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());
        }
Example #2
0
        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));
        }
Example #3
0
        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));
        }
Example #4
0
        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));
        }
Example #5
0
        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);
        }