Пример #1
0
        public TypedValue Evaluate(BinaryOperation operation, InterpreterContext context)
        {
            var    left       = Evaluate(operation.Left, context);
            var    right      = Evaluate(operation.Right, context);
            var    resultType = CheckBinaryOperationTyping(operation.Operator, left.ValueType, right.ValueType);
            object value      = null;

            switch (operation.Operator)
            {
            case BinaryOperator.ADD:
            {
                value = left.IntValue + right.IntValue;
                break;
            }

            case BinaryOperator.SUB:
            {
                value = left.IntValue - right.IntValue;
                break;
            }

            case BinaryOperator.MULTIPLY:
            {
                value = left.IntValue * right.IntValue;
                break;
            }

            case BinaryOperator.DIVIDE:
            {
                value = left.IntValue / right.IntValue;
                break;
            }

            case BinaryOperator.AND:
            {
                value = left.BoolValue && right.BoolValue;
                break;
            }

            case BinaryOperator.OR:
            {
                value = left.BoolValue || right.BoolValue;
                break;
            }

            case BinaryOperator.GREATER:
            {
                switch (left.ValueType)
                {
                case WhileType.BOOL:
                {
                    value = left.BoolValue && right.BoolValue == false;
                    break;
                }

                case WhileType.INT:
                {
                    value = left.IntValue > right.IntValue;
                    break;
                }

                case WhileType.STRING:
                {
                    value = left.StringValue.CompareTo(right.StringValue) == 1;
                    break;
                }

                default:
                {
                    value = false;
                    break;
                }
                }

                break;
            }

            case BinaryOperator.LESSER:
            {
                switch (left.ValueType)
                {
                case WhileType.BOOL:
                {
                    value = left.BoolValue == false && right.BoolValue;
                    break;
                }

                case WhileType.INT:
                {
                    value = left.IntValue < right.IntValue;
                    break;
                }

                case WhileType.STRING:
                {
                    value = left.StringValue.CompareTo(right.StringValue) == -1;
                    break;
                }

                default:
                {
                    value = false;
                    break;
                }
                }

                break;
            }

            case BinaryOperator.EQUALS:
            {
                switch (left.ValueType)
                {
                case WhileType.BOOL:
                {
                    value = left.BoolValue == right.BoolValue;
                    break;
                }

                case WhileType.INT:
                {
                    value = left.IntValue == right.IntValue;
                    break;
                }

                case WhileType.STRING:
                {
                    value = left.StringValue == right.StringValue;
                    break;
                }

                default:
                {
                    value = false;
                    break;
                }
                }

                break;
            }

            case BinaryOperator.DIFFERENT:
            {
                switch (left.ValueType)
                {
                case WhileType.BOOL:
                {
                    value = left.BoolValue != right.BoolValue;
                    break;
                }

                case WhileType.INT:
                {
                    value = left.IntValue != right.IntValue;
                    break;
                }

                case WhileType.STRING:
                {
                    value = left.StringValue != right.StringValue;
                    break;
                }

                default:
                {
                    value = false;
                    break;
                }
                }

                break;
            }

            case BinaryOperator.CONCAT:
            {
                value = left.StringValue + right.StringValue;
                break;
            }

            default:
            {
                value = null;
                break;
            }
            }

            return(new TypedValue(resultType, value));
        }
Пример #2
0
 public TypedValue Evaluate(IntegerConstant intConst, InterpreterContext context)
 {
     return(new TypedValue(intConst.Value));
 }
Пример #3
0
 public TypedValue Evaluate(BoolConstant boolConst, InterpreterContext context)
 {
     return(new TypedValue(boolConst.Value));
 }
Пример #4
0
 public TypedValue Evaluate(StringConstant stringConst, InterpreterContext context)
 {
     return(new TypedValue(stringConst.Value));
 }
Пример #5
0
        private void Interprete(AssignStatement ast, InterpreterContext context)
        {
            var val = evaluator.Evaluate(ast.Value, context);

            context.SetVariable(ast.VariableName, val);
        }