private Value Literal() { try { if (currentToken.GetType() == Token.Type.IntLiteral) { Value v = new IntValue(int.Parse(currentToken.GetValue())); Match(Token.Type.IntLiteral); return(v); } else if (currentToken.GetType() == Token.Type.FloatLiteral) { Value v = new FloatValue(float.Parse(currentToken.GetValue())); Match(Token.Type.FloatLiteral); return(v); } else if (currentToken.GetType() == Token.Type.CharLiteral) { Value v = new CharValue(currentToken.GetValue()[(0)]); Match(Token.Type.CharLiteral); return(v); } else { Error("unknown token Type for literal! Token value: " + currentToken.GetValue()); } } catch (Exception e) { Error("Inavlid number format " + e.Message); } return(null); }
public static Value Interpret(Binary b, Functions funcs, State state) { Operator op = b.Operator(); Value v1 = Interpret(b.Term1(), funcs, state); Value v2 = Interpret(b.Term2(), funcs, state); StaticTypeCheck.Check(!v1.Undefined() || !v2.Undefined(), "reference to undef value in binary op"); if (op.IsArithmeticOp()) { if (v1.Type() == Type.INT && v1.Type() == Type.INT) { if (op.val.Equals(Operator.PLUS)) { return(new IntValue(v1.DIntValue() + v2.DIntValue())); } if (op.val.Equals(Operator.MINUS)) { return(new IntValue(v1.DIntValue() - v2.DIntValue())); } if (op.val.Equals(Operator.TIMES)) { return(new IntValue(v1.DIntValue() * v2.DIntValue())); } if (op.val.Equals(Operator.DIV)) { return(new IntValue(v1.DIntValue() / v2.DIntValue())); } } else if (v1.Type() == Type.FLOAT && v2.Type() == Type.FLOAT) { if (op.val.Equals(Operator.PLUS)) { return(new FloatValue(v1.DFloatValue() + v2.DFloatValue())); } if (op.val.Equals(Operator.MINUS)) { return(new FloatValue(v1.DFloatValue() - v2.DFloatValue())); } if (op.val.Equals(Operator.TIMES)) { return(new FloatValue(v1.DFloatValue() * v2.DFloatValue())); } if (op.val.Equals(Operator.DIV)) { return(new FloatValue(v1.DFloatValue() / v2.DFloatValue())); } } else if ((v1.Type() == Type.INT && v2.Type() == Type.FLOAT) || (v1.Type() == Type.FLOAT && v2.Type() == Type.INT)) { if (v1.Type() == Type.INT) { v1 = new FloatValue((float)v1.DIntValue()); } else if (v2.Type() == Type.INT) { v2 = new FloatValue((float)v2.DIntValue()); } return(Interpret(new Binary(op, v1, v2), funcs, state)); } else { throw new IException("Attemped arithmetic op on a " + v1.Type() + " and a " + v2.Type() + ", not allowed (v1: " + v1 + " v2: " + v2 + ")", "", "Semantic", 0, 0); } } else if (op.IsBooleanOp()) { if (!(v1.Type() == Type.BOOL && v1.Type() == Type.BOOL)) { throw new IException("Attemped boolean op on " + v1.Type() + ", not allowed", "", "Semantic", 0, 0); } else { if (op.val.Equals(Operator.AND)) { return(new BoolValue(v1.DBoolValue() && v2.DBoolValue())); } else if (op.val.Equals(Operator.OR)) { return(new BoolValue(v1.DBoolValue() || v2.DBoolValue())); } } } else if (op.IsRelationalOp()) { if (v1.Type() == Type.INT && v1.Type() == Type.INT) { if (op.val.Equals(Operator.LT)) { return(new BoolValue(v1.DIntValue() < v2.DIntValue())); } else if (op.val.Equals(Operator.GT)) { return(new BoolValue(v1.DIntValue() > v2.DIntValue())); } else if (op.val.Equals(Operator.LE)) { return(new BoolValue(v1.DIntValue() <= v2.DIntValue())); } else if (op.val.Equals(Operator.GE)) { return(new BoolValue(v1.DIntValue() >= v2.DIntValue())); } else if (op.val.Equals(Operator.EQ)) { return(new BoolValue(v1.DIntValue() == v2.DIntValue())); } else if (op.val.Equals(Operator.NE)) { return(new BoolValue(v1.DIntValue() != v2.DIntValue())); } } else if (v1.Type() == Type.FLOAT && v1.Type() == Type.FLOAT) { if (op.val.Equals(Operator.LT)) { return(new BoolValue(v1.DFloatValue() < v2.DFloatValue())); } else if (op.val.Equals(Operator.GT)) { return(new BoolValue(v1.DFloatValue() > v2.DFloatValue())); } else if (op.val.Equals(Operator.LE)) { return(new BoolValue(v1.DFloatValue() <= v2.DFloatValue())); } else if (op.val.Equals(Operator.GE)) { return(new BoolValue(v1.DFloatValue() >= v2.DFloatValue())); } else if (op.val.Equals(Operator.EQ)) { return(new BoolValue(v1.DFloatValue() == v2.DFloatValue())); } else if (op.val.Equals(Operator.NE)) { return(new BoolValue(v1.DFloatValue() != v2.DFloatValue())); } } else if ((v1.Type() == Type.INT && v2.Type() == Type.FLOAT) || (v1.Type() == Type.FLOAT && v2.Type() == Type.INT)) { if (v1.Type() == Type.INT) { v1 = new FloatValue((float)v1.DIntValue()); } else if (v2.Type() == Type.INT) { v2 = new FloatValue((float)v2.DIntValue()); } return(Interpret(new Binary(op, v1, v2), funcs, state)); } else if (v1.Type() == Type.CHAR && v2.Type() == Type.CHAR) { if (op.val.Equals(Operator.LT)) { return(new BoolValue(v1.DCharValue() < v2.DCharValue())); } else if (op.val.Equals(Operator.GT)) { return(new BoolValue(v1.DCharValue() > v2.DCharValue())); } else if (op.val.Equals(Operator.LE)) { return(new BoolValue(v1.DCharValue() <= v2.DCharValue())); } else if (op.val.Equals(Operator.GE)) { return(new BoolValue(v1.DCharValue() >= v2.DCharValue())); } else if (op.val.Equals(Operator.EQ)) { return(new BoolValue(v1.DCharValue() == v2.DCharValue())); } else if (op.val.Equals(Operator.NE)) { return(new BoolValue(v1.DCharValue() != v2.DCharValue())); } } else if (v1.Type() == Type.BOOL && v2.Type() == Type.BOOL) { if (op.val.Equals(Operator.EQ)) { return(new BoolValue(v1.DBoolValue() == v2.DBoolValue())); } else if (op.val.Equals(Operator.NE)) { return(new BoolValue(v1.DBoolValue() != v2.DBoolValue())); } else { throw new IException("Attempted illegal relational op " + op + " on two booleans (v1: " + v1 + " v2: " + v2 + ")", "", "Semantic", 0, 0); } } else { throw new IException("Attemped relational op on a " + v1.Type() + " and a " + v2.Type() + ", not allowed (v1: " + v1 + " v2: " + v2 + ")", "", "Semantic", 0, 0); } } throw new IException("Semantic Error: (in DynamicTyping.ApplyBinary)", "", "Semantic", 0, 0); }