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); } }