コード例 #1
0
        public override SemanticCheckResult VisitAssignment(ASTAssingmentNode Assingment)
        {
            Assingment.SemanticCheckResult.Ensure(!Types.IsSelf(Assingment.Id.Name),
                                                  new Lazy <Error>(() => new Error($"Not allowed to assign {Assingment.Id.Name}.", ErrorKind.SemanticError, Assingment.Id.Token.Line, Assingment.Id.Token.Column)));
            var expresult = Assingment.Expresion.Accept(this);
            var idResult  = Assingment.Id.Accept(this);

            Assingment.SemanticCheckResult.Ensure(idResult);
            Assingment.SemanticCheckResult.Ensure(expresult, expresult.Type.IsIt(idResult.Type),
                                                  new Lazy <Error>(() => new Error($"Type {expresult.Type} is not subtype of {idResult.Type}.", ErrorKind.TypeError, Assingment.AssigmentToken.Line, Assingment.AssigmentToken.Column)));
            Assingment.SemanticCheckResult.EnsureReturnType(expresult.Type);
            return(Assingment.SemanticCheckResult);
        }
        public override ASTNode VisitAssignment([NotNull] SuperCOOLParser.AssignmentContext context)
        {
            var result            = new ASTAssingmentNode();
            ASTExpressionNode exp = (ASTExpressionNode)context.expression().Accept(this);

            AssignSymbolTable(exp);
            ASTIdNode id = new ASTIdNode()
            {
                Token = context.OBJECTID().Symbol
            };

            AssignSymbolTable(id);
            result.Id             = id;
            result.Expresion      = exp;
            result.AssigmentToken = context.ASSIGNMENT().Symbol;
            return(result);
        }
コード例 #3
0
        public ASTCILNode VisitAssignment(ASTAssingmentNode Assigment)
        {
            Assigment.SymbolTable.IsDefObject(Assigment.Id.Name, out var symbolInfo);
            var exp = (ASTCILExpressionNode)Assigment.Expresion.Accept(this);

            if (symbolInfo.Type == Types.Object &&
                (Assigment.Expresion.SemanticCheckResult.Type == compilationUnit.TypeEnvironment.Bool || Assigment.Expresion.SemanticCheckResult.Type == compilationUnit.TypeEnvironment.Int))
            {
                return(symbolInfo.Kind == ObjectKind.Atribute
                     ? (ASTCILNode) new ASTCILSetAttributeNode(symbolInfo,
                                                               new ASTCILBoxingNode(exp, Assigment.Expresion.SemanticCheckResult.Type))
                     : new ASTCILAssignmentNode(symbolInfo,
                                                new ASTCILBoxingNode(exp, Assigment.Expresion.SemanticCheckResult.Type)));
            }

            return(symbolInfo.Kind == ObjectKind.Atribute
                ? (ASTCILNode) new ASTCILSetAttributeNode(symbolInfo, exp)
                : new ASTCILAssignmentNode(symbolInfo, exp));
        }
 public virtual T VisitAssignment(ASTAssingmentNode Assigment)
 {
     Assigment.Id.Accept(this);
     Assigment.Expresion.Accept(this);
     return(default(T));
 }