예제 #1
0
        public override Word PyNotEquals(PyObj obj0, PyObj obj1)
        {
            if (obj1.IsNull())
            {
                return(new MyBoolean(true));
            }
            var intObj0 = (int)((MyChar)obj0).CharValue;

            if (obj1.GetMyType() == TypeConstants.CHAR)
            {
                var intObj1 = (int)((MyChar)obj1).CharValue;
                return(new MyBoolean(intObj0 != intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.INT)
            {
                var intObj1 = ((MyInt)obj1).Int;
                return(new MyBoolean(intObj0 != intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.DOUBLE)
            {
                var doubleObj1 = ((MyDouble)obj1).DoubleValue;
                return(new MyBoolean(intObj0 != doubleObj1));
            }
            return(BinaryError(obj0, BinaryOperator.PyNotEquals, obj1));
        }
예제 #2
0
        public override Word Div(PyObj obj0, PyObj obj1)
        {
            var intObj0 = (int)((MyChar)obj0).CharValue;

            if (obj1.GetMyType() == TypeConstants.CHAR)
            {
                var intObj1 = (int)((MyChar)obj1).CharValue;
                if (intObj1 == 0)
                {
                    return(BinaryError(obj0, BinaryOperator.Div, obj1));
                }
                return(new MyInt(intObj0 / intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.INT)
            {
                var intObj1 = ((MyInt)obj1).Int;
                if (intObj1 == 0)
                {
                    return(BinaryError(obj0, BinaryOperator.Div, obj1));
                }
                return(new MyInt(intObj0 / intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.DOUBLE)
            {
                var doubleObj1 = ((MyDouble)obj1).DoubleValue;
                if (doubleObj1 == 0)
                {
                    return(BinaryError(obj0, BinaryOperator.Div, obj1));
                }
                return(new MyDouble(intObj0 / doubleObj1));
            }
            return(BinaryError(obj0, BinaryOperator.Div, obj1));
        }
예제 #3
0
        public override Word Plus(PyObj obj0, PyObj obj1)
        {
            if (obj1.GetMyType() == TypeConstants.STRING)
            {
                return(new MyString(obj0.MyToString() + obj1.MyToString()));
            }
            var intObj0 = (int)((MyChar)obj0).CharValue;

            if (obj1.GetMyType() == TypeConstants.CHAR)
            {
                var intObj1 = (int)((MyChar)obj1).CharValue;
                return(new MyInt(intObj0 + intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.INT)
            {
                var intObj1 = ((MyInt)obj1).Int;
                return(new MyInt(intObj0 + intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.DOUBLE)
            {
                var doubleObj1 = ((MyDouble)obj1).DoubleValue;
                return(new MyDouble(intObj0 + doubleObj1));
            }
            return(BinaryError(obj0, BinaryOperator.Plus, obj1));
        }
 public override Word Or(PyObj obj0, PyObj obj1)
 {
     if (obj1.GetMyType() != TypeConstants.BOOLEAN)
     {
         return(BinaryError(obj0, BinaryOperator.Or, obj1));
     }
     return(new MyBoolean(((MyBoolean)obj0).Bool || ((MyBoolean)obj1).Bool));
 }
 public override Word Plus(PyObj obj0, PyObj obj1)
 {
     if (obj1.GetMyType() != TypeConstants.STRING)
     {
         return(BinaryError(obj0, BinaryOperator.Plus, obj1));
     }
     return(new MyString(obj0.MyToString() + obj1.MyToString()));
 }
 public override Word Plus(PyObj obj0, PyObj obj1)
 {
     if (obj1.IsNull())
     {
         return(BinaryError(obj0, BinaryOperator.Plus, obj1));
     }
     return(new MyString(obj0.MyToString() + obj1.MyToString()));
 }
예제 #7
0
 public MyError Add(string key, PyObj value)
 {
     if (SymbolTable.Contains(key))
     {
         return(ScopeErrorFactory.AlreadyDefined(key));
     }
     SymbolTable.UnsafeAdd(key, value);
     return(null);
 }
 public virtual MyError UnaryError(UnaryOperator op, PyObj obj0)
 {
     return(new MyError(string.Format("No se puede realizar la operacion unaria: {0} ({1}).  Con tipo: <{2}> y valor: <{3}>"
                                      , op.ToString()
                                      , op.ToStringSymbol()
                                      , TypeConstants.GetMyTypeName(obj0.GetMyType())
                                      , obj0.MyToString()
                                      )));
 }
 public virtual MyError BinaryError(PyObj obj0, BinaryOperator op, PyObj obj1)
 {
     return(new MyError(string.Format("No se puede realizar la operacion binaria: {0} ({1}).  Con tipos: <{2}, {3}> y valores: <{4}, {5}>"
                                      , op.ToString()
                                      , op.ToStringSymbol()
                                      , TypeConstants.GetMyTypeName(obj0.GetMyType())
                                      , TypeConstants.GetMyTypeName(obj1.GetMyType())
                                      , obj0.MyToString()
                                      , obj1.MyToString()
                                      )));
 }
 public override Word PyNotEquals(PyObj obj0, PyObj obj1)
 {
     if (obj1.IsNull())
     {
         return(new MyBoolean(true));
     }
     if (obj1.GetMyType() == TypeConstants.BOOLEAN)
     {
         return(new MyBoolean(((MyBoolean)obj0).Bool != ((MyBoolean)obj1).Bool));
     }
     return(BinaryError(obj0, BinaryOperator.PyNotEquals, obj1));
 }
예제 #11
0
 public MyError Set(string key, PyObj value)
 {
     if (SymbolTable.Set(key, value))
     {
         return(null);
     }
     if (!IsBottom())
     {
         return(OuterScope.Set(key, value));
     }
     return(ScopeErrorFactory.NotFound(key));
 }
 public override Word PyNotEquals(PyObj obj0, PyObj obj1)
 {
     if (obj1.IsNull())
     {
         return(new MyBoolean(true));
     }
     if (obj1.GetMyType() != TypeConstants.STRING)
     {
         return(BinaryError(obj0, BinaryOperator.PyNotEquals, obj1));
     }
     return(new MyBoolean(((MyString)obj0).StringValue != ((MyString)obj1).StringValue));
 }
 public override Word PyNotEquals(PyObj obj0, PyObj obj1)
 {
     if (obj1.IsNull())
     {
         return(new MyBoolean(true));
     }
     //TODO TODO TODO TODO: PROBAR QUE FUNCIONE ESTO!
     if (obj0.GetMyType() == obj1.GetMyType())
     {
         return(new MyBoolean(obj0 != obj1));
     }
     return(BinaryError(obj0, BinaryOperator.PyNotEquals, obj1));
 }
 /// <summary>
 /// Agrega sin verficar que no contenga la llave. Usarse solo si se verifico que no esten presentes los valores antes
 /// </summary>
 /// <param name="key"></param>
 /// <param name="value"></param>
 public void UnsafeAdd(string key, PyObj value)
 {
     key = key.ToLowerInvariant();
     if (value.IsNull())
     {
         Table[key] = new MemoryBlock(MyNull.GetInstance());
     }
     if (value.IsPrimitive())
     {
         Table[key] = new MemoryBlock(MyPrimitiveFactory.CreateCopy((MyPrimitive)value));
     }
     else//Only option left is for value to be customInstance
     {
         Table[key] = new MemoryBlock(value);
     }
 }
예제 #15
0
        public override Word LessOrEqualTo(PyObj obj0, PyObj obj1)
        {
            var intObj0 = (int)((MyChar)obj0).CharValue;

            if (obj1.GetMyType() == TypeConstants.CHAR)
            {
                var intObj1 = (int)((MyChar)obj1).CharValue;
                return(new MyBoolean(intObj0 <= intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.INT)
            {
                var intObj1 = ((MyInt)obj1).Int;
                return(new MyBoolean(intObj0 <= intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.DOUBLE)
            {
                var doubleObj1 = ((MyDouble)obj1).DoubleValue;
                return(new MyBoolean(intObj0 <= doubleObj1));
            }
            return(BinaryError(obj0, BinaryOperator.LessOrEqualTo, obj1));
        }
 /// <summary>
 /// Retorna false si no agrego el valor a la tabla de simbolos. Solo se agregan valores que no esten presentes
 /// </summary>
 /// <param name="type"></param
 /// <param name="value"></param>
 /// <returns></returns>
 public bool Add(string key, PyObj value)
 {
     key = key.ToLowerInvariant();
     if (Table.ContainsKey(key))
     {
         return(false);
     }
     if (value.IsNull())
     {
         Table[key] = new MemoryBlock(MyNull.GetInstance());
     }
     if (value.IsPrimitive())
     {
         Table[key] = new MemoryBlock(MyPrimitiveFactory.CreateCopy((MyPrimitive)value));
     }
     else//Only option left is for value to be customInstance
     {
         Table[key] = new MemoryBlock(value);
     }
     return(true);
 }
예제 #17
0
        public override Word Pow(PyObj obj0, PyObj obj1)
        {
            var intObj0 = (int)((MyChar)obj0).CharValue;

            if (obj1.GetMyType() == TypeConstants.CHAR)
            {
                var intObj1 = (int)((MyChar)obj1).CharValue;
                return(new MyDouble(Math.Pow(intObj0, intObj1)));
            }
            if (obj1.GetMyType() == TypeConstants.INT)
            {
                var intObj1 = ((MyInt)obj1).Int;
                return(new MyDouble(Math.Pow(intObj0, intObj1)));
            }
            if (obj1.GetMyType() == TypeConstants.DOUBLE)
            {
                var doubleObj1 = ((MyDouble)obj1).DoubleValue;
                return(new MyDouble(Math.Pow(intObj0, doubleObj1)));
            }
            return(BinaryError(obj0, BinaryOperator.Pow, obj1));
        }
예제 #18
0
        public override Word GreaterThan(PyObj obj0, PyObj obj1)
        {
            var doubleObj0 = ((MyDouble)obj0).DoubleValue;

            if (obj1.GetMyType() == TypeConstants.CHAR)
            {
                var intObj1 = (int)((MyChar)obj1).CharValue;
                return(new MyBoolean(doubleObj0 > intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.INT)
            {
                var intObj1 = ((MyInt)obj1).Int;
                return(new MyBoolean(doubleObj0 > intObj1));
            }
            if (obj1.GetMyType() == TypeConstants.DOUBLE)
            {
                var doubleObj1 = ((MyDouble)obj1).DoubleValue;
                return(new MyBoolean(doubleObj0 > doubleObj1));
            }
            return(BinaryError(obj0, BinaryOperator.GreaterThan, obj1));
        }
        /// <summary>
        /// Retorna false si no se cambio el valor de la llave en la tabla de simbolos. Solo se cambian valores que ya estan presentes
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool Set(string key, PyObj value)
        {
            key = key.ToLowerInvariant();
            MemoryBlock memoryBlock;

            if (!Table.TryGetValue(key, out memoryBlock))
            {
                return(false);
            }
            if (value.IsNull())
            {
                memoryBlock.Value = MyNull.GetInstance();
            }
            if (value.IsPrimitive())
            {
                memoryBlock.Value = MyPrimitiveFactory.CreateCopy((MyPrimitive)value);
            }
            else//Only option left is for value to be customInstance
            {
                memoryBlock.Value = value;
            }
            return(true);
        }
        public override PyObj PreBinaryOperation(PyObj obj0, BinaryOperator binaryOperator)
        {
            var myBool = (MyBoolean)obj0;

            switch (binaryOperator)
            {
            case BinaryOperator.And:
                if (myBool.Bool == false)
                {
                    return(new MyBoolean(false));
                }
                return(null);

            case BinaryOperator.Or:
                if (myBool.Bool == true)
                {
                    return(new MyBoolean(true));
                }
                return(null);

            default:
                return(null);
            }
        }
예제 #21
0
 public override Word Not(PyObj obj0)
 {
     return(UnaryError(UnaryOperator.Not, obj0));
 }
예제 #22
0
 public override Word Xor(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.Xor, obj1));
 }
예제 #23
0
 public override Word And(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.And, obj1));
 }
예제 #24
0
 public override Word LessOrEqualTo(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.LessOrEqualTo, obj1));
 }
예제 #25
0
 public override Word LessThan(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.LessThan, obj1));
 }
예제 #26
0
 public override Word GreaterThan(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.GreaterThan, obj1));
 }
예제 #27
0
 public override Word Pow(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.Pow, obj1));
 }
예제 #28
0
 public override Word Div(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.Div, obj1));
 }
예제 #29
0
 public override Word Mult(PyObj obj0, PyObj obj1)
 {
     return(BinaryError(obj0, BinaryOperator.Mult, obj1));
 }
예제 #30
0
 public override Word PyNotEquals(PyObj obj0, PyObj obj1)
 {
     return(new MyBoolean(!obj1.IsNull()));
 }