Пример #1
0
        public override AstNode Visit(DereferenceOperation node)
        {
            // Evaluate the pointer.
            Expression pointerExpr = node.GetPointer();
            pointerExpr.Accept(this);

            // Get the pointer type.
            IChelaType pointerType = pointerExpr.GetNodeType();
            if(pointerType.IsReference())
                pointerType = DeReferenceType(pointerType);

            // Constant pointer aren't problems.
            if(pointerType.IsConstant())
                pointerType = DeConstType(pointerType);

            // Must be a pointer.
            if(!pointerType.IsPointer())
                Error(node, "expected pointer expression.");

            // Set the coercion type.
            node.SetCoercionType(pointerType);

            // Create the "variable".
            IChelaType slotType = DePointerType(pointerType);
            PointedSlot slot = new PointedSlot(slotType);
            node.SetNodeType(ReferenceType.Create(slotType));
            node.SetNodeValue(slot);

            return node;
        }