Ejemplo n.º 1
0
        public Type Visit(TypeDeclaration typeDeclaration)
        {
            foreach (var arg in ((FormalList)typeDeclaration.flist).list)
            {
                Environment.VariableType.Add(arg.id, (Type)arg.type);
            }
            if (typeDeclaration.stmt == null)
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_3, typeDeclaration));
            }


            if (((Type)typeDeclaration.type).GetType().Name == "IntType")
            {
                Environment.ReturnType = new IntType();
            }
            else
            {
                Environment.ReturnType = new BoolType();
            }

            typeDeclaration.stmt.Accept(this);

            Environment.ReturnType = null;
            return(null);
        }
Ejemplo n.º 2
0
        public Type Visit(AssignStatement assignStatement)
        {
            if (!Environment.VariableType.ContainsKey(assignStatement.id))
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ID, assignStatement));
            }
            var type      = Environment.VariableType[assignStatement.id];
            var type_text = type.GetType().Name;

            var result = assignStatement.s.Accept(this);

            if (result == null)
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_1, assignStatement));
            }
            var result_type_text = result.GetType().Name;

            if (IsVoidType(result_type_text))
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_1, assignStatement));
            }
            if (result_type_text != type_text)
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_2, assignStatement));
            }

            return(type);
        }
Ejemplo n.º 3
0
 public Type Visit(VoidReturn voidReturn)
 {
     if (Environment.ReturnType != null)
     {
         var err = new TypeErrorMessage();
         throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_3, voidReturn));
     }
     return(null);
 }
Ejemplo n.º 4
0
 public Type Visit(Return rreturn)
 {
     if (Environment.ReturnType == null || Environment.ReturnType.GetType() != ((Type)rreturn.e.Accept(this)).GetType())
     {
         var err = new TypeErrorMessage();
         throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_3, rreturn));
     }
     return(null);
 }
Ejemplo n.º 5
0
 public Type Visit(Argument argument)
 {
     if (Environment.VariableType.ContainsKey(argument.id))
     {
         var err = new TypeErrorMessage();
         throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.DECL, argument));
     }
     Environment.VariableType.Add(argument.id, (Type)argument.type);
     return(null);
 }
Ejemplo n.º 6
0
        public Type Visit(WhileStatement whileStatement)
        {
            var guard      = whileStatement.expr.Accept(this);
            var guard_type = guard.GetType().Name;

            if (guard_type != "BoolType")
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.WHILE, whileStatement));
            }

            whileStatement.stmt.Accept(this);
            return(null);
        }
Ejemplo n.º 7
0
        public Type Visit(IfElseStatement ifElseStatement)
        {
            var guard      = ifElseStatement.expr.Accept(this);
            var guard_type = guard.GetType().Name;

            if (guard_type != "BoolType")
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.IF, ifElseStatement));
            }

            ifElseStatement.stmt1.Accept(this);
            ifElseStatement.stmt2.Accept(this);
            return(null);
        }
Ejemplo n.º 8
0
        public Type Visit(NegativeStatement negativeStatement)
        {
            var type      = negativeStatement.s1.Accept(this);
            var type_text = type.GetType().Name;

            if (IsVoidType(type_text))
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ASN_2, negativeStatement));
            }
            if (type_text != "IntType")
            {
                var err = new TypeErrorMessage();
                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.UOP_2, negativeStatement));
            }
            return(type);
        }
Ejemplo n.º 9
0
        public Type 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.GetType().Name == "IntType" && right.GetType().Name == "IntType")
                {
                    return(new IntType());
                }
                else
                {
                    var err = new TypeErrorMessage();
                    throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.BOP_1, binaryOperatorExpression));
                }
            }

            else if (opType == OperatorExpression.LOGICAL)
            {
                if (left.GetType().Name == "BoolType" && right.GetType().Name == "BoolType")
                {
                    return(new BoolType());
                }
                else
                {
                    var err = new TypeErrorMessage();
                    TypeErrorMessage.ErrorCode code = (binaryOperatorExpression.type == BinOperatorStatement.Type.OR) ? TypeErrorMessage.ErrorCode.BOP_2 : TypeErrorMessage.ErrorCode.BOP_3;
                    throw new TypeException(err.ErrorOutput(code, binaryOperatorExpression));
                }
            }
            else if (opType == OperatorExpression.EQUALITY)
            {
                if (left.GetType().Name == "BoolType" && right.GetType().Name == "BoolType")
                {
                    return(new BoolType());
                }
                else if (left.GetType().Name == "IntType" && right.GetType().Name == "IntType")
                {
                    return(new BoolType());
                }
                else
                {
                    var err = new TypeErrorMessage();
                    throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.BOP_4, binaryOperatorExpression));
                }
            }
            else if (opType == OperatorExpression.INEQUALITY)
            {
                if (left.GetType().Name == "IntType" && right.GetType().Name == "IntType")
                {
                    return(new BoolType());
                }
                else
                {
                    var err = new TypeErrorMessage();
                    throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.BOP_5, binaryOperatorExpression));
                }
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 10
0
        public Type Visit(IdentifierStatement identifierStatement)
        {
            if (identifierStatement.list == null)
            {
                if (!Environment.VariableType.ContainsKey(identifierStatement.id))
                {
                    var err = new TypeErrorMessage();
                    throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.ID, identifierStatement));
                }
                return(Environment.VariableType[identifierStatement.id]);
            }
            else
            {
                if (identifierStatement.id == "print")
                {
                    foreach (var e in ((ListStatement)identifierStatement.list).exprs)
                    {
                        var type      = e.Accept(this);
                        var type_text = type.GetType().Name;
                        if (type_text != "BoolType" && type_text != "IntType")
                        {
                            var err = new TypeErrorMessage();
                            throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.CALL_3, identifierStatement));
                        }
                    }
                    return(null);
                }
                else
                {
                    if (!Environment.FuncDeclaration.ContainsKey(identifierStatement.id))
                    {
                        var err = new TypeErrorMessage();
                        throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.CALL_1, identifierStatement));
                    }

                    var function = Environment.FuncDeclaration[identifierStatement.id];

                    if (function.GetType().Name == "VoidDeclaration")
                    {
                        if (((FormalList)((VoidDeclaration)function).flist).list.Count != ((ListStatement)identifierStatement.list).exprs.Count)
                        {
                            var err = new TypeErrorMessage();
                            throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.CALL_2, identifierStatement));
                        }

                        var numOfArgs = ((ListStatement)identifierStatement.list).exprs.Count;

                        for (int i = 0; i < numOfArgs; i++)
                        {
                            var arg = ((FormalList)((VoidDeclaration)function).flist).list[i];
                            var e   = ((ListStatement)identifierStatement.list).exprs[i];
                            if (e.Accept(this).GetType() != arg.type.GetType())
                            {
                                var err = new TypeErrorMessage();
                                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.CALL_3, identifierStatement));
                            }
                        }

                        return(null);
                    }
                    else
                    {
                        if (((FormalList)((TypeDeclaration)function).flist).list.Count != ((ListStatement)identifierStatement.list).exprs.Count)
                        {
                            var err = new TypeErrorMessage();
                            throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.CALL_2, identifierStatement));
                        }

                        var numOfArgs = ((ListStatement)identifierStatement.list).exprs.Count;

                        for (int i = 0; i < numOfArgs; i++)
                        {
                            var arg = ((FormalList)((TypeDeclaration)function).flist).list[i];
                            var e   = ((ListStatement)identifierStatement.list).exprs[i];
                            if (e.Accept(this).GetType() != arg.type.GetType())
                            {
                                var err = new TypeErrorMessage();
                                throw new TypeException(err.ErrorOutput(TypeErrorMessage.ErrorCode.CALL_3, identifierStatement));
                            }
                        }

                        return((Type)((TypeDeclaration)function).type);
                    }
                }
            }
        }