public override void Visit(ExpressionNode node) { _symbolTable.SetCurrentNode(node); // Check if its a string everything should be cast to: if (node.ExpressionParts.Where(x => x.Type != null && x.Type_enum == AllType.STRING).Count() > 0) { node.OverAllType = AllType.STRING; foreach (var item in node.ExpressionParts) { if (item is VariableNode varNode) { _symbolTable.RetrieveSymbol(item.Name, out bool isCollection); if (isCollection) { _symbolTable.CollectionInExpression(); } } if (item is OperatorNode opNode) { if (opNode.Operator != "+") { _symbolTable.IlligalOperator(opNode.Operator); } } else if (item is ExpressionNode) { item.Accept(this); } } } foreach (var item in node.ExpressionParts.Where(x => x is OperatorNode)) { item.Accept(this); if (item is ExpressionNode) { item.Type = ((ExpressionNode)item).OverAllType.ToString().ToLower(); } if (node.OverAllType == AllType.UNKNOWNTYPE || node.OverAllType == null) { node.OverAllType = item.Type_enum; } CheckAllowedCast(item.Type_enum, node.OverAllType ?? AllType.UNKNOWNTYPE, out node.OverAllType, true); } if (node.Type_enum == AllType.UNKNOWNTYPE) { node.Type = node.OverAllType.ToString().ToLower(); } }