示例#1
0
        public override void Visit(BoolComparisonNode node)
        {
            //VisitChildren(node);
            _symbolTable.SetCurrentNode(node);
            if (node.Left != null && node.Right != null)
            {
                // Check if the nodes are boolcomparisons
                if (node.Left is BoolComparisonNode && node.Right is BoolComparisonNode)
                {
                    node.Left.Accept(this);
                    node.LeftType = node.Left.Type_enum;
                    node.Right.Accept(this);
                    node.RightType = node.Right.Type_enum;
                }
                if (node.HasChildren)
                {
                    // Extract the type from Left and right sides of a bool comparison

                    if (node.Left is ExpressionNode)
                    {
                        node.LeftType = ((ExpressionNode)node.Left).OverAllType ?? default(AllType);
                    }
                    else if (node.Left.Children[0] is PredicateNode)
                    {
                        node.LeftType = _symbolTable.RetrieveSymbol(node.Left.Children[0].Name) ?? default(AllType);
                    }
                    else if (node.Left is BoolComparisonNode)
                    {
                        node.LeftType = ((ExpressionNode)node.Left.Children[0]).OverAllType ?? default(AllType);
                    }

                    if (node.Right is ExpressionNode)
                    {
                        node.RightType = ((ExpressionNode)node.Right).OverAllType ?? default(AllType);
                    }
                    else if (node.Right.Children[0] is PredicateNode)
                    {
                        node.RightType = _symbolTable.RetrieveSymbol(node.Right.Children[0].Name) ?? default(AllType);
                    }
                    else if (node.Right is BoolComparisonNode)
                    {
                        node.RightType = ((ExpressionNode)node.Right.Children[0]).OverAllType ?? default(AllType);
                    }
                }
                if (node.RightType != AllType.UNKNOWNTYPE && node.LeftType != AllType.UNKNOWNTYPE)
                {
                    if (node.RightType != node.LeftType)
                    {
                        if (!((node.RightType == AllType.INT && node.LeftType == AllType.DECIMAL) || (node.RightType == AllType.DECIMAL && node.LeftType == AllType.INT)))
                        {
                            _symbolTable.WrongTypeConditionError();
                        }
                    }
                }
            }
            else
            {
                VisitChildren(node);
            }
        }