示例#1
0
        public void Visit(DispatchExpNode node)
        {
            node.initDis.Accept(this);
            if (node.initType.Text == "Object")
            {
                node.initType = new TypeNode(node.initDis.line, node.initDis.column, node.initDis.staticType.Text);
            }

            if (!scope.IsDefinedType(node.initType.Text, out TypeInfo typeSuperClass))
            {
                errors.Add(ErrorSemantic.NotDeclaredType(node.initType));
            }

            if (!(node.initDis.staticType <= typeSuperClass))
            {
                errors.Add(ErrorSemantic.CannotConvert(node, node.initDis.staticType, typeSuperClass));
            }

            node.paramFormal.ForEach(x => x.Accept(this));

            var scopeSuperClass = typeSuperClass.ClassReference.Scope;

            if (!(scopeSuperClass.IsDefined(node.Id.text, node.paramFormal.Select(x => x.staticType).ToArray(), out node.staticType)))
            {
                errors.Add(ErrorSemantic.NotDeclareFunction(node, node.Id.text));
            }
        }
示例#2
0
        public void Visit(MethodNode node)
        {
            var scopeMethod = scope.CreateChild();

            foreach (var arg in node.paramsFormal)
            {
                if (!scope.IsDefinedType(arg.type.Text, out TypeInfo typeArg))
                {
                    errors.Add(ErrorSemantic.NotDeclaredType(arg.type));
                }
                scopeMethod.Define(arg.id.text, typeArg);
            }

            if (!scope.IsDefinedType(node.return_type.Text, out TypeInfo type))
            {
                errors.Add(ErrorSemantic.NotDeclaredType(node.return_type));
            }

            scope.Define(node.id.text, node.paramsFormal.Select(x => scope.GetType(x.type.Text)).ToArray(), type);

            node.body_expr.Accept(new SemanticVisit(errors, scopeMethod));

            if (!(node.body_expr.staticType <= type))
            {
                errors.Add(ErrorSemantic.CannotConvert(node.body_expr, node.body_expr.staticType, type));
            }

            node.return_type = new TypeNode(node.body_expr.line, node.body_expr.column, type.Text);
        }
示例#3
0
        public void Visit(LetInNode node)
        {
            var scopeLet = scope.CreateChild();

            foreach (var expInit in node.propertyLet)
            {
                expInit.expr_body.Accept(new SemanticVisit(errors, scopeLet));
                var typeAssignExp = expInit.expr_body.staticType;

                if (!scopeLet.IsDefinedType(expInit.formal.type.Text, out TypeInfo typeDeclared))
                {
                    errors.Add(ErrorSemantic.NotDeclaredType(expInit.formal.type));
                }

                if (!(typeAssignExp <= typeDeclared))
                {
                    errors.Add(ErrorSemantic.CannotConvert(expInit.formal.type, typeAssignExp, typeDeclared));
                }

                if (scopeLet.IsDefined(expInit.formal.id.text, out TypeInfo typeOld))
                {
                    scopeLet.UpdateType(expInit.formal.id.text, typeDeclared);
                }
                else
                {
                    scopeLet.Define(expInit.formal.id.text, typeDeclared);
                }
            }

            node.exprBody.Accept(new SemanticVisit(errors, scopeLet));
            node.staticType = node.exprBody.staticType;
        }
示例#4
0
        public void Visit(ConditionalNode node)
        {
            node.If.Accept(this);
            node.Then.Accept(this);
            node.Else.Accept(this);

            if (node.If.staticType.Text != "Bool")
            {
                errors.Add(ErrorSemantic.CannotConvert(node.If, node.If.staticType, scope.GetType("Bool")));
            }

            node.staticType = SemanticAlgorithm.LowerCommonAncestor(node.Then.staticType, node.Else.staticType);
        }
示例#5
0
        public void Visit(WhileNode node)
        {
            node.condition.Accept(this);
            node.loop_body.Accept(this);

            if (node.condition.staticType.Text != "Bool")
            {
                errors.Add(ErrorSemantic.CannotConvert(node.condition, node.condition.staticType, scope.GetType("Bool")));
            }

            if (!scope.IsDefinedType("Object", out node.staticType))
            {
                errors.Add(ErrorSemantic.NotDeclaredType(new TypeNode(node.line, node.column, "Object")));
            }
        }
示例#6
0
        public void Visit(AssignNode node)
        {
            node.exprBody.Accept(this);

            if (!scope.IsDefined(node.Id.text, out TypeInfo type))
            {
                errors.Add(ErrorSemantic.NotDeclaredVariable(node.Id));
            }

            if (!(node.exprBody.staticType <= type))
            {
                errors.Add(ErrorSemantic.CannotConvert(node, node.exprBody.staticType, type));
            }

            node.staticType = node.exprBody.staticType;
        }
示例#7
0
        public void Visit(PropertyNode node)
        {
            node.expr_body.Accept(this);
            var typebodyExpr = node.expr_body.staticType;

            if (!scope.IsDefinedType(node.formal.type.Text, out TypeInfo typeDeclared))
            {
                errors.Add(ErrorSemantic.NotDeclaredType(node.formal.type));
            }

            if (!(typebodyExpr <= typeDeclared))
            {
                errors.Add(ErrorSemantic.CannotConvert(node.formal.type, typebodyExpr, typeDeclared));
            }

            scope.Define(node.formal.id.text, typeDeclared);
        }