Example #1
0
        private bool VisitArethetic(ASTBinaryNode node)
        {
            if (!Visit(node.Left, node.Right))
            {
                return(false);
            }
            var left  = node.Left.TypeInfo;
            var right = node.Right.TypeInfo;

            if (CanImplecitCast(left, right))
            {
                node.TypeInfo = right;
            }
            else if (CanImplecitCast(right, left))
            {
                node.TypeInfo = left;
            }

            if (node.TypeInfo is IntegerType || node.TypeInfo is FloatType)
            {
                return(true);
            }

            Error(node.Position, $"Cannot add {left} and {right}");
            return(false);
        }
Example #2
0
        private bool VisitAndOr(ASTBinaryNode node)
        {
            if (!Visit(node.Left, node.Right))
            {
                return(false);
            }
            var left  = node.Left.TypeInfo;
            var right = node.Right.TypeInfo;

            if (!(left is BooleanType && right is BooleanType))
            {
                Error(node.Position, $"Cannot add {left} and {right}");
                return(false);
            }

            node.TypeInfo = left;
            return(true);
        }
Example #3
0
        private bool EmitBinary <T>(ASTBinaryNode node) where T : CBinary, new()
        {
            if (!Visit(node.Left))
            {
                return(false);
            }
            var left = _lastNode;

            if (!Visit(node.Right))
            {
                return(false);
            }
            var right = _lastNode;

            _lastNode = new T {
                Left = left, Right = right
            };
            return(true);
        }