Example #1
0
 public Operation(MathsExpression left, MathsExpression right, char @operator)
 => (Left, Right, Operator) = (left, right, @operator);
Example #2
0
        public void Visit(MathsExpression maths)
        {
            object leftVal  = null;
            object rightVal = null;

            SailType resultType = SailType.UNKNOWN;

            // Left
            if (maths.Left is IntLiteralExpression)
            {
                leftVal    = ((IntLiteralExpression)maths.Left).Value;
                resultType = SailType.INT;
            }

            else if (maths.Left is FloatLiteralExpression)
            {
                leftVal    = ((FloatLiteralExpression)maths.Left).Value;
                resultType = SailType.FLOAT;
            }

            else if (maths.Left is IdentifierExpression)
            {
                string name     = ((IdentifierExpression)maths.Left).Value;
                var    variable = _variables.FirstOrDefault(v => v.Name == name);

                if (variable == null)
                {
                    ErrorManager.CreateError("Can't compare non-existant variable!", ErrorType.Error, maths.Left.Line, maths.Left.Column);
                    return;
                }

                if (variable.Value == null)
                {
                    ErrorManager.CreateError("Can't compare null valued variable!", ErrorType.Error, maths.Left.Line, maths.Left.Column);
                    return;
                }

                leftVal = variable.Value;

                resultType = variable.Type;
            }

            else if (maths.Left is MathsExpression)
            {
                Visit(maths.Left);

                var mathsValue = _mathsResults.Pop();

                rightVal   = mathsValue.Value;
                resultType = mathsValue.Type;
            }

            // Right
            if (maths.Right is IntLiteralExpression)
            {
                rightVal   = ((IntLiteralExpression)maths.Right).Value;
                resultType = SailType.INT;
            }

            else if (maths.Right is FloatLiteralExpression)
            {
                rightVal   = ((FloatLiteralExpression)maths.Right).Value;
                resultType = SailType.FLOAT;
            }

            else if (maths.Right is IdentifierExpression)
            {
                string name     = ((IdentifierExpression)maths.Right).Value;
                var    variable = _variables.FirstOrDefault(v => v.Name == name);

                if (variable == null)
                {
                    ErrorManager.CreateError("Can't compare non-existant variable!", ErrorType.Error, maths.Right.Line, maths.Right.Column);
                    return;
                }

                if (variable.Value == null)
                {
                    ErrorManager.CreateError("Can't compare null valued variable!", ErrorType.Error, maths.Right.Line, maths.Right.Column);
                    return;
                }

                rightVal = variable.Value;

                resultType = variable.Type;
            }

            else if (maths.Right is MathsExpression)
            {
                Visit(maths.Right);

                var mathsValue = _mathsResults.Pop();

                rightVal   = mathsValue.Value;
                resultType = mathsValue.Type;
            }

            object value = null;

            switch (maths.OperatorType)
            {
            case TokenType.PLUS:
                value = Convert.ToSingle(leftVal) + Convert.ToSingle(rightVal);
                break;

            case TokenType.MINUS:
                value = Convert.ToSingle(leftVal) - Convert.ToSingle(rightVal);
                break;

            case TokenType.ASTERISK:
                value = Convert.ToSingle(leftVal) * Convert.ToSingle(rightVal);
                break;

            case TokenType.FSLASH:
                value = Convert.ToSingle(leftVal) / Convert.ToSingle(rightVal);
                break;

            case TokenType.MODULO:
                value = Convert.ToSingle(leftVal) % Convert.ToSingle(rightVal);
                break;
            }

            _mathsResults.Push(new SailObject(null, value, resultType));
        }