Exemplo n.º 1
0
        public IValue Visit(NotStatement notStatement)
        {
            IValue result = notStatement.s1.Accept(this);

            if (result.Type != ValueType.Bool)
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.UOP_1, notStatement));
            }
            var x = ((BoolValue)result).Bool;

            return(new BoolValue(!x));
        }
Exemplo n.º 2
0
        public IValue Visit(NegativeStatement negativeStatement)
        {
            var result = negativeStatement.s1.Accept(this);
            var x      = ((NumberValue)result).Number;

            if (result.Type != ValueType.Number)
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.UOP_1, negativeStatement));
            }

            return(new NumberValue(0 - x));
        }
Exemplo n.º 3
0
 public IValue Visit(TypeDeclaration typeDeclaration)
 {
     //Console.WriteLine("TypeFunc STATEMENT");
     if (typeDeclaration.stmt != null)
     {
         typeDeclaration.stmt.Accept(this);
     }
     else
     {
         var err = new ErrorMessage();
         throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.CALL_3, typeDeclaration));
     }
     return(null);// pointer;
 }
Exemplo n.º 4
0
        // ---

        public IValue Visit(IfStatement ifStatement)
        {
            var guard = ifStatement.expr.Accept(this);

            if (guard.Type == ValueType.Bool)
            {
                if (((BoolValue)guard).Bool == true)
                {
                    return(ifStatement.stmt.Accept(this));
                }
                return(null);
            }
            else
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.IF, ifStatement));
            }
        }
Exemplo n.º 5
0
        public IValue Visit(WhileStatement whileStatement)
        {
            var guard = whileStatement.expr.Accept(this);

            if (guard.Type == ValueType.Bool)
            {
                while (((BoolValue)guard).Bool != false)
                {
                    whileStatement.stmt.Accept(this);
                    guard = whileStatement.expr.Accept(this);
                }
                return(null);
            }

            else
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.WHILE, whileStatement));
            }
        }
Exemplo n.º 6
0
        public IValue Visit(Argument argument)
        {
            //var current = Environment.GetCurrentFrame();
            //Console.WriteLine("ARGUMENT STATEMENT");
            if (Environment.ContainsVarInCurrCall(argument.id))
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.DECL, argument));
            }

            var    typeName = ((Syntax.Type)argument.type).GetType().Name;
            IValue value    = new NumberValue(0);

            if (typeName != "IntType")
            {
                value = new BoolValue(false);
            }
            Environment.AddVar(argument.id, value);

            return(null); // new PointerValue(0);
        }
Exemplo n.º 7
0
        public IValue Visit(AssignStatement assignStatement)
        {
            //Console.WriteLine("ASSIGN STATEMENT");
            if (!Environment.ContainsVarInCurrCall(assignStatement.id))
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.ID, assignStatement));
            }
            IValue result = assignStatement.s.Accept(this);

            if (result.Type == null)
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.ASN_1, assignStatement));
            }
            if (Environment.GetVarValue(assignStatement.id).Type != result.Type)
            {
                var err = new ErrorMessage();
                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.ASN_2, assignStatement));
            }
            Environment.UpdateVar(assignStatement.id, result);
            return(result);
        }
Exemplo n.º 8
0
        // ---

        public IValue Visit(BinOperatorStatement binaryOperatorExpression)
        {
            var left  = binaryOperatorExpression.left.Accept(this);
            var right = binaryOperatorExpression.right.Accept(this);

            var opType = MapOpExpr[binaryOperatorExpression.type];


            if (opType == OperatorExpression.INTEGER)
            {
                if (left.Type == ValueType.Number && right.Type == ValueType.Number)
                {
                    var x = ((NumberValue)left).Number;
                    var y = ((NumberValue)right).Number;
                    switch (binaryOperatorExpression.type)
                    {
                    case BinOperatorStatement.Type.ADD:
                        return(new NumberValue(x + y));

                    case BinOperatorStatement.Type.SUB:
                        return(new NumberValue(x - y));

                    case BinOperatorStatement.Type.MUL:
                        return(new NumberValue(x * y));

                    case BinOperatorStatement.Type.DIV:
                        return(new NumberValue(x / y));
                    }
                }
                else
                {
                    var err = new ErrorMessage();
                    throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.BOP_1, binaryOperatorExpression));
                }
            }
            else if (opType == OperatorExpression.LOGICAL)
            {
                if (left.Type == ValueType.Bool && right.Type == ValueType.Bool)
                {
                    var x = ((BoolValue)left).Bool;
                    var y = ((BoolValue)right).Bool;
                    switch (binaryOperatorExpression.type)
                    {
                    case BinOperatorStatement.Type.AND:
                        return(new BoolValue(x && y));

                    case BinOperatorStatement.Type.OR:
                        return(new BoolValue(x || y));
                    }
                }
                else
                {
                    var err = new ErrorMessage();
                    ErrorMessage.ErrorCode code = (binaryOperatorExpression.type == BinOperatorStatement.Type.OR) ? ErrorMessage.ErrorCode.BOP_2 : ErrorMessage.ErrorCode.BOP_3;
                    throw new EvaluationError(err.ErrorOutput(code, binaryOperatorExpression));
                }
            }
            else if (opType == OperatorExpression.EQUALITY)
            {
                if (left.Type == ValueType.Number && right.Type == ValueType.Number)
                {
                    var x = ((NumberValue)left).Number;
                    var y = ((NumberValue)right).Number;
                    switch (binaryOperatorExpression.type)
                    {
                    case BinOperatorStatement.Type.EQ:
                        return(new BoolValue(x == y));

                    case BinOperatorStatement.Type.NEQ:
                        return(new BoolValue(x != y));
                    }
                }
                else if (left.Type == ValueType.Bool && right.Type == ValueType.Bool)
                {
                    var x = ((BoolValue)left).Bool;
                    var y = ((BoolValue)right).Bool;
                    switch (binaryOperatorExpression.type)
                    {
                    case BinOperatorStatement.Type.EQ:
                        return(new BoolValue(x == y));

                    case BinOperatorStatement.Type.NEQ:
                        return(new BoolValue(x != y));
                    }
                }
                else
                {
                    var err = new ErrorMessage();
                    throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.BOP_4, binaryOperatorExpression));
                }
            }
            else if (opType == OperatorExpression.INEQUALITY)
            {
                if (left.Type == ValueType.Number && right.Type == ValueType.Number)
                {
                    var x = ((NumberValue)left).Number;
                    var y = ((NumberValue)right).Number;

                    switch (binaryOperatorExpression.type)
                    {
                    case BinOperatorStatement.Type.GR:
                        return(new BoolValue(x > y));

                    case BinOperatorStatement.Type.LE:
                        return(new BoolValue(x < y));

                    case BinOperatorStatement.Type.GEQ:
                        return(new BoolValue(x >= y));

                    case BinOperatorStatement.Type.LEQ:
                        return(new BoolValue(x <= y));
                    }
                }
                else
                {
                    var err = new ErrorMessage();
                    throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.BOP_5, binaryOperatorExpression));
                }
            }
            else
            {
                return(null);
                //error
            }

            return(null);
        }
Exemplo n.º 9
0
        public IValue Visit(IdentifierStatement identifierStatement)
        {
            //Console.WriteLine("IDENTIFIER STATEMENT");
            if (identifierStatement.list == null)
            {
                if (!Environment.ContainsVarInCurrCall(identifierStatement.id))
                {
                    var err = new ErrorMessage();
                    throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.ID, identifierStatement));
                }
                //identifierStatement.id.Accept(this);
                return(Environment.GetVarValue(identifierStatement.id));
            }
            else // if it is a function call
            {
                if (identifierStatement.id == "print")
                {
                    //Print
                    foreach (var e in ((ListStatement)identifierStatement.list).exprs)
                    {
                        Console.Write(((IValue)e.Accept(this)).ToString() + " ");
                    }
                    Console.Write("\n");
                    return(null);
                }
                else
                {
                    if (!Environment.FunctionDict.ContainsKey(identifierStatement.id))
                    {
                        var err = new ErrorMessage();
                        throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.CALL_1, identifierStatement));
                    }
                    else
                    {
                        var info = Environment.FunctionDict[identifierStatement.id];
                        if (info.Item2 == true) // If void function
                        {
                            var function = (VoidDeclaration)Environment.FunctionDict[identifierStatement.id].Item1;
                            var numOfArg = (function.flist == null) ? 0 : ((FormalList)function.flist).list.Count;
                            if (((ListStatement)identifierStatement.list).exprs.Count != numOfArg)
                            {
                                var err = new ErrorMessage();
                                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.CALL_2, identifierStatement));
                            }
                            else
                            {
                                var parameters = new Dictionary <string, IValue>();
                                for (int i = 0; i < ((ListStatement)identifierStatement.list).exprs.Count; i++)
                                {
                                    parameters.Add(((FormalList)function.flist).list[i].id, ((ListStatement)identifierStatement.list).exprs[i].Accept(this));
                                }
                                Environment.CallFunction(parameters);
                                function.Accept(this);
                                //ovde treba pop value
                                Environment.PopFunction();
                                var result = Environment.ReturnValue;
                                Environment.ReturnValue = null;
                                return(result);
                            }
                        }
                        else // if type function
                        {
                            var function = (TypeDeclaration)Environment.FunctionDict[identifierStatement.id].Item1;
                            var numOfArg = (function.flist == null) ? 0 : ((FormalList)function.flist).list.Count;
                            if (((ListStatement)identifierStatement.list).exprs.Count != numOfArg)
                            {
                                var err = new ErrorMessage();
                                throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.CALL_2, identifierStatement));
                            }
                            else
                            {
                                var parameters = new Dictionary <string, IValue>();
                                for (int i = 0; i < ((ListStatement)identifierStatement.list).exprs.Count; i++)
                                {
                                    parameters.Add(((FormalList)function.flist).list[i].id, ((ListStatement)identifierStatement.list).exprs[i].Accept(this));
                                }

                                Environment.CallFunction(parameters);

                                function.Accept(this);
                                //ovde treba pop value
                                Environment.PopFunction();
                                var result = Environment.ReturnValue;
                                Environment.ReturnValue = null;
                                var funcType = (function.type.GetType().Name == "IntType") ? ValueType.Number : ValueType.Bool;
                                if (result == null || result.Type != funcType)
                                {
                                    var err = new ErrorMessage();
                                    throw new EvaluationError(err.ErrorOutput(ErrorMessage.ErrorCode.CALL_3, identifierStatement));
                                }
                                return(result);
                            }
                        }
                    }
                }
            }
        }