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)); }
public TypedValue Evaluate(IntegerConstant intConst, InterpreterContext context) { return(new TypedValue(intConst.Value)); }
public TypedValue Evaluate(BoolConstant boolConst, InterpreterContext context) { return(new TypedValue(boolConst.Value)); }
public TypedValue Evaluate(StringConstant stringConst, InterpreterContext context) { return(new TypedValue(stringConst.Value)); }
private void Interprete(AssignStatement ast, InterpreterContext context) { var val = evaluator.Evaluate(ast.Value, context); context.SetVariable(ast.VariableName, val); }