Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }