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)); }
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)); }
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())); }
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)); }
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); } }
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); }
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)); }
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); } }
public override Word Not(PyObj obj0) { return(UnaryError(UnaryOperator.Not, obj0)); }
public override Word Xor(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.Xor, obj1)); }
public override Word And(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.And, obj1)); }
public override Word LessOrEqualTo(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.LessOrEqualTo, obj1)); }
public override Word LessThan(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.LessThan, obj1)); }
public override Word GreaterThan(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.GreaterThan, obj1)); }
public override Word Pow(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.Pow, obj1)); }
public override Word Div(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.Div, obj1)); }
public override Word Mult(PyObj obj0, PyObj obj1) { return(BinaryError(obj0, BinaryOperator.Mult, obj1)); }
public override Word PyNotEquals(PyObj obj0, PyObj obj1) { return(new MyBoolean(!obj1.IsNull())); }